feat(SearchDialog): add shift-click functionality to set system destination
This commit is contained in:
@@ -3,7 +3,8 @@ import { useNavigate } from 'react-router-dom';
|
|||||||
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
|
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
|
||||||
import { Input } from '@/components/ui/input';
|
import { Input } from '@/components/ui/input';
|
||||||
import { AhoCorasick } from '@/lib/aho';
|
import { AhoCorasick } from '@/lib/aho';
|
||||||
import { ListSystemsWithRegions } from 'wailsjs/go/main/App';
|
import { ListSystemsWithRegions, SetDestinationForAll, ListCharacters, StartESILogin } from 'wailsjs/go/main/App';
|
||||||
|
import { toast } from '@/hooks/use-toast';
|
||||||
|
|
||||||
interface SearchResult {
|
interface SearchResult {
|
||||||
system: string;
|
system: string;
|
||||||
@@ -80,6 +81,39 @@ export const SearchDialog: React.FC = () => {
|
|||||||
navigate(`/regions/${encodeURIComponent(r.region)}?focus=${encodeURIComponent(r.system)}`);
|
navigate(`/regions/${encodeURIComponent(r.region)}?focus=${encodeURIComponent(r.system)}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ensureAnyLoggedIn = async (): Promise<boolean> => {
|
||||||
|
try {
|
||||||
|
const list = await ListCharacters();
|
||||||
|
if (Array.isArray(list) && list.length > 0) return true;
|
||||||
|
await StartESILogin();
|
||||||
|
toast({ title: 'EVE Login', description: 'Complete login in your browser, then retry.' });
|
||||||
|
return false;
|
||||||
|
} catch (e: any) {
|
||||||
|
await StartESILogin();
|
||||||
|
toast({ title: 'EVE Login', description: 'Complete login in your browser, then retry.', variant: 'destructive' });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleResultClick = async (e: React.MouseEvent, r: SearchResult) => {
|
||||||
|
if (e.shiftKey) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
try {
|
||||||
|
if (!(await ensureAnyLoggedIn())) return;
|
||||||
|
await SetDestinationForAll(r.system, true, false);
|
||||||
|
toast({ title: 'Destination set', description: r.system });
|
||||||
|
} catch (err: any) {
|
||||||
|
toast({ title: 'Failed to set destination', description: String(err), variant: 'destructive' });
|
||||||
|
} finally {
|
||||||
|
setOpen(false);
|
||||||
|
setQuery('');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onSelect(r);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Dialog open={open} onOpenChange={setOpen}>
|
<Dialog open={open} onOpenChange={setOpen}>
|
||||||
<DialogContent className="sm:max-w-lg bg-slate-900/95 border border-purple-500/40 text-white">
|
<DialogContent className="sm:max-w-lg bg-slate-900/95 border border-purple-500/40 text-white">
|
||||||
@@ -102,7 +136,8 @@ export const SearchDialog: React.FC = () => {
|
|||||||
<button
|
<button
|
||||||
key={`${r.region}-${r.system}-${idx}`}
|
key={`${r.region}-${r.system}-${idx}`}
|
||||||
className="w-full text-left p-3 hover:bg-purple-500/20"
|
className="w-full text-left p-3 hover:bg-purple-500/20"
|
||||||
onClick={() => onSelect(r)}
|
onClick={(e) => handleResultClick(e, r)}
|
||||||
|
title="Click to open, Shift+Click to set destination"
|
||||||
>
|
>
|
||||||
<div className="text-sm font-medium">{r.system}</div>
|
<div className="text-sm font-medium">{r.system}</div>
|
||||||
<div className="text-xs text-slate-300">{r.region}</div>
|
<div className="text-xs text-slate-300">{r.region}</div>
|
||||||
|
Reference in New Issue
Block a user