diff --git a/.github/workflows/distribute.yml b/.github/workflows/distribute.yml index 249fa999..a7204af5 100644 --- a/.github/workflows/distribute.yml +++ b/.github/workflows/distribute.yml @@ -55,7 +55,7 @@ jobs: if: github.event.inputs.autoTag == 'true' uses: EndBug/add-and-commit@v5 with: - branch: master + branch: ${{ github.ref_name }} author_name: Github bot author_email: elmehdi.sakout@gmail.com message: 'Bump manifest version' @@ -66,8 +66,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - ref: master - uses: actions/cache@v4 with: path: '**/node_modules' @@ -97,8 +95,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - ref: master - uses: actions/cache@v4 with: path: '**/node_modules' diff --git a/public/searchengine_logos/baidu_logo.svg b/public/searchengine_logos/baidu_logo.svg deleted file mode 100644 index 96f5f072..00000000 --- a/public/searchengine_logos/baidu_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/searchengine_logos/bing_logo.svg b/public/searchengine_logos/bing_logo.svg deleted file mode 100644 index 5334aa7c..00000000 --- a/public/searchengine_logos/bing_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/searchengine_logos/claude_logo.svg b/public/searchengine_logos/claude_logo.svg new file mode 100644 index 00000000..a2352685 --- /dev/null +++ b/public/searchengine_logos/claude_logo.svg @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/public/searchengine_logos/duckduckgo_logo.svg b/public/searchengine_logos/duckduckgo_logo.svg deleted file mode 100644 index 8215a918..00000000 --- a/public/searchengine_logos/duckduckgo_logo.svg +++ /dev/null @@ -1 +0,0 @@ -duckduckgo \ No newline at end of file diff --git a/public/searchengine_logos/google_logo.svg b/public/searchengine_logos/google_logo.svg deleted file mode 100644 index 18f72bf5..00000000 --- a/public/searchengine_logos/google_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/searchengine_logos/kagi_logo.svg b/public/searchengine_logos/kagi_logo.svg deleted file mode 100644 index ce322b2e..00000000 --- a/public/searchengine_logos/kagi_logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/public/searchengine_logos/mistral_logo.svg b/public/searchengine_logos/mistral_logo.svg new file mode 100644 index 00000000..8e03e244 --- /dev/null +++ b/public/searchengine_logos/mistral_logo.svg @@ -0,0 +1 @@ +Mistral \ No newline at end of file diff --git a/public/searchengine_logos/perplexity_logo.svg b/public/searchengine_logos/perplexity_logo.svg new file mode 100644 index 00000000..6dc75a75 --- /dev/null +++ b/public/searchengine_logos/perplexity_logo.svg @@ -0,0 +1,7 @@ + + + Perplexity + + + + diff --git a/public/searchengine_logos/phind_logo.svg b/public/searchengine_logos/phind_logo.svg deleted file mode 100644 index d0059912..00000000 --- a/public/searchengine_logos/phind_logo.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - diff --git a/public/searchengine_logos/startpage_logo.svg b/public/searchengine_logos/startpage_logo.svg deleted file mode 100644 index 1d609d0e..00000000 --- a/public/searchengine_logos/startpage_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/searchengine_logos/yahoo_logo.svg b/public/searchengine_logos/yahoo_logo.svg deleted file mode 100644 index f6baacd9..00000000 --- a/public/searchengine_logos/yahoo_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/searchengine_logos/yandex_logo.svg b/public/searchengine_logos/yandex_logo.svg deleted file mode 100644 index a35d8797..00000000 --- a/public/searchengine_logos/yandex_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/Elements/SearchBar/SearchBar.tsx b/src/components/Elements/SearchBar/SearchBar.tsx index 23fab3d7..f493dbea 100644 --- a/src/components/Elements/SearchBar/SearchBar.tsx +++ b/src/components/Elements/SearchBar/SearchBar.tsx @@ -1,14 +1,17 @@ import React, { useEffect, useRef } from 'react' -import { IoSearchCircleSharp } from 'react-icons/io5' +import { HiSparkles } from 'react-icons/hi' +import { AI_PROMPT_ENGINES } from 'src/config/SearchEngines' import { trackSearchEngineUse } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' export const SearchBar = () => { - const { searchEngine, searchEngines } = useUserPreferences() + const { promptEngine, promptEngines } = useUserPreferences() + const mergedEngines = [...AI_PROMPT_ENGINES, ...promptEngines] const keywordsInputRef = useRef(null) const usedSearchEngine = - searchEngines.find((engine) => engine.label === searchEngine) || searchEngines[0] + mergedEngines.find((engine) => engine.label.toLowerCase() === promptEngine.toLowerCase()) || + promptEngines[0] const handleSubmit = (e: React.FormEvent) => { e.preventDefault() @@ -26,8 +29,8 @@ export const SearchBar = () => { return ( - {usedSearchEngine.default === false ? ( - + {usedSearchEngine?.default === false ? ( + ) : ( { type="text" name="keyword" className="searchBarInput" - placeholder={`Search on ${usedSearchEngine.label}`} + placeholder={`Ask ${usedSearchEngine.label}`} /> ) diff --git a/src/components/Elements/SearchBarWithLogo/SearchBarWithLogo.tsx b/src/components/Elements/SearchBarWithLogo/SearchBarWithLogo.tsx index be252167..5830c483 100644 --- a/src/components/Elements/SearchBarWithLogo/SearchBarWithLogo.tsx +++ b/src/components/Elements/SearchBarWithLogo/SearchBarWithLogo.tsx @@ -1,20 +1,22 @@ -import { IoIosSearch } from 'react-icons/io' +import { HiSparkles } from 'react-icons/hi' +import { AI_PROMPT_ENGINES } from 'src/config/SearchEngines' import { useUserPreferences } from 'src/stores/preferences' import { SearchBar } from '../SearchBar/SearchBar' import './SearchBarWithLogo.css' export const SearchBarWithLogo = () => { - const { searchEngine, searchEngines } = useUserPreferences() + const { promptEngine, promptEngines } = useUserPreferences() + const mergedSearchEngines = [...AI_PROMPT_ENGINES, ...promptEngines] const userSearchEngine = - searchEngines.find( - (srchEngn) => srchEngn.label.toLocaleLowerCase() === searchEngine.toLocaleLowerCase() - ) || searchEngines[0] + mergedSearchEngines.find( + (srchEngn) => srchEngn.label.toLocaleLowerCase() === promptEngine.toLocaleLowerCase() + ) || mergedSearchEngines[0] return ( {userSearchEngine.default === false ? ( - + ) : ( { path: '/settings/bookmarks', }, { - name: 'Search Engine', - path: '/settings/search-engine', + name: 'AI Prompt Engines', + path: '/settings/ai-engine', }, { name: 'Settings', diff --git a/src/config/SearchEngines.ts b/src/config/SearchEngines.ts new file mode 100644 index 00000000..cf92a690 --- /dev/null +++ b/src/config/SearchEngines.ts @@ -0,0 +1,20 @@ +import { SearchEngineType } from 'src/types' + +export const AI_PROMPT_ENGINES: SearchEngineType[] = [ + { + label: 'Chatgpt', + url: 'https://chatgpt.com/?q=', + }, + { + label: 'Claude', + url: 'https://claude.ai/new?q=', + }, + { + label: 'Mistral', + url: 'https://chat.mistral.ai/chat?q', + }, + { + label: 'Perplexity', + url: 'https://www.perplexity.ai/search?q=', + }, +] diff --git a/src/features/settings/components/AddSearchEngine.tsx b/src/features/settings/components/AddSearchEngine.tsx index c3613947..f20c3aa7 100644 --- a/src/features/settings/components/AddSearchEngine.tsx +++ b/src/features/settings/components/AddSearchEngine.tsx @@ -3,26 +3,28 @@ import { isValidURL } from 'src/utils/UrlUtils' import { TiPlus } from 'react-icons/ti' import { Button } from 'src/components/Elements' +import { AI_PROMPT_ENGINES } from 'src/config/SearchEngines' import { useUserPreferences } from 'src/stores/preferences' export const AddSearchEngine = () => { - const { addSearchEngine, searchEngines } = useUserPreferences() + const { addSearchEngine, promptEngines } = useUserPreferences() const [searchEngineUrl, setSearchEngineUrl] = useState() - const [RssInputFeedback, setRssInputFeedback] = useState() + const [inputFeedback, setInputFeedback] = useState() + const mergedEngines = [...AI_PROMPT_ENGINES, ...promptEngines] const onAddSearchEngine = async () => { if (!searchEngineUrl) { - setRssInputFeedback('Please provide a valid Search engine URL') + setInputFeedback('Please provide a valid Prompt engine URL') return } if (!isValidURL(searchEngineUrl)) { - setRssInputFeedback('Invalid Search Engine URL. Please check and try again') + setInputFeedback('Invalid AI prompt Engine URL. Please check and try again') return } - if (searchEngines.some((se) => se.url === searchEngineUrl)) { - setRssInputFeedback('Search Engine already exists') + if (mergedEngines.some((se) => se.url === searchEngineUrl)) { + setInputFeedback('AI Prompt Engine already exists') return } @@ -31,19 +33,19 @@ export const AddSearchEngine = () => { const label = url.hostname.replace('www.', '').split('.')[0] addSearchEngine({ label: label, url: searchEngineUrl, default: false }) - setRssInputFeedback('Search Engine added successfully') + setInputFeedback('AI Prompt Engine added successfully') } return ( - Search Engine URL + AI prompt Engine URL setSearchEngineUrl(e.target.value)} - placeholder="https://google.com?q=" + placeholder="https://chatgpt.com?q=" /> } size="small" onClick={onAddSearchEngine}> @@ -51,9 +53,9 @@ export const AddSearchEngine = () => { - {RssInputFeedback && ( + {inputFeedback && ( - {RssInputFeedback} + {inputFeedback} )} diff --git a/src/features/settings/components/SearchEngineSettings.tsx b/src/features/settings/components/SearchEngineSettings.tsx index f3cc2154..b2ea49c1 100644 --- a/src/features/settings/components/SearchEngineSettings.tsx +++ b/src/features/settings/components/SearchEngineSettings.tsx @@ -1,31 +1,33 @@ -import { IoSearchCircleSharp } from 'react-icons/io5' +import { HiSparkles } from 'react-icons/hi' import { ChipsSet } from 'src/components/Elements' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout/SettingsContentLayout' +import { AI_PROMPT_ENGINES } from 'src/config/SearchEngines' import { identifyUserSearchEngine, trackSearchEngineSelect } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { AddSearchEngine } from './AddSearchEngine' export const SearchEngineSettings = () => { - const { searchEngine, searchEngines, removeSearchEngine, setSearchEngine } = useUserPreferences() + const { promptEngines, promptEngine, removeSearchEngine, setPromptEngine } = useUserPreferences() + const mergedSearchEngines = [...AI_PROMPT_ENGINES, ...promptEngines] return ( <> { + options={mergedSearchEngines.map((engine) => { return { label: engine.label, value: engine.url, removeable: engine.default === false, icon: - engine.default === false ? ( - + engine?.default === false ? ( + ) : ( { ), } })} - defaultValues={[searchEngines.find((se) => se.label === searchEngine)?.url || '']} + defaultValues={[mergedSearchEngines.find((se) => se.label === promptEngine)?.url || '']} onRemove={(option) => { removeSearchEngine(option.value) }} @@ -43,16 +45,16 @@ export const SearchEngineSettings = () => { identifyUserSearchEngine(value.label) trackSearchEngineSelect(value.label) - setSearchEngine(value.label) + setPromptEngine(value.label) }} /> <> - Add new Search Engine + Add new AI prompt Engine - Can't find your favorite search engine? Add it here and it. + Can't find your favorite AI prompt engine? Add it here and it. diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts index eca3eab4..56b3c25e 100644 --- a/src/lib/analytics.ts +++ b/src/lib/analytics.ts @@ -100,7 +100,7 @@ export const setupIdentification = () => { cards, listingMode, openLinksNewTab, - searchEngine, + promptEngine, maxVisibleCards, } = useUserPreferences.getState() @@ -109,7 +109,7 @@ export const setupIdentification = () => { identifyUserTheme(theme) identifyUserCards(cards.map((card: any) => card.name)) identifyUserListingMode(listingMode) - identifyUserSearchEngine(searchEngine) + identifyUserSearchEngine(promptEngine) identifyUserLinksInNewTab(openLinksNewTab) identifyUserMaxVisibleCards(maxVisibleCards) if (onboardingResult?.title) { diff --git a/src/routes/AppRoutes.tsx b/src/routes/AppRoutes.tsx index eb96e47d..ddf72b9f 100644 --- a/src/routes/AppRoutes.tsx +++ b/src/routes/AppRoutes.tsx @@ -22,7 +22,7 @@ export const AppRoutes = () => { } /> } /> } /> - } /> + } /> } /> } /> diff --git a/src/stores/preferences.ts b/src/stores/preferences.ts index 6b745f3f..d82dcfe4 100644 --- a/src/stores/preferences.ts +++ b/src/stores/preferences.ts @@ -21,8 +21,8 @@ export type UserPreferencesState = { onboardingCompleted: boolean onboardingResult: Omit | null listingMode: ListingMode - searchEngine: string - searchEngines: SearchEngineType[] + promptEngine: string + promptEngines: SearchEngineType[] maxVisibleCards: number cards: SelectedCard[] cardsSettings: Record @@ -34,7 +34,7 @@ export type UserPreferencesState = { type UserPreferencesStoreActions = { setTheme: (theme: Theme) => void - setSearchEngine: (theme: string) => void + setPromptEngine: (engine: string) => void setOpenLinksNewTab: (openLinksNewTab: boolean) => void setListingMode: (listingMode: ListingMode) => void setCards: (selectedCards: SelectedCard[]) => void @@ -129,49 +129,8 @@ export const useUserPreferences = create( theme: 'dark', onboardingCompleted: false, onboardingResult: null, - searchEngine: 'google', - searchEngines: [ - { - label: 'Google', - url: 'https://google.com/search?q=', - }, - { - label: 'DuckDuckGo', - url: 'https://duckduckgo.com?q=', - }, - { - label: 'Bing', - url: 'https://bing.com/search?q=', - }, - { - label: 'Yahoo', - url: 'https://search.yahoo.com/search?p=', - }, - { - label: 'Baidu', - url: 'https://baidu.com/s?wd=', - }, - { - label: 'Yandex', - url: 'https://yandex.ru/search/?text=', - }, - { - label: 'Startpage', - url: 'https://www.startpage.com/sp/search?query=', - }, - { - label: 'Phind', - url: 'https://phind.com/search?q=', - }, - { - label: 'Kagi', - url: 'https://kagi.com/search?q=', - }, - { - label: 'Chatgpt', - url: 'https://chatgpt.com/?q=', - }, - ], + promptEngine: 'chatgpt', + promptEngines: [], listingMode: 'normal', openLinksNewTab: true, firstSeenDate: Date.now(), @@ -184,7 +143,7 @@ export const useUserPreferences = create( userCustomCards: [], DNDDuration: 'never', advStatus: false, - setSearchEngine: (searchEngine: string) => set({ searchEngine: searchEngine }), + setPromptEngine: (promptEngine: string) => set({ promptEngine: promptEngine }), setListingMode: (listingMode: ListingMode) => set({ listingMode: listingMode }), setTheme: (theme: Theme) => set({ theme: theme }), setOpenLinksNewTab: (openLinksNewTab: boolean) => set({ openLinksNewTab: openLinksNewTab }), @@ -234,14 +193,14 @@ export const useUserPreferences = create( return false } }, - addSearchEngine: (searchEngine: SearchEngineType) => + addSearchEngine: (engine: SearchEngineType) => set((state) => { - return { searchEngines: [...state.searchEngines, searchEngine] } + return { promptEngines: [...state.promptEngines, engine] } }), - removeSearchEngine: (searchEngineUrl: string) => + removeSearchEngine: (engine: string) => set((state) => { return { - searchEngines: state.searchEngines.filter((se) => se.url !== searchEngineUrl), + promptEngines: state.promptEngines.filter((se) => se.url !== engine), } }), setAdvStatus: (status) => set({ advStatus: status }), diff --git a/src/types/index.ts b/src/types/index.ts index 7ac14c23..7335af8c 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,5 +1,3 @@ -import { Tag } from 'src/features/remoteConfig' - export type SearchEngineType = { url: string label: string @@ -19,15 +17,6 @@ export type SelectedTag = { value: string } -export type UserPreferences = { - userSelectedTags: Tag[] - theme: 'light' | 'dark' - openLinksNewTab: boolean - listingMode: 'normal' | 'compact' - searchEngine: string - cards: SelectedCard[] -} - export type SearchEngine = { url: string label: string
Search Engine URL
AI prompt Engine URL
{RssInputFeedback}
{inputFeedback}
- Can't find your favorite search engine? Add it here and it. + Can't find your favorite AI prompt engine? Add it here and it.