diff --git a/superset-frontend/src/SqlLab/reducers/getInitialState.ts b/superset-frontend/src/SqlLab/reducers/getInitialState.ts index cd5c46540b288..e2aa1d4688738 100644 --- a/superset-frontend/src/SqlLab/reducers/getInitialState.ts +++ b/superset-frontend/src/SqlLab/reducers/getInitialState.ts @@ -137,53 +137,57 @@ export default function getInitialState({ * hasn't used SQL Lab after it has been turned on, the state will be stored * in the browser's local storage. */ - const localStorageData = localStorage.getItem('redux'); - const sqlLabCacheData = localStorageData - ? (JSON.parse(localStorageData) as Pick) - : undefined; - if (localStorageData && sqlLabCacheData?.sqlLab) { - const { sqlLab } = sqlLabCacheData; + try { + const localStorageData = localStorage.getItem('redux'); + const sqlLabCacheData = localStorageData + ? (JSON.parse(localStorageData) as Pick) + : undefined; + if (localStorageData && sqlLabCacheData?.sqlLab) { + const { sqlLab } = sqlLabCacheData; - if (sqlLab.queryEditors.length === 0) { - // migration was successful - localStorage.removeItem('redux'); - } else { - unsavedQueryEditor = sqlLab.unsavedQueryEditor || unsavedQueryEditor; - // add query editors and tables to state with a special flag so they can - // be migrated if the `SQLLAB_BACKEND_PERSISTENCE` feature flag is on - sqlLab.queryEditors.forEach(qe => { - queryEditors = { - ...queryEditors, - [qe.id]: { - ...queryEditors[qe.id], - ...qe, - name: qe.title || qe.name, - ...(unsavedQueryEditor.id === qe.id && unsavedQueryEditor), - inLocalStorage: true, - loaded: true, - }, - }; - }); - const expandedTables = new Set(); - tables = sqlLab.tables.reduce((merged, table) => { - const expanded = !expandedTables.has(table.queryEditorId); - if (expanded) { - expandedTables.add(table.queryEditorId); - } - return { - ...merged, - [table.id]: { - ...tables[table.id], - ...table, - expanded, - }, - }; - }, tables); - Object.values(sqlLab.queries).forEach(query => { - queries[query.id] = { ...query, inLocalStorage: true }; - }); - tabHistory.push(...sqlLab.tabHistory); + if (sqlLab.queryEditors.length === 0) { + // migration was successful + localStorage.removeItem('redux'); + } else { + unsavedQueryEditor = sqlLab.unsavedQueryEditor || unsavedQueryEditor; + // add query editors and tables to state with a special flag so they can + // be migrated if the `SQLLAB_BACKEND_PERSISTENCE` feature flag is on + sqlLab.queryEditors.forEach(qe => { + queryEditors = { + ...queryEditors, + [qe.id]: { + ...queryEditors[qe.id], + ...qe, + name: qe.title || qe.name, + ...(unsavedQueryEditor.id === qe.id && unsavedQueryEditor), + inLocalStorage: true, + loaded: true, + }, + }; + }); + const expandedTables = new Set(); + tables = sqlLab.tables.reduce((merged, table) => { + const expanded = !expandedTables.has(table.queryEditorId); + if (expanded) { + expandedTables.add(table.queryEditorId); + } + return { + ...merged, + [table.id]: { + ...tables[table.id], + ...table, + expanded, + }, + }; + }, tables); + Object.values(sqlLab.queries).forEach(query => { + queries[query.id] = { ...query, inLocalStorage: true }; + }); + tabHistory.push(...sqlLab.tabHistory); + } } + } catch (error) { + // continue regardless of error } return { diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.js b/superset-frontend/src/SqlLab/reducers/sqlLab.js index 4d27836da1191..84f82602b8b17 100644 --- a/superset-frontend/src/SqlLab/reducers/sqlLab.js +++ b/superset-frontend/src/SqlLab/reducers/sqlLab.js @@ -423,13 +423,16 @@ export default function sqlLabReducer(state = {}, action) { return { ...state, activeSouthPaneTab: action.tabId }; }, [actions.MIGRATE_QUERY_EDITOR]() { - // remove migrated query editor from localStorage - const { sqlLab } = JSON.parse(localStorage.getItem('redux')); - sqlLab.queryEditors = sqlLab.queryEditors.filter( - qe => qe.id !== action.oldQueryEditor.id, - ); - localStorage.setItem('redux', JSON.stringify({ sqlLab })); - + try { + // remove migrated query editor from localStorage + const { sqlLab } = JSON.parse(localStorage.getItem('redux')); + sqlLab.queryEditors = sqlLab.queryEditors.filter( + qe => qe.id !== action.oldQueryEditor.id, + ); + localStorage.setItem('redux', JSON.stringify({ sqlLab })); + } catch (error) { + // continue regardless of error + } // replace localStorage query editor with the server backed one return addToArr( removeFromArr(state, 'queryEditors', action.oldQueryEditor), @@ -438,12 +441,16 @@ export default function sqlLabReducer(state = {}, action) { ); }, [actions.MIGRATE_TABLE]() { - // remove migrated table from localStorage - const { sqlLab } = JSON.parse(localStorage.getItem('redux')); - sqlLab.tables = sqlLab.tables.filter( - table => table.id !== action.oldTable.id, - ); - localStorage.setItem('redux', JSON.stringify({ sqlLab })); + try { + // remove migrated table from localStorage + const { sqlLab } = JSON.parse(localStorage.getItem('redux')); + sqlLab.tables = sqlLab.tables.filter( + table => table.id !== action.oldTable.id, + ); + localStorage.setItem('redux', JSON.stringify({ sqlLab })); + } catch (error) { + // continue regardless of error + } // replace localStorage table with the server backed one return addToArr( @@ -453,12 +460,16 @@ export default function sqlLabReducer(state = {}, action) { ); }, [actions.MIGRATE_TAB_HISTORY]() { - // remove migrated tab from localStorage tabHistory - const { sqlLab } = JSON.parse(localStorage.getItem('redux')); - sqlLab.tabHistory = sqlLab.tabHistory.filter( - tabId => tabId !== action.oldId, - ); - localStorage.setItem('redux', JSON.stringify({ sqlLab })); + try { + // remove migrated tab from localStorage tabHistory + const { sqlLab } = JSON.parse(localStorage.getItem('redux')); + sqlLab.tabHistory = sqlLab.tabHistory.filter( + tabId => tabId !== action.oldId, + ); + localStorage.setItem('redux', JSON.stringify({ sqlLab })); + } catch (error) { + // continue regardless of error + } const tabHistory = state.tabHistory.filter( tabId => tabId !== action.oldId, ); diff --git a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx index 1d85c8235fd6e..80ed37a30170f 100644 --- a/superset-frontend/src/explore/components/DatasourcePanel/index.tsx +++ b/superset-frontend/src/explore/components/DatasourcePanel/index.tsx @@ -336,7 +336,11 @@ export default function DataSourcePanel({ ); const showInfoboxCheck = () => { - if (sessionStorage.getItem('showInfobox') === 'false') return false; + try { + if (sessionStorage.getItem('showInfobox') === 'false') return false; + } catch (error) { + // continue regardless of error + } return true; }; @@ -366,7 +370,13 @@ export default function DataSourcePanel({ sessionStorage.setItem('showInfobox', 'false')} + onClose={() => { + try { + sessionStorage.setItem('showInfobox', 'false'); + } catch (error) { + // continue regardless of error + } + }} type="info" message="" description={ diff --git a/superset-frontend/src/explore/components/SaveModal.tsx b/superset-frontend/src/explore/components/SaveModal.tsx index 86ff27bb42e3e..d390e4638894c 100644 --- a/superset-frontend/src/explore/components/SaveModal.tsx +++ b/superset-frontend/src/explore/components/SaveModal.tsx @@ -119,7 +119,12 @@ class SaveModal extends React.Component { async componentDidMount() { let { dashboardId } = this.props; if (!dashboardId) { - const lastDashboard = sessionStorage.getItem(SK_DASHBOARD_ID); + let lastDashboard = null; + try { + lastDashboard = sessionStorage.getItem(SK_DASHBOARD_ID); + } catch (error) { + // continue regardless of error + } dashboardId = lastDashboard && parseInt(lastDashboard, 10); } if (dashboardId) { @@ -249,10 +254,14 @@ class SaveModal extends React.Component { ); } - if (dashboard) { - sessionStorage.setItem(SK_DASHBOARD_ID, `${dashboard.id}`); - } else { - sessionStorage.removeItem(SK_DASHBOARD_ID); + try { + if (dashboard) { + sessionStorage.setItem(SK_DASHBOARD_ID, `${dashboard.id}`); + } else { + sessionStorage.removeItem(SK_DASHBOARD_ID); + } + } catch (error) { + // continue regardless of error } // Go to new dashboard url diff --git a/superset-frontend/src/hooks/useTabId.ts b/superset-frontend/src/hooks/useTabId.ts index 4f60763c88875..56857cca64b1a 100644 --- a/superset-frontend/src/hooks/useTabId.ts +++ b/superset-frontend/src/hooks/useTabId.ts @@ -49,16 +49,29 @@ export function useTabId() { } const updateTabId = () => { - const lastTabId = window.localStorage.getItem('last_tab_id'); + let lastTabId; + try { + lastTabId = window.localStorage.getItem('last_tab_id'); + } catch (error) { + // continue regardless of error + } const newTabId = String( lastTabId ? Number.parseInt(lastTabId, 10) + 1 : 1, ); - window.sessionStorage.setItem('tab_id', newTabId); - window.localStorage.setItem('last_tab_id', newTabId); + try { + window.sessionStorage.setItem('tab_id', newTabId); + window.localStorage.setItem('last_tab_id', newTabId); + } catch (error) { + // continue regardless of error + } setTabId(newTabId); }; - - const storedTabId = window.sessionStorage.getItem('tab_id'); + let storedTabId; + try { + storedTabId = window.sessionStorage.getItem('tab_id'); + } catch (error) { + // continue regardless of error + } if (storedTabId) { channel.postMessage({ type: 'REQUESTING_TAB_ID',