diff --git a/src/assets/languages/da.json b/src/assets/languages/da.json index c68b877d1..6173b658e 100644 --- a/src/assets/languages/da.json +++ b/src/assets/languages/da.json @@ -305,6 +305,8 @@ "saveTabsCount": "Gem {0} faner", "closeTabs": "Luk faner", "saveAutomatically": "Gem automatisk", + "contextMenu": "Genvejsmenu", + "saveAutomaticallyContextMenu": "Gem automatisk uden at åbne et vindue", "addHighlights": "Tilføj fremhævninger", "addDescription": "Tilføj beskrivelse", "addNote": "Tilføj note", diff --git a/src/assets/languages/de.json b/src/assets/languages/de.json index af3bc0815..9a09ef30b 100644 --- a/src/assets/languages/de.json +++ b/src/assets/languages/de.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0} Tabs speichern", "closeTabs": "Tabs schließen", "saveAutomatically": "Automatisch speichern", + "contextMenu": "Kontextmenü", + "saveAutomaticallyContextMenu": "Automatisch speichern, ohne ein Fenster zu öffnen", "addHighlights": "Highlights hinzufügen", "addDescription": "Beschreibung hinzufügen", "addNote": "Notiz hinzufügen", diff --git a/src/assets/languages/en.json b/src/assets/languages/en.json index b2d512150..8342aa962 100644 --- a/src/assets/languages/en.json +++ b/src/assets/languages/en.json @@ -305,6 +305,8 @@ "saveTabsCount": "Save {0} tabs", "closeTabs": "Close tabs", "saveAutomatically": "Save automatically", + "contextMenu": "Context menu", + "saveAutomaticallyContextMenu": "Save automatically without opening a window", "addHighlights": "Add highlights", "addDescription": "Add description", "addNote": "Add note", diff --git a/src/assets/languages/es.json b/src/assets/languages/es.json index a458c633f..08039f844 100644 --- a/src/assets/languages/es.json +++ b/src/assets/languages/es.json @@ -305,6 +305,8 @@ "saveTabsCount": "Guardar {0} pestañas", "closeTabs": "Cerrar pestañas", "saveAutomatically": "Guardar automáticamente", + "contextMenu": "Menú contextual", + "saveAutomaticallyContextMenu": "Guardar automáticamente sin abrir una ventana", "addHighlights": "Añadir destacados", "addDescription": "Añadir descripción", "addNote": "Añadir nota", diff --git a/src/assets/languages/fi.json b/src/assets/languages/fi.json index 96c4e9437..2b21bfab0 100644 --- a/src/assets/languages/fi.json +++ b/src/assets/languages/fi.json @@ -305,6 +305,8 @@ "saveTabsCount": "Tallenna {0} välilehteä", "closeTabs": "Sulje välilehdet", "saveAutomatically": "Tallenna automaattisesti", + "contextMenu": "Pikavalikko", + "saveAutomaticallyContextMenu": "Tallenna automaattisesti avaamatta ikkunaa", "addHighlights": "Lisää korostuksia", "addDescription": "Lisää kuvaus", "addNote": "Lisää muistiinpano", diff --git a/src/assets/languages/fr.json b/src/assets/languages/fr.json index 4191586b9..51afd14cd 100644 --- a/src/assets/languages/fr.json +++ b/src/assets/languages/fr.json @@ -305,6 +305,8 @@ "saveTabsCount": "Enregistrer {0} onglets", "closeTabs": "Fermer les onglets", "saveAutomatically": "Enregistrer automatiquement", + "contextMenu": "Menu contextuel", + "saveAutomaticallyContextMenu": "Enregistrer automatiquement sans ouvrir de fenêtre", "addHighlights": "Ajouter des surlignages", "addDescription": "Ajouter une description", "addNote": "Ajouter une note", diff --git a/src/assets/languages/hi.json b/src/assets/languages/hi.json index cb8f083b1..9dfbbff57 100644 --- a/src/assets/languages/hi.json +++ b/src/assets/languages/hi.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0} टैब सहेजें", "closeTabs": "टैब बंद करें", "saveAutomatically": "स्वचालित रूप से सहेजें", + "contextMenu": "संदर्भ मेनू", + "saveAutomaticallyContextMenu": "विंडो खोले बिना स्वचालित रूप से सहेजें", "addHighlights": "हाइलाइट जोड़ें", "addDescription": "विवरण जोड़ें", "addNote": "नोट जोड़ें", diff --git a/src/assets/languages/it.json b/src/assets/languages/it.json index 4660ddc3c..64c6932a9 100644 --- a/src/assets/languages/it.json +++ b/src/assets/languages/it.json @@ -305,6 +305,8 @@ "saveTabsCount": "Salva {0} schede", "closeTabs": "Chiudi schede", "saveAutomatically": "Salva automaticamente", + "contextMenu": "Menu contestuale", + "saveAutomaticallyContextMenu": "Salva automaticamente senza aprire una finestra", "addHighlights": "Aggiungi evidenziazioni", "addDescription": "Aggiungi descrizione", "addNote": "Aggiungi nota", diff --git a/src/assets/languages/ja.json b/src/assets/languages/ja.json index 6307a2c20..ceb097785 100644 --- a/src/assets/languages/ja.json +++ b/src/assets/languages/ja.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0}個のタブを保存", "closeTabs": "タブを閉じる", "saveAutomatically": "自動保存", + "contextMenu": "コンテキストメニュー", + "saveAutomaticallyContextMenu": "ウィンドウを開かずに自動保存", "addHighlights": "ハイライトを追加", "addDescription": "説明を追加", "addNote": "メモを追加", diff --git a/src/assets/languages/ko.json b/src/assets/languages/ko.json index e1dcc54bc..65643913f 100644 --- a/src/assets/languages/ko.json +++ b/src/assets/languages/ko.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0}개 탭 저장", "closeTabs": "탭 닫기", "saveAutomatically": "자동 저장", + "contextMenu": "컨텍스트 메뉴", + "saveAutomaticallyContextMenu": "창을 열지 않고 자동 저장", "addHighlights": "하이라이트 추가", "addDescription": "설명 추가", "addNote": "메모 추가", diff --git a/src/assets/languages/nl.json b/src/assets/languages/nl.json index 0cd1b4152..886b66e49 100644 --- a/src/assets/languages/nl.json +++ b/src/assets/languages/nl.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0} tabbladen opslaan", "closeTabs": "Tabbladen sluiten", "saveAutomatically": "Automatisch opslaan", + "contextMenu": "Contextmenu", + "saveAutomaticallyContextMenu": "Automatisch opslaan zonder een venster te openen", "addHighlights": "Markeringen toevoegen", "addDescription": "Beschrijving toevoegen", "addNote": "Notitie toevoegen", diff --git a/src/assets/languages/pl.json b/src/assets/languages/pl.json index d5f895ee4..2e6db5c68 100644 --- a/src/assets/languages/pl.json +++ b/src/assets/languages/pl.json @@ -305,6 +305,8 @@ "saveTabsCount": "Zapisz {0} kart", "closeTabs": "Zamknij karty", "saveAutomatically": "Zapisuj automatycznie", + "contextMenu": "Menu kontekstowe", + "saveAutomaticallyContextMenu": "Zapisuj automatycznie bez otwierania okna", "addHighlights": "Dodaj wyróżnienia", "addDescription": "Dodaj opis", "addNote": "Dodaj notatkę", diff --git a/src/assets/languages/pt_BR.json b/src/assets/languages/pt_BR.json index 20c6e83da..5f46a1b4f 100644 --- a/src/assets/languages/pt_BR.json +++ b/src/assets/languages/pt_BR.json @@ -305,6 +305,8 @@ "saveTabsCount": "Salvar {0} abas", "closeTabs": "Fechar abas", "saveAutomatically": "Salvar automaticamente", + "contextMenu": "Menu de contexto", + "saveAutomaticallyContextMenu": "Salvar automaticamente sem abrir uma janela", "addHighlights": "Adicionar destaques", "addDescription": "Adicionar descrição", "addNote": "Adicionar nota", diff --git a/src/assets/languages/ru.json b/src/assets/languages/ru.json index 522797036..77f25c11f 100644 --- a/src/assets/languages/ru.json +++ b/src/assets/languages/ru.json @@ -305,6 +305,8 @@ "saveTabsCount": "Сохранить {0} вкладок", "closeTabs": "Закрыть вкладки", "saveAutomatically": "Сохранять автоматически", + "contextMenu": "Контекстное меню", + "saveAutomaticallyContextMenu": "Сохранять автоматически без открытия окна", "addHighlights": "Добавить цитату", "addDescription": "Добавить описание", "addNote": "Добавить заметку", diff --git a/src/assets/languages/sv.json b/src/assets/languages/sv.json index 69c7ccf31..010b2579a 100644 --- a/src/assets/languages/sv.json +++ b/src/assets/languages/sv.json @@ -305,6 +305,8 @@ "saveTabsCount": "Spara {0} flikar", "closeTabs": "Stäng flikar", "saveAutomatically": "Spara automatiskt", + "contextMenu": "Snabbmeny", + "saveAutomaticallyContextMenu": "Spara automatiskt utan att öppna ett fönster", "addHighlights": "Lägg till markeringar", "addDescription": "Lägg till beskrivning", "addNote": "Lägg till anteckning", diff --git a/src/assets/languages/tr.json b/src/assets/languages/tr.json index e92796381..39ff6c832 100644 --- a/src/assets/languages/tr.json +++ b/src/assets/languages/tr.json @@ -305,6 +305,8 @@ "saveTabsCount": "{0} sekmeyi kaydet", "closeTabs": "Sekmeleri kapat", "saveAutomatically": "Otomatik kaydet", + "contextMenu": "Bağlam menüsü", + "saveAutomaticallyContextMenu": "Pencere açmadan otomatik kaydet", "addHighlights": "Vurgu ekle", "addDescription": "Açıklama ekle", "addNote": "Not ekle", diff --git a/src/assets/languages/zh-Hans.json b/src/assets/languages/zh-Hans.json index 68f3004d4..cfe08a729 100644 --- a/src/assets/languages/zh-Hans.json +++ b/src/assets/languages/zh-Hans.json @@ -305,6 +305,8 @@ "saveTabsCount": "保存 {0} 个标签页", "closeTabs": "关闭标签页", "saveAutomatically": "自动保存", + "contextMenu": "右键菜单", + "saveAutomaticallyContextMenu": "自动保存且不打开窗口", "addHighlights": "添加高亮", "addDescription": "添加描述", "addNote": "添加备注", diff --git a/src/assets/languages/zh-Hant.json b/src/assets/languages/zh-Hant.json index e8887d7d2..7ae9dd8a6 100644 --- a/src/assets/languages/zh-Hant.json +++ b/src/assets/languages/zh-Hant.json @@ -305,6 +305,8 @@ "saveTabsCount": "儲存 {0} 個分頁", "closeTabs": "關閉分頁", "saveAutomatically": "自動儲存", + "contextMenu": "右鍵選單", + "saveAutomaticallyContextMenu": "自動儲存且不開啟視窗", "addHighlights": "新增標記", "addDescription": "新增描述", "addNote": "新增備註", diff --git a/src/data/helpers/bookmarks/createRaindrop.js b/src/data/helpers/bookmarks/createRaindrop.js new file mode 100644 index 000000000..5cb06abeb --- /dev/null +++ b/src/data/helpers/bookmarks/createRaindrop.js @@ -0,0 +1,26 @@ +import Api from '../../modules/api' + +export async function createRaindrop(obj={}) { + let item = { ...obj } + + //minimum info is already provided, grab all other in background on server + if (item.title) + item.pleaseParse = { weight: 1 } + //parse bookmark otherwise + else { + const parsed = await Api._get('import/url/parse?url='+encodeURIComponent(item.link)) + item = { ...item, ...parsed.item } + } + + //try to create bookmark on server + let res + try { + res = await Api._post('raindrop', item) + } catch (e) {} + + //try again, maybe it's collectionId related issue + if (!res) + res = await Api._post('raindrop', {...item, collectionId: -1 }) + + return res.item +} diff --git a/src/data/helpers/bookmarks/index.js b/src/data/helpers/bookmarks/index.js index e15579ebc..815b2605c 100644 --- a/src/data/helpers/bookmarks/index.js +++ b/src/data/helpers/bookmarks/index.js @@ -8,6 +8,7 @@ export * from './blankSpace' export * from './getUrl' export * from './queryIsEqual' export * from './normalizeRecentSearch' +export * from './createRaindrop' //Iterator by spaceId prefixes and original export const iterateSpaceId = (spaceId, func)=>{ diff --git a/src/data/reducers/config.js b/src/data/reducers/config.js index b7fb75ffb..8a4d4b2e8 100755 --- a/src/data/reducers/config.js +++ b/src/data/reducers/config.js @@ -75,6 +75,7 @@ const initialState = Immutable({ add_default_collection: 0, //last_used add_auto_save: false, + add_auto_save_context_menu: false, mobile_add_auto_save: false, browser_extension_mode: 'clipper', @@ -91,5 +92,6 @@ const safeKeys = [ 'lang', 'add_default_collection', 'add_auto_save', + 'add_auto_save_context_menu', 'browser_extension_mode' ] \ No newline at end of file diff --git a/src/data/sagas/bookmarks/single.js b/src/data/sagas/bookmarks/single.js index 637df30c1..f9eaabb58 100755 --- a/src/data/sagas/bookmarks/single.js +++ b/src/data/sagas/bookmarks/single.js @@ -19,7 +19,8 @@ import { import { getBookmark, getBookmarkScreenshotIndex, - getMeta + getMeta, + createRaindrop } from '../../helpers/bookmarks' import { isPro } from '../../selectors/user' @@ -74,32 +75,12 @@ function* createBookmark({obj={}, ignore=false, draft, onSuccess, onFail}) { if (ignore) return; try{ - let item = { ...obj } - - //minimum info is already provided, grab all other in background on server - if (item.title) - item.pleaseParse = { weight: 1 } - //parse bookmark otherwise - else { - const parsed = yield call(Api.get, 'import/url/parse?url='+encodeURIComponent(item.link)) - - item = { ...item, ...parsed.item } - } - - //try to create bookmark on server - let res - try { - res = yield call(Api.post, 'raindrop', item) - } catch (e) {} - - //try again, maybe it's collectionId related issue - if (!res) - res = yield call(Api.post, 'raindrop', {...item, collectionId: -1 }) + const item = yield call(createRaindrop, obj) yield put({ type: BOOKMARK_CREATE_SUCCESS, - _id: res.item._id, - item: res.item, + _id: item._id, + item, draft, onSuccess, onFail }); diff --git a/src/routes/add/content.js b/src/routes/add/content.js index ebc6573db..49ff4fe1d 100644 --- a/src/routes/add/content.js +++ b/src/routes/add/content.js @@ -1,11 +1,24 @@ -import React from 'react' +import React, { useEffect, useRef } from 'react' +import { useSelector } from 'react-redux' import Bookmark from '~co/bookmarks/edit' +import { getDraftStatus } from '~data/selectors/bookmarks' export default function AddContent({ item }) { + const add_auto_save_context_menu = useSelector(state=>state.config.add_auto_save_context_menu) + const status = useSelector(state=>getDraftStatus(state, item.link)) + const wasNew = useRef(false) + + useEffect(()=>{ + if (status == 'new') + wasNew.current = true + else if (wasNew.current && add_auto_save_context_menu && status == 'loaded') + window.close() + }, [status, add_auto_save_context_menu]) + return ( - {t.s('newBookmark')} - set('add_auto_save', !add_auto_save)}> {t.s('saveAutomatically')} + + set('add_auto_save_context_menu', !add_auto_save_context_menu)}> + {t.s('saveAutomaticallyContextMenu')} + + @@ -51,8 +60,8 @@ function SettingsExtensionAdd({ add_default_collection, add_auto_save, browser_e } export default connect( - ({ config: { add_default_collection, add_auto_save, browser_extension_mode } })=>({ - add_default_collection, add_auto_save, browser_extension_mode + ({ config: { add_default_collection, add_auto_save, add_auto_save_context_menu, browser_extension_mode } })=>({ + add_default_collection, add_auto_save, add_auto_save_context_menu, browser_extension_mode }), { set } )(SettingsExtensionAdd) \ No newline at end of file diff --git a/src/target/extension/background/contextMenus.js b/src/target/extension/background/contextMenus.js index e345fa614..bffc235f2 100644 --- a/src/target/extension/background/contextMenus.js +++ b/src/target/extension/background/contextMenus.js @@ -2,19 +2,54 @@ import browser from 'webextension-polyfill' import { open } from './popup' import { addCurrentTabSelection } from './highlights' import { environment } from '../environment' +import Api from '~data/modules/api' +import { createRaindrop } from '~data/helpers/bookmarks' +import * as links from './links' +import * as action from './action' + +async function quickSave(link) { + if (!link) return false + + let config + try { + ({ user: { config } } = await Api._get('user')) + } catch(e) { return false } + + if (!config.add_auto_save_context_menu) + return false + + try { + const item = await createRaindrop({ + link, + collectionId: config.add_default_collection || config.last_collection || -1 + }) + + links.add(link, item._id) + action.updateBadge().catch(console.error) + + return true + } catch(e) { + console.error(e) + return false + } +} async function onClicked({ menuItemId, pageUrl, srcUrl, linkUrl }, { windowId }) { switch(menuItemId) { case 'save_page': + if (await quickSave(pageUrl)) return return open(`/add?link=${encodeURIComponent(pageUrl)}`) case 'save_link': + if (await quickSave(linkUrl)) return return open(`/add?link=${encodeURIComponent(linkUrl)}`) case 'save_video': + if (await quickSave(srcUrl)) return return open(`/add?link=${encodeURIComponent(srcUrl)}`) case 'save_image': + if (await quickSave(srcUrl)) return return open(`/add?link=${encodeURIComponent(srcUrl)}`) case 'save_highlight':