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