|
|
|
@ -6,14 +6,16 @@ import ResolvedIcon from "./resolvedicon";
|
|
|
|
|
|
|
|
|
|
import { SettingsContext } from "utils/contexts/settings";
|
|
|
|
|
|
|
|
|
|
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions, searchProvider}) {
|
|
|
|
|
export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchProvider}) {
|
|
|
|
|
const { t } = useTranslation();
|
|
|
|
|
const { settings } = useContext(SettingsContext);
|
|
|
|
|
const { searchDescriptions, hideVisitURL } = settings?.quicklaunch ? settings.quicklaunch : { searchDescriptions: false, hideVisitURL: false };
|
|
|
|
|
|
|
|
|
|
const searchField = useRef();
|
|
|
|
|
|
|
|
|
|
const [results, setResults] = useState([]);
|
|
|
|
|
const [currentItemIndex, setCurrentItemIndex] = useState(null);
|
|
|
|
|
const [url, setUrl] = useState(null);
|
|
|
|
|
|
|
|
|
|
function openCurrentItem(newWindow) {
|
|
|
|
|
const result = results[currentItemIndex];
|
|
|
|
@ -29,7 +31,16 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
|
|
|
|
}, [close, setSearchString, setCurrentItemIndex]);
|
|
|
|
|
|
|
|
|
|
function handleSearchChange(event) {
|
|
|
|
|
setSearchString(event.target.value.toLowerCase())
|
|
|
|
|
const rawSearchString = event.target.value.toLowerCase();
|
|
|
|
|
try {
|
|
|
|
|
if (!/.+[.:].+/g.test(rawSearchString)) throw new Error(); // basic test for probably a url
|
|
|
|
|
let urlString = rawSearchString;
|
|
|
|
|
if (urlString.indexOf('http') !== 0) urlString = `https://${rawSearchString}`;
|
|
|
|
|
setUrl(new URL(urlString)); // basic validation
|
|
|
|
|
} catch (e) {
|
|
|
|
|
setUrl(null);
|
|
|
|
|
}
|
|
|
|
|
setSearchString(rawSearchString);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSearchKeyDown(event) {
|
|
|
|
@ -76,6 +87,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
|
|
|
|
if (searchDescriptions) {
|
|
|
|
|
newResults = newResults.sort((a, b) => b.priority - a.priority);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (searchProvider) {
|
|
|
|
|
newResults.push(
|
|
|
|
|
{
|
|
|
|
@ -86,13 +98,23 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hideVisitURL && url) {
|
|
|
|
|
newResults.unshift(
|
|
|
|
|
{
|
|
|
|
|
href: url.toString(),
|
|
|
|
|
name: `${t("quicklaunch.visit")} URL`,
|
|
|
|
|
type: 'url',
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setResults(newResults);
|
|
|
|
|
|
|
|
|
|
if (newResults.length) {
|
|
|
|
|
setCurrentItemIndex(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, [searchString, servicesAndBookmarks, searchDescriptions, searchProvider, t]);
|
|
|
|
|
}, [searchString, servicesAndBookmarks, searchDescriptions, hideVisitURL, searchProvider, url, t]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const [hidden, setHidden] = useState(true);
|
|
|
|
|