diff --git a/assets/js/hooks/Mapper/common-styles/prime-fixes/fix-tabs.scss b/assets/js/hooks/Mapper/common-styles/prime-fixes/fix-tabs.scss index e815724d..610d0420 100644 --- a/assets/js/hooks/Mapper/common-styles/prime-fixes/fix-tabs.scss +++ b/assets/js/hooks/Mapper/common-styles/prime-fixes/fix-tabs.scss @@ -1,7 +1,7 @@ .vertical-tabs-container { display: flex; width: 100%; - min-height: 300px; + min-height: 400px; .p-tabview { width: 100%; @@ -68,6 +68,28 @@ } } + + &.color-warn { + @apply bg-yellow-600/5 border-r-yellow-600/20; + + &:hover { + @apply bg-yellow-600/10 border-r-yellow-600/40; + } + + + &.p-tabview-selected { + @apply bg-yellow-600/10 border-r-yellow-600; + + .p-tabview-nav-link { + @apply text-yellow-600; + } + + &:hover { + @apply bg-yellow-600/10 border-r-yellow-600; + } + + } + } } } diff --git a/assets/js/hooks/Mapper/components/contexts/ContextMenuSystemMultiple/useContextMenuSystemMultipleHandlers.ts b/assets/js/hooks/Mapper/components/contexts/ContextMenuSystemMultiple/useContextMenuSystemMultipleHandlers.ts index ffa5105f..f79b0bc6 100644 --- a/assets/js/hooks/Mapper/components/contexts/ContextMenuSystemMultiple/useContextMenuSystemMultipleHandlers.ts +++ b/assets/js/hooks/Mapper/components/contexts/ContextMenuSystemMultiple/useContextMenuSystemMultipleHandlers.ts @@ -1,17 +1,24 @@ import { Node } from 'reactflow'; -import { useCallback, useRef, useState } from 'react'; +import { useCallback, useMemo, useRef, useState } from 'react'; import { ContextMenu } from 'primereact/contextmenu'; import { SolarSystemRawType } from '@/hooks/Mapper/types'; import { ctxManager } from '@/hooks/Mapper/utils/contextManager.ts'; import { NodeSelectionMouseHandler } from '@/hooks/Mapper/components/contexts/types.ts'; import { useDeleteSystems } from '@/hooks/Mapper/components/contexts/hooks'; +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; export const useContextMenuSystemMultipleHandlers = () => { + const { + data: { pings }, + } = useMapRootState(); + const contextMenuRef = useRef(null); const [systems, setSystems] = useState[]>(); const { deleteSystems } = useDeleteSystems(); + const ping = useMemo(() => (pings.length === 1 ? pings[0] : undefined), [pings]); + const handleSystemMultipleContext: NodeSelectionMouseHandler = (ev, systems_) => { setSystems(systems_); ev.preventDefault(); @@ -24,13 +31,17 @@ export const useContextMenuSystemMultipleHandlers = () => { return; } - const sysToDel = systems.filter(x => !x.data.locked).map(x => x.id); + const sysToDel = systems + .filter(x => !x.data.locked) + .filter(x => x.id !== ping?.solar_system_id) + .map(x => x.id); + if (sysToDel.length === 0) { return; } deleteSystems(sysToDel); - }, [deleteSystems, systems]); + }, [deleteSystems, systems, ping]); return { handleSystemMultipleContext, diff --git a/assets/js/hooks/Mapper/components/helpers/parseMapUserSettings.ts b/assets/js/hooks/Mapper/components/helpers/parseMapUserSettings.ts index 532d1b9c..b31f6113 100644 --- a/assets/js/hooks/Mapper/components/helpers/parseMapUserSettings.ts +++ b/assets/js/hooks/Mapper/components/helpers/parseMapUserSettings.ts @@ -1,6 +1,6 @@ import { MapUserSettings, SettingsWithVersion } from '@/hooks/Mapper/mapRootProvider/types.ts'; -const REQUIRED_KEYS = [ +export const REQUIRED_KEYS = [ 'widgets', 'interface', 'onTheMap', diff --git a/assets/js/hooks/Mapper/components/hooks/index.ts b/assets/js/hooks/Mapper/components/hooks/index.ts index f5bba5bd..755e0c26 100644 --- a/assets/js/hooks/Mapper/components/hooks/index.ts +++ b/assets/js/hooks/Mapper/components/hooks/index.ts @@ -1,3 +1,4 @@ export * from './useSystemInfo'; export * from './useGetOwnOnlineCharacters'; export * from './useElementWidth'; +export * from './useDetectSettingsChanged'; diff --git a/assets/js/hooks/Mapper/components/hooks/useDetectSettingsChanged.ts b/assets/js/hooks/Mapper/components/hooks/useDetectSettingsChanged.ts new file mode 100644 index 00000000..f8693d72 --- /dev/null +++ b/assets/js/hooks/Mapper/components/hooks/useDetectSettingsChanged.ts @@ -0,0 +1,23 @@ +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { useEffect, useState } from 'react'; + +export const useDetectSettingsChanged = () => { + const { + storedSettings: { + interfaceSettings, + settingsRoutes, + settingsLocal, + settingsSignatures, + settingsOnTheMap, + settingsKills, + }, + } = useMapRootState(); + const [counter, setCounter] = useState(0); + + useEffect( + () => setCounter(x => x + 1), + [interfaceSettings, settingsRoutes, settingsLocal, settingsSignatures, settingsOnTheMap, settingsKills], + ); + + return counter; +}; diff --git a/assets/js/hooks/Mapper/components/mapInterface/components/Comments/components/MarkdownComment/MarkdownComment.tsx b/assets/js/hooks/Mapper/components/mapInterface/components/Comments/components/MarkdownComment/MarkdownComment.tsx index 029953e5..973e5a92 100644 --- a/assets/js/hooks/Mapper/components/mapInterface/components/Comments/components/MarkdownComment/MarkdownComment.tsx +++ b/assets/js/hooks/Mapper/components/mapInterface/components/Comments/components/MarkdownComment/MarkdownComment.tsx @@ -14,6 +14,7 @@ import { PrimeIcons } from 'primereact/api'; import { ConfirmPopup } from 'primereact/confirmpopup'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { OutCommand } from '@/hooks/Mapper/types'; +import { useConfirmPopup } from '@/hooks/Mapper/hooks'; const TOOLTIP_PROPS = { content: 'Remove comment', position: TooltipPosition.top }; @@ -28,8 +29,7 @@ export const MarkdownComment = ({ text, time, characterEveId, id }: MarkdownComm const char = useGetCacheCharacter(characterEveId); const [hovered, setHovered] = useState(false); - const cpRemoveBtnRef = useRef(); - const [cpRemoveVisible, setCpRemoveVisible] = useState(false); + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); const { outCommand } = useMapRootState(); const ref = useRef({ outCommand, id }); @@ -45,9 +45,6 @@ export const MarkdownComment = ({ text, time, characterEveId, id }: MarkdownComm const handleMouseEnter = useCallback(() => setHovered(true), []); const handleMouseLeave = useCallback(() => setHovered(false), []); - const handleShowCP = useCallback(() => setCpRemoveVisible(true), []); - const handleHideCP = useCallback(() => setCpRemoveVisible(false), []); - return ( <> } {hovered && ( // @ts-ignore -
+
)} @@ -85,9 +82,9 @@ export const MarkdownComment = ({ text, time, characterEveId, id }: MarkdownComm { const toast = useRef(null); const [isShow, setIsShow, isShowRef] = useRefState(false); - - const cpRemoveBtnRef = useRef(); - const [cpRemoveVisible, setCpRemoveVisible] = useState(false); + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); const { storedSettings: { interfaceSettings }, @@ -98,9 +97,6 @@ export const PingsInterface = ({ hasLeftOffset }: PingsInterfaceProps) => { const ping = useMemo(() => (pings.length === 1 ? pings[0] : null), [pings]); - const handleShowCP = useCallback(() => setCpRemoveVisible(true), []); - const handleHideCP = useCallback(() => setCpRemoveVisible(false), []); - const navigateTo = useCallback(() => { if (!ping) { return; @@ -242,11 +238,11 @@ export const PingsInterface = ({ hasLeftOffset }: PingsInterfaceProps) => { /> {/*@ts-ignore*/} -
+
{/* TODO ADD solar system menu*/} @@ -272,9 +268,9 @@ export const PingsInterface = ({ hasLeftOffset }: PingsInterfaceProps) => { /> { header="Map user settings" visible draggable={false} - style={{ width: '550px' }} + style={{ width: '600px' }} onShow={handleShow} onHide={handleHide} > @@ -92,6 +94,14 @@ export const MapSettingsComp = ({ visible, onHide }: MapSettingsProps) => { + + + + + + + +
diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/AdminSettings.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/AdminSettings.tsx new file mode 100644 index 00000000..ab60c5fb --- /dev/null +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/AdminSettings.tsx @@ -0,0 +1,128 @@ +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { Toast } from 'primereact/toast'; +import { Button } from 'primereact/button'; +import { callToastError, callToastSuccess, callToastWarn } from '@/hooks/Mapper/helpers'; +import { OutCommand } from '@/hooks/Mapper/types'; +import { ConfirmPopup } from 'primereact/confirmpopup'; +import { useConfirmPopup } from '@/hooks/Mapper/hooks'; +import { MapUserSettings, RemoteAdminSettingsResponse } from '@/hooks/Mapper/mapRootProvider/types.ts'; +import { parseMapUserSettings } from '@/hooks/Mapper/components/helpers'; +import fastDeepEqual from 'fast-deep-equal'; +import { useDetectSettingsChanged } from '@/hooks/Mapper/components/hooks'; + +export const AdminSettings = () => { + const { + storedSettings: { getSettingsForExport }, + outCommand, + } = useMapRootState(); + + const settingsChanged = useDetectSettingsChanged(); + + const [currentRemoteSettings, setCurrentRemoteSettings] = useState(null); + + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); + const toast = useRef(null); + + const hasSettingsForExport = useMemo(() => !!getSettingsForExport(), [getSettingsForExport]); + + const refVars = useRef({ currentRemoteSettings, getSettingsForExport }); + refVars.current = { currentRemoteSettings, getSettingsForExport }; + + useEffect(() => { + const load = async () => { + let res: RemoteAdminSettingsResponse | undefined; + try { + res = await outCommand({ type: OutCommand.getDefaultSettings, data: null }); + } catch (error) { + // do nothing + } + + if (!res || res.default_settings == null) { + return; + } + + setCurrentRemoteSettings(parseMapUserSettings(res.default_settings)); + }; + + load(); + }, [outCommand]); + + const isDirty = useMemo(() => { + const { currentRemoteSettings, getSettingsForExport } = refVars.current; + const localCurrent = parseMapUserSettings(getSettingsForExport()); + + return !fastDeepEqual(currentRemoteSettings, localCurrent); + // eslint-disable-next-line + }, [settingsChanged, currentRemoteSettings]); + + const handleSync = useCallback(async () => { + const settings = getSettingsForExport(); + + if (!settings) { + callToastWarn(toast.current, 'No settings to save'); + + return; + } + + let response: { success: boolean } | undefined; + + try { + response = await outCommand({ + type: OutCommand.saveDefaultSettings, + data: { settings }, + }); + } catch (err) { + callToastError(toast.current, 'Something went wrong while saving settings'); + console.error('ERROR: ', err); + return; + } + + if (!response || !response.success) { + callToastError(toast.current, 'Settings not saved - dont not why it'); + return; + } + + setCurrentRemoteSettings(parseMapUserSettings(settings)); + + callToastSuccess(toast.current, 'Settings saved successfully'); + }, [getSettingsForExport, outCommand]); + + return ( +
+
+
+
+ + {!isDirty && *Local and remote are identical.} + + + *Will save your current settings as the default for all new users of this map. This action will overwrite any + existing default settings. + +
+ + + + +
+ ); +}; diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/CommonSettings.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/CommonSettings.tsx index 02b72f2b..74a51761 100644 --- a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/CommonSettings.tsx +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/CommonSettings.tsx @@ -7,9 +7,14 @@ import { import { useMapSettings } from '@/hooks/Mapper/components/mapRootContent/components/MapSettings/MapSettingsProvider.tsx'; import { SettingsListItem } from '@/hooks/Mapper/components/mapRootContent/components/MapSettings/types.ts'; import { useCallback } from 'react'; +import { Button } from 'primereact/button'; +import { TooltipPosition, WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit'; +import { ConfirmPopup } from 'primereact/confirmpopup'; +import { useConfirmPopup } from '@/hooks/Mapper/hooks'; export const CommonSettings = () => { const { renderSettingItem } = useMapSettings(); + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); const renderSettingsList = useCallback( (list: SettingsListItem[]) => { @@ -18,6 +23,8 @@ export const CommonSettings = () => { [renderSettingItem], ); + const handleResetSettings = () => {}; + return (
@@ -29,6 +36,33 @@ export const CommonSettings = () => {
{renderSettingItem(MINI_MAP_PLACEMENT)}
{renderSettingItem(PINGS_PLACEMENT)}
{renderSettingItem(THEME_SETTING)}
+ +
+ +
+
+ +
+ +
); }; diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/DefaultSettings.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/DefaultSettings.tsx index edb201b4..b554a48f 100644 --- a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/DefaultSettings.tsx +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/DefaultSettings.tsx @@ -4,74 +4,55 @@ import { Toast } from 'primereact/toast'; import { Button } from 'primereact/button'; import { OutCommand } from '@/hooks/Mapper/types'; import { Divider } from 'primereact/divider'; +import { callToastError, callToastSuccess, callToastWarn } from '@/hooks/Mapper/helpers'; + +type SaveDefaultSettingsReturn = { success: boolean; error: string }; export const DefaultSettings = () => { - const mapRootState = useMapRootState(); - const { getSettingsForExport } = mapRootState.storedSettings || {}; - const { userPermissions } = mapRootState.data || {}; - const { outCommand } = mapRootState; + const { + outCommand, + storedSettings: { getSettingsForExport }, + data: { userPermissions }, + } = useMapRootState(); const [loading, setLoading] = useState(false); const toast = useRef(null); + const refVars = useRef({ getSettingsForExport, outCommand }); + refVars.current = { getSettingsForExport, outCommand }; + const handleSaveAsDefault = useCallback(async () => { - if (!getSettingsForExport) { - console.error('DefaultSettings: getSettingsForExport is not available'); - return; - } - - const settings = getSettingsForExport(); + const settings = refVars.current.getSettingsForExport(); if (!settings) { - toast.current?.show({ - severity: 'warn', - summary: 'Warning', - detail: 'No settings to save', - life: 3000, - }); + callToastWarn(toast.current, 'No settings to save'); return; } + setLoading(true); + + let response: SaveDefaultSettingsReturn; try { - if (!outCommand) { - console.error('DefaultSettings: outCommand is not available'); - return; - } - - setLoading(true); - const response = await outCommand({ + response = await refVars.current.outCommand({ type: OutCommand.saveDefaultSettings, data: { settings }, }); - - if (response.success) { - toast.current?.show({ - severity: 'success', - summary: 'Success', - detail: 'Default settings saved successfully', - life: 3000, - }); - } else { - toast.current?.show({ - severity: 'error', - summary: 'Error', - detail: response.error || 'Failed to save default settings', - life: 5000, - }); - } } catch (error) { console.error('Save default settings error:', error); - toast.current?.show({ - severity: 'error', - summary: 'Error', - detail: 'Failed to save default settings', - life: 3000, - }); - } finally { + callToastError(toast.current, 'Failed to save default settings'); setLoading(false); + return; } - }, [getSettingsForExport, outCommand]); - // Only show for map admins + if (response.success) { + callToastSuccess(toast.current, 'Default settings saved successfully'); + setLoading(false); + return; + } + + callToastError(toast.current, response.error || 'Failed to save default settings'); + setLoading(false); + }, []); + if (!userPermissions?.admin_map) { return null; } @@ -81,7 +62,7 @@ export const DefaultSettings = () => {

Default Settings (Admin Only)

- +
- *Will save your current settings as the default for all new users of this map. This action will overwrite any existing default settings. + *Will save your current settings as the default for all new users of this map. This action will overwrite + any existing default settings.
@@ -105,4 +87,4 @@ export const DefaultSettings = () => {
); -}; \ No newline at end of file +}; diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ImportExport.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ImportExport.tsx index cfe1691d..1a472815 100644 --- a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ImportExport.tsx +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ImportExport.tsx @@ -1,39 +1,16 @@ import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; -import { useCallback, useMemo, useRef, useState } from 'react'; +import { useCallback, useMemo, useRef } from 'react'; import { Toast } from 'primereact/toast'; import { parseMapUserSettings } from '@/hooks/Mapper/components/helpers'; import { saveTextFile } from '@/hooks/Mapper/utils/saveToFile.ts'; import { SplitButton } from 'primereact/splitbutton'; import { loadTextFile } from '@/hooks/Mapper/utils'; -import { DefaultSettings } from './DefaultSettings'; -import { Button } from 'primereact/button'; -import { OutCommand } from '@/hooks/Mapper/types'; -import { ConfirmDialog } from 'primereact/confirmdialog'; - -// Helper function to validate map settings structure -const validateMapSettings = (settings: any): void => { - if (!settings || typeof settings !== 'object') { - throw new Error('Invalid settings format'); - } - - // Check for required top-level properties - const requiredProps = ['killsWidget', 'localWidget', 'widgets', 'routes', 'onTheMap', 'signaturesWidget', 'interface']; - const hasRequiredProps = requiredProps.every(prop => prop in settings); - - if (!hasRequiredProps) { - throw new Error('Settings missing required properties'); - } -}; export const ImportExport = () => { const { storedSettings: { getSettingsForExport, applySettings }, data: { map_slug }, - outCommand, } = useMapRootState(); - - const [showResetConfirm, setShowResetConfirm] = useState(false); - const [resetting, setResetting] = useState(false); const toast = useRef(null); @@ -46,8 +23,6 @@ export const ImportExport = () => { try { const parsed = parseMapUserSettings(text); - validateMapSettings(parsed); - if (applySettings(parsed)) { toast.current?.show({ severity: 'success', @@ -85,8 +60,6 @@ export const ImportExport = () => { const text = await loadTextFile(); const parsed = parseMapUserSettings(text); - validateMapSettings(parsed); - if (applySettings(parsed)) { toast.current?.show({ severity: 'success', @@ -188,86 +161,6 @@ export const ImportExport = () => { [handleExportToFile], ); - const handleResetToDefaults = useCallback(async () => { - try { - setResetting(true); - - // First try to get default settings from server - const response = await outCommand({ - type: OutCommand.getDefaultSettings, - data: null, - }); - - if (response?.default_settings) { - // Apply server default settings - try { - const parsed = parseMapUserSettings(response.default_settings); - validateMapSettings(parsed); - - if (applySettings(parsed)) { - toast.current?.show({ - severity: 'success', - summary: 'Reset Successful', - detail: 'Settings have been reset to map defaults.', - life: 3000, - }); - - setTimeout(() => { - window.dispatchEvent(new Event('resize')); - }, 100); - } else { - toast.current?.show({ - severity: 'warn', - summary: 'Warning', - detail: 'Settings are already at default values.', - life: 3000, - }); - } - } catch (error) { - console.error('Invalid default settings:', error); - toast.current?.show({ - severity: 'error', - summary: 'Error', - detail: 'Default settings are invalid. Using system defaults instead.', - life: 3000, - }); - - // Fall back to clearing settings - const currentSettings = localStorage.getItem('map-user-settings'); - if (currentSettings) { - const parsed = JSON.parse(currentSettings); - delete parsed[map_slug]; - localStorage.setItem('map-user-settings', JSON.stringify(parsed)); - window.location.reload(); - } - } - } else { - // No server defaults, reset to hardcoded defaults - // Clear the settings for this map to trigger default loading - const currentSettings = localStorage.getItem('map-user-settings'); - if (currentSettings) { - const parsed = JSON.parse(currentSettings); - delete parsed[map_slug]; - localStorage.setItem('map-user-settings', JSON.stringify(parsed)); - - // Force reload to apply defaults - window.location.reload(); - } - } - } catch (error) { - console.error('Reset to defaults error:', error); - toast.current?.show({ - severity: 'error', - summary: 'Error', - detail: 'Failed to reset settings to defaults.', - life: 3000, - }); - } finally { - setResetting(false); - setShowResetConfirm(false); - } - }, [applySettings, map_slug, outCommand]); - return (
@@ -303,40 +196,6 @@ export const ImportExport = () => { *Will save map settings to clipboard.
-
-
-
- - - *Will reset all your map settings to the default values. This action cannot be undone. - -
- - - - setShowResetConfirm(false)} - message="Are you sure you want to reset all your settings to the default values? This action cannot be undone." - header="Reset Settings Confirmation" - icon="pi pi-exclamation-triangle" - accept={handleResetToDefaults} - reject={() => setShowResetConfirm(false)} - acceptLabel="Yes, Reset" - rejectLabel="Cancel" - acceptClassName="p-button-danger" - /> -
); diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ServerSettings.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ServerSettings.tsx new file mode 100644 index 00000000..b1ea9182 --- /dev/null +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/ServerSettings.tsx @@ -0,0 +1,97 @@ +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { Toast } from 'primereact/toast'; +import { parseMapUserSettings } from '@/hooks/Mapper/components/helpers'; +import { Button } from 'primereact/button'; +import { OutCommand } from '@/hooks/Mapper/types'; +import { createDefaultWidgetSettings } from '@/hooks/Mapper/mapRootProvider/helpers/createDefaultWidgetSettings.ts'; +import { callToastSuccess } from '@/hooks/Mapper/helpers'; +import { ConfirmPopup } from 'primereact/confirmpopup'; +import { useConfirmPopup } from '@/hooks/Mapper/hooks'; +import { RemoteAdminSettingsResponse } from '@/hooks/Mapper/mapRootProvider/types.ts'; + +export const ServerSettings = () => { + const { + storedSettings: { applySettings }, + outCommand, + } = useMapRootState(); + + const [hasSettings, setHasSettings] = useState(false); + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); + const toast = useRef(null); + + const handleSync = useCallback(async () => { + let res: RemoteAdminSettingsResponse | undefined; + try { + res = await outCommand({ type: OutCommand.getDefaultSettings, data: null }); + } catch (error) { + // do nothing + } + + if (res?.default_settings == null) { + applySettings(createDefaultWidgetSettings()); + return; + } + + try { + applySettings(parseMapUserSettings(res.default_settings)); + callToastSuccess(toast.current, 'Settings synchronized successfully'); + } catch (error) { + applySettings(createDefaultWidgetSettings()); + } + }, [applySettings, outCommand]); + + useEffect(() => { + const load = async () => { + let res: RemoteAdminSettingsResponse | undefined; + try { + res = await outCommand({ type: OutCommand.getDefaultSettings, data: null }); + } catch (error) { + // do nothing + } + + if (res?.default_settings == null) { + return; + } + + setHasSettings(true); + }; + + load(); + }, [outCommand]); + + return ( +
+
+
+
+ {!hasSettings && ( + *Default settings was not set by map administrator. + )} + *Will apply admin settings which set as Default for map. +
+ + + + +
+ ); +}; diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/WidgetsSettings.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/WidgetsSettings.tsx index ed92749d..ac6151c9 100644 --- a/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/WidgetsSettings.tsx +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/MapSettings/components/WidgetsSettings.tsx @@ -28,6 +28,9 @@ export const WidgetsSettings = ({}: WidgetsSettingsProps) => { /> ))}
+ +
+
diff --git a/assets/js/hooks/Mapper/components/mapRootContent/components/OldSettingsDialog.tsx b/assets/js/hooks/Mapper/components/mapRootContent/components/OldSettingsDialog.tsx index fd61df48..ade7c6c2 100644 --- a/assets/js/hooks/Mapper/components/mapRootContent/components/OldSettingsDialog.tsx +++ b/assets/js/hooks/Mapper/components/mapRootContent/components/OldSettingsDialog.tsx @@ -1,7 +1,7 @@ import { Dialog } from 'primereact/dialog'; import { Button } from 'primereact/button'; import { ConfirmPopup } from 'primereact/confirmpopup'; -import { useCallback, useRef, useState } from 'react'; +import { useCallback, useRef } from 'react'; import { MapUserSettings } from '@/hooks/Mapper/mapRootProvider/types.ts'; import { DEFAULT_KILLS_WIDGET_SETTINGS, @@ -15,6 +15,7 @@ import { DEFAULT_SIGNATURE_SETTINGS } from '@/hooks/Mapper/constants/signatures. import { Toast } from 'primereact/toast'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { saveTextFile } from '@/hooks/Mapper/utils'; +import { useConfirmPopup } from '@/hooks/Mapper/hooks'; const createSettings = function (lsSettings: string | null, defaultValues: T) { return { @@ -24,10 +25,7 @@ const createSettings = function (lsSettings: string | null, defaultValues: T) }; export const OldSettingsDialog = () => { - const cpRemoveBtnRef = useRef(); - const [cpRemoveVisible, setCpRemoveVisible] = useState(false); - const handleShowCP = useCallback(() => setCpRemoveVisible(true), []); - const handleHideCP = useCallback(() => setCpRemoveVisible(false), []); + const { cfShow, cfHide, cfVisible, cfRef } = useConfirmPopup(); const toast = useRef(null); const { @@ -143,8 +141,8 @@ export const OldSettingsDialog = () => {