diff --git a/src/components/Applications/AppItem.tsx b/src/components/Applications/AppItem.tsx index f2eee7c..1de93de 100644 --- a/src/components/Applications/AppItem.tsx +++ b/src/components/Applications/AppItem.tsx @@ -29,23 +29,12 @@ export function AppItem({ const { ref, width, height } = useElementSize(); const allIcons: any = { ...fa6, ...vsc, ...si }; const Icon = allIcons[icon]; - const { isMobile, theme } = useCommonHooks(); + const { isMobile, filter } = useCommonHooks(); const [textDecoration, setTextDecoration] = useState('none'); const [hover, setHover] = useState(false); const validUrl = url.startsWith('http://') || url.startsWith('https://') ? url : `http://${url}`; - const filter = () => { - if (selectedTheme && selectedTheme.appShadowsEnabled === 1) { - return 'drop-shadow(2px 2px color-mix(in srgb, var(--mantine-color-accent-0), transparent 30%))'; - } - if (!selectedTheme && theme.appShadowsEnabled === 1) { - return 'drop-shadow(2px 2px color-mix(in srgb, var(--mantine-color-accent-0), transparent 30%))'; - } - - return 'none'; - }; - return ( )} diff --git a/src/hooks/useCommonHooks.ts b/src/hooks/useCommonHooks.ts index 01396c4..ac585ed 100644 --- a/src/hooks/useCommonHooks.ts +++ b/src/hooks/useCommonHooks.ts @@ -65,16 +65,27 @@ export function useCommonHooks() { key: 'providerPrefix', defaultValue: '/g', }); + const [defaultProviderIcon, setDefaultProviderIcon] = useLocalStorage({ + key: 'providerIcon', + defaultValue: 'FaGoogle', + }); const [searchValue, setSearchValue] = useState(''); const [providerLabel, setProviderLabel] = useState(defaultProviderLabel); const [providerURL, setProviderURL] = useState(defaultProviderURL); const [providerPrefix, setProviderPrefix] = useState(defaultProviderPrefix); + const [providerIcon, setProviderIcon] = useState(defaultProviderIcon); useEffect(() => { setProviderLabel(defaultProviderLabel); setProviderURL(defaultProviderURL); setProviderPrefix(defaultProviderPrefix); - }, [defaultProviderLabel, defaultProviderURL, defaultProviderPrefix]); + setProviderIcon(defaultProviderIcon); + }, [ + defaultProviderLabel, + defaultProviderURL, + defaultProviderPrefix, + defaultProviderIcon, + ]); const [currentUser, setCurrentUser] = useLocalStorage({ key: 'user', @@ -141,6 +152,17 @@ export function useCommonHooks() { mutateAsync({ method: 'DELETE', endpoint: endpoint, body: item }); }; + const filter = (selectedTheme?: Theme) => { + if (selectedTheme && selectedTheme.appShadowsEnabled === 1) { + return 'drop-shadow(2px 2px color-mix(in srgb, var(--mantine-color-accent-0), transparent 30%))'; + } + if (!selectedTheme && theme.appShadowsEnabled === 1) { + return 'drop-shadow(2px 2px color-mix(in srgb, var(--mantine-color-accent-0), transparent 30%))'; + } + + return 'none'; + }; + function fixDigits(k: number) { if (k < 10) { return `0${k}`; @@ -195,6 +217,7 @@ export function useCommonHooks() { theme, setTheme, urlPattern, + filter, fixDigits, reorder, getObjectDiff, @@ -230,12 +253,16 @@ export function useCommonHooks() { setProviderURL, providerPrefix, setProviderPrefix, + providerIcon, + setProviderIcon, defaultProviderLabel, setDefaultProviderLabel, defaultProviderURL, setDefaultProviderURL, defaultProviderPrefix, setDefaultProviderPrefix, + defaultProviderIcon, + setDefaultProviderIcon, currentUser, setCurrentUser, currentLocation, diff --git a/src/pages/homepage/components/Search/Search.tsx b/src/pages/homepage/components/Search/Search.tsx index 44b2ca0..118dfca 100644 --- a/src/pages/homepage/components/Search/Search.tsx +++ b/src/pages/homepage/components/Search/Search.tsx @@ -81,6 +81,8 @@ export default function Search({ setProviderURL, providerPrefix, setProviderPrefix, + providerIcon, + setProviderIcon, searchValue, setSearchValue, defaultProviderURL, @@ -89,10 +91,13 @@ export default function Search({ setDefaultProviderLabel, defaultProviderPrefix, setDefaultProviderPrefix, + defaultProviderIcon, + setDefaultProviderIcon, } = useCommonHooks(); const [placeholderValue, setPlaceholderValue] = useState(''); const [value, setValue] = useState(0); const [historyMultiplier, setHistoryMultiplier] = useState(1); + const Icon = allIcons[providerIcon]; const handleResetSearch = () => { setSearchValue(''); @@ -259,6 +264,7 @@ export default function Search({ setProviderLabel('Google Search'); setProviderURL('https://www.google.com/search?q='); setProviderPrefix('/g'); + setProviderIcon('FaGoogle'); } else if (item.target.value.startsWith('/')) { const provider = providers?.find( (p: Provider) => p.prefix === item.target.value.split(' ')[0], @@ -266,6 +272,7 @@ export default function Search({ setProviderLabel(provider?.name ?? 'Invalid Search'); setProviderURL(provider?.url ?? ''); setProviderPrefix(provider?.prefix ?? ''); + setProviderIcon(provider?.icon ?? ''); } else if (item.target.value.startsWith('!')) { if (item.target.value === '!w' || item.target.value === '!weather') { setProviderLabel('Show weather'); @@ -283,6 +290,7 @@ export default function Search({ setProviderLabel(defaultProviderLabel); setProviderURL(defaultProviderURL); setProviderPrefix(defaultProviderPrefix); + setProviderIcon(defaultProviderIcon); } }; @@ -333,7 +341,12 @@ export default function Search({ }; const renderItem: any = (item: any) => { - const Icon = allIcons[item.option.icon]; + const Icon = + allIcons[ + (item.option.icon ?? item.option.prefix === '/g') + ? 'FaGoogle' + : (providers.find((p: Provider) => p.prefix === item.option.prefix)?.icon ?? '') + ]; return !searchValue.startsWith('!') ? ( item.option.value === 'load' ? ( ) ) : ( @@ -470,6 +484,7 @@ export default function Search({ ); setDefaultProviderPrefix(defaultProviderData[0]?.prefix ?? '/g'); setDefaultProviderLabel(defaultProviderData[0]?.name ?? 'Google Search'); + setDefaultProviderIcon(defaultProviderData[0]?.icon ?? 'FaGoogle'); } }, [defaultProviderData, defaultProviderDataIsFetched]); @@ -520,7 +535,18 @@ export default function Search({ spellCheck={true} searchable autoFocus={!isMobile} - leftSection={providerLabel} + leftSection={ + providerIcon ? ( + + ) : ( + providerLabel + ) + } rightSection={
} clearable onClear={handleResetSearch} diff --git a/src/pages/homepage/components/Search/components/SearchSelectItem.tsx b/src/pages/homepage/components/Search/components/SearchSelectItem.tsx index 23b4916..6bcc111 100644 --- a/src/pages/homepage/components/Search/components/SearchSelectItem.tsx +++ b/src/pages/homepage/components/Search/components/SearchSelectItem.tsx @@ -9,6 +9,7 @@ function SearchSelectItem({ handleSearchHistoryItem, searchEndpoint, setSearchValue, + Icon, }: any) { const { isMobile, theme } = useCommonHooks(); const { mutateAsync } = useMutationAPI(); @@ -22,7 +23,6 @@ function SearchSelectItem({ const dateString = isMobile ? `${month}/${day}/${year}` : `${month}/${day}/${year} ${hours}:${minutes}`; - return ( - - - {item.option.provider} - + + {Icon ? ( + + ) : ( + + {item.option.provider} + + )} void; + allIcons: any; }) { const { handleDelete, isMobile, theme } = useCommonHooks(); const [modalOpened, { open: openModal, close: closeModal }] = useDisclosure(false); @@ -81,7 +93,7 @@ function DebouncedSearchProvider({ - + + { + return { value: icon, label: icon }; + })} + comboboxProps={{ + zIndex: 3000, + }} + styles={ + theme.textShadowsEnabled + ? { + label: { boxShadow: '2px 2px var(--mantine-color-border-0)' }, + } + : undefined + } + renderOption={(item: ComboboxLikeRenderOptionInput) => { + const Icon = allIcons[item.option.value]; + return ( + + {item.option.value} + + + ); + }} + searchable + clearable + maxDropdownHeight={175} + onDropdownOpen={() => setIsOpen(true)} + onDropdownClose={() => setIsOpen(false)} /> { label={'Url'} placeholder='eg. https://www.google.com/search?q=' className={textInputClasses.settingsItem} - w={'64%'} + w={'94%'} classNames={textInputClasses} withAsterisk styles={ @@ -228,13 +288,18 @@ const SearchProviderSettings = () => { > - + diff --git a/src/types/provider.ts b/src/types/provider.ts index 6dce4e9..0be4422 100644 --- a/src/types/provider.ts +++ b/src/types/provider.ts @@ -4,4 +4,6 @@ export interface Provider { url: string; prefix: string; default: number; + enabled: number; + icon: string | null; }