diff --git a/assets/js/hooks/Mapper/components/characters/Characters.tsx b/assets/js/hooks/Mapper/components/characters/Characters.tsx index 8befe96b..3abfe9ce 100644 --- a/assets/js/hooks/Mapper/components/characters/Characters.tsx +++ b/assets/js/hooks/Mapper/components/characters/Characters.tsx @@ -1,14 +1,13 @@ -import { useCallback } from 'react'; -import clsx from 'clsx'; -import { useAutoAnimate } from '@formkit/auto-animate/react'; -import { Commands } from '@/hooks/Mapper/types/mapHandlers.ts'; -import { CharacterTypeRaw } from '@/hooks/Mapper/types'; import { emitMapEvent } from '@/hooks/Mapper/events'; -import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; -import classes from './Characters.module.scss'; import { isDocked } from '@/hooks/Mapper/helpers/isDocked.ts'; +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { CharacterTypeRaw } from '@/hooks/Mapper/types'; +import { Commands, OutCommand } from '@/hooks/Mapper/types/mapHandlers.ts'; +import { useAutoAnimate } from '@formkit/auto-animate/react'; +import clsx from 'clsx'; import { PrimeIcons } from 'primereact/api'; - +import { useCallback } from 'react'; +import classes from './Characters.module.scss'; interface CharactersProps { data: CharacterTypeRaw[]; } @@ -17,13 +16,22 @@ export const Characters = ({ data }: CharactersProps) => { const [parent] = useAutoAnimate(); const { + outCommand, data: { mainCharacterEveId, followingCharacterEveId }, } = useMapRootState(); - const handleSelect = useCallback((character: CharacterTypeRaw) => { + const handleSelect = useCallback(async (character: CharacterTypeRaw) => { + if (!character) { + return; + } + + await outCommand({ + type: OutCommand.startTracking, + data: { character_eve_id: character.eve_id }, + }); emitMapEvent({ name: Commands.centerSystem, - data: character?.location?.solar_system_id?.toString(), + data: character.location?.solar_system_id?.toString(), }); }, []); @@ -37,7 +45,7 @@ export const Characters = ({ data }: CharactersProps) => { className={clsx( 'overflow-hidden relative', 'flex w-[35px] h-[35px] rounded-[4px] border-[1px] border-solid bg-transparent cursor-pointer', - 'transition-colors duration-250', + 'transition-colors duration-250 hover:bg-stone-300/90', { ['border-stone-800/90']: !character.online, ['border-lime-600/70']: character.online, @@ -45,6 +53,18 @@ export const Characters = ({ data }: CharactersProps) => { )} title={character.name} > + {character.tracking_paused && ( + <> + + + )} {mainCharacterEveId === character.eve_id && ( { )} /> )} + {followingCharacterEveId === character.eve_id && ( { const { update } = useMapState(); diff --git a/assets/js/hooks/Mapper/components/map/hooks/api/useMapInit.ts b/assets/js/hooks/Mapper/components/map/hooks/api/useMapInit.ts index 498fc53d..b63a05ad 100644 --- a/assets/js/hooks/Mapper/components/map/hooks/api/useMapInit.ts +++ b/assets/js/hooks/Mapper/components/map/hooks/api/useMapInit.ts @@ -1,8 +1,8 @@ -import { useReactFlow } from 'reactflow'; -import { useCallback, useRef } from 'react'; -import { CommandInit } from '@/hooks/Mapper/types/mapHandlers.ts'; -import { convertConnection2Edge, convertSystem2Node } from '../../helpers'; import { MapData, useMapState } from '@/hooks/Mapper/components/map/MapProvider.tsx'; +import { CommandInit } from '@/hooks/Mapper/types/mapHandlers.ts'; +import { useCallback, useRef } from 'react'; +import { useReactFlow } from 'reactflow'; +import { convertConnection2Edge, convertSystem2Node } from '../../helpers'; export const useMapInit = () => { const rf = useReactFlow(); diff --git a/assets/js/hooks/Mapper/components/topbar/Topbar.tsx b/assets/js/hooks/Mapper/components/topbar/Topbar.tsx index ee0f4b77..3fa3c1f3 100644 --- a/assets/js/hooks/Mapper/components/topbar/Topbar.tsx +++ b/assets/js/hooks/Mapper/components/topbar/Topbar.tsx @@ -1,14 +1,13 @@ -import { Characters } from '../characters/Characters'; -import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; -import { useMemo } from 'react'; -import clsx from 'clsx'; import { sortOnlineFunc } from '@/hooks/Mapper/components/hooks/useGetOwnOnlineCharacters.ts'; +import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { WithChildren } from '@/hooks/Mapper/types/common.ts'; -import { Button } from 'primereact/button'; +import clsx from 'clsx'; +import { useMemo } from 'react'; +import { Characters } from '../characters/Characters'; const Topbar = ({ children }: WithChildren) => { const { - data: { characters, userCharacters, pings }, + data: { characters, userCharacters }, } = useMapRootState(); const charsToShow = useMemo(() => { diff --git a/assets/js/hooks/Mapper/types/mapHandlers.ts b/assets/js/hooks/Mapper/types/mapHandlers.ts index bec33a36..738b5546 100644 --- a/assets/js/hooks/Mapper/types/mapHandlers.ts +++ b/assets/js/hooks/Mapper/types/mapHandlers.ts @@ -1,10 +1,10 @@ -import { SolarSystemRawType, SolarSystemStaticInfoRaw } from '@/hooks/Mapper/types/system.ts'; -import { SolarSystemConnection } from '@/hooks/Mapper/types/connection.ts'; -import { WormholeDataRaw } from '@/hooks/Mapper/types/wormholes.ts'; -import { ActivitySummary, CharacterTypeRaw, TrackingCharacter } from '@/hooks/Mapper/types/character.ts'; -import { RoutesList } from '@/hooks/Mapper/types/routes.ts'; -import { DetailedKill, Kill } from '@/hooks/Mapper/types/kills.ts'; import { CommentType, PingData, SystemSignature, UserPermissions } from '@/hooks/Mapper/types'; +import { ActivitySummary, CharacterTypeRaw, TrackingCharacter } from '@/hooks/Mapper/types/character.ts'; +import { SolarSystemConnection } from '@/hooks/Mapper/types/connection.ts'; +import { DetailedKill, Kill } from '@/hooks/Mapper/types/kills.ts'; +import { RoutesList } from '@/hooks/Mapper/types/routes.ts'; +import { SolarSystemRawType, SolarSystemStaticInfoRaw } from '@/hooks/Mapper/types/system.ts'; +import { WormholeDataRaw } from '@/hooks/Mapper/types/wormholes.ts'; export enum Commands { init = 'init', @@ -260,6 +260,7 @@ export enum OutCommand { updateMainCharacter = 'updateMainCharacter', addPing = 'add_ping', cancelPing = 'cancel_ping', + startTracking = 'startTracking', // Only UI commands openSettings = 'open_settings', diff --git a/lib/wanderer_app/character/tracker_manager_impl.ex b/lib/wanderer_app/character/tracker_manager_impl.ex index 0f2a61f1..4ceaadd0 100644 --- a/lib/wanderer_app/character/tracker_manager_impl.ex +++ b/lib/wanderer_app/character/tracker_manager_impl.ex @@ -119,7 +119,6 @@ defmodule WandererApp.Character.TrackerManager.Impl do {:ok, character_state} = WandererApp.Character.Tracker.update_settings(character_id, track_settings) - WandererApp.Cache.delete("character:#{character_id}:tracking_paused") WandererApp.Character.update_character_state(character_id, character_state) else WandererApp.Cache.insert_or_update( diff --git a/lib/wanderer_app/map/server/map_server_characters_impl.ex b/lib/wanderer_app/map/server/map_server_characters_impl.ex index 22992602..2f86c7ca 100644 --- a/lib/wanderer_app/map/server/map_server_characters_impl.ex +++ b/lib/wanderer_app/map/server/map_server_characters_impl.ex @@ -397,7 +397,7 @@ defmodule WandererApp.Map.Server.CharactersImpl do with {:ok, old_tracking_paused} <- WandererApp.Cache.lookup( "map:#{map_id}:character:#{character_id}:tracking_paused", - true + false ), {:ok, tracking_paused} <- WandererApp.Cache.lookup("character:#{character_id}:tracking_paused", false) do