diff --git a/packages/web/src/appobj/closedTabAppObject.js b/packages/web/src/appobj/closedTabAppObject.js index cb9e54bd2..dca378345 100644 --- a/packages/web/src/appobj/closedTabAppObject.js +++ b/packages/web/src/appobj/closedTabAppObject.js @@ -2,6 +2,22 @@ import React from 'react'; import _ from 'lodash'; import moment from 'moment'; import { getIconImage } from '../icons'; +import { DropDownMenuItem } from '../modals/DropDownMenu'; + +function Menu({ data, setOpenedTabs }) { + const handleDelete = () => { + setOpenedTabs((tabs) => tabs.filter((x) => x.tabid != data.tabid)); + }; + const handleDeleteOlder = () => { + setOpenedTabs((tabs) => tabs.filter((x) => !x.closedTime || x.closedTime >= data.closedTime)); + }; + return ( + <> + Delete + Delete older + + ); +} const closedTabAppObject = () => ({ tabid, props, selected, icon, title, closedTime, busy }, { setOpenedTabs }) => { const key = tabid; @@ -18,7 +34,7 @@ const closedTabAppObject = () => ({ tabid, props, selected, icon, title, closedT ); }; - return { title: `${title} ${moment(closedTime).fromNow()}`, key, Icon, isBold, onClick, isBusy: busy }; + return { title: `${title} ${moment(closedTime).fromNow()}`, key, Icon, isBold, onClick, isBusy: busy, Menu }; }; export default closedTabAppObject; diff --git a/packages/web/src/index.js b/packages/web/src/index.js index 7adc41145..704655309 100644 --- a/packages/web/src/index.js +++ b/packages/web/src/index.js @@ -13,10 +13,13 @@ import 'ace-builds/src-noconflict/mode-javascript'; import 'ace-builds/src-noconflict/theme-github'; import 'ace-builds/src-noconflict/ext-searchbox'; import 'ace-builds/src-noconflict/ext-language_tools'; +import localStorageGarbageCollector from './utility/localStorageGarbageCollector'; // import 'ace-builds/src-noconflict/snippets/sqlserver'; // import 'ace-builds/src-noconflict/snippets/pgsql'; // import 'ace-builds/src-noconflict/snippets/mysql'; +localStorageGarbageCollector(); + ReactDOM.render(, document.getElementById('root')); // If you want your app to work offline and load faster, you can change diff --git a/packages/web/src/utility/localStorageGarbageCollector.js b/packages/web/src/utility/localStorageGarbageCollector.js new file mode 100644 index 000000000..cea94596b --- /dev/null +++ b/packages/web/src/utility/localStorageGarbageCollector.js @@ -0,0 +1,25 @@ +import moment from 'moment'; + +export default function localStorageGarbageCollector() { + const openedTabsJson = localStorage.getItem('openedTabs'); + const savedSqlFilesJson = localStorage.getItem('savedSqlFiles'); + let openedTabs = openedTabsJson ? JSON.parse(openedTabsJson) : []; + + const closeLimit = moment().add(-7, 'day').valueOf(); + + openedTabs = openedTabs.filter((x) => !x.closedTime || x.closedTime > closeLimit); + localStorage.setItem('openedTabs', JSON.stringify(openedTabs)); + + const savedSqlFiles = savedSqlFilesJson ? JSON.parse(savedSqlFilesJson) : []; + const toRemove = []; + for (const key in localStorage) { + if (!key.startsWith('tabdata_')) continue; + if (savedSqlFiles.find((x) => x.storageKey == key)) continue; + if (openedTabs.find((x) => key.endsWith('_' + x.tabid))) continue; + toRemove.push(key); + } + + for (const key of toRemove) { + localStorage.removeItem(key); + } +}