diff --git a/src/App.tsx b/src/App.tsx index 983c21190..dbfd7d910 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -93,7 +93,13 @@ export class App extends React.Component { return ; case ACTIVE_SHEET_SHARE_DATA: return ( - + ); case ACTIVE_SHEET_SHARE_DATA_IN_FILE: return this.props.share && this.props.share.type === 'file' ? ( diff --git a/src/MenuBar.tsx b/src/MenuBar.tsx index 6a1e533cd..45a8e39d1 100644 --- a/src/MenuBar.tsx +++ b/src/MenuBar.tsx @@ -196,7 +196,11 @@ function getTemplate( return; } store.dispatch( - setSelectPluginsToExportActiveSheet({type: 'file', file: file}), + setSelectPluginsToExportActiveSheet({ + type: 'file', + file: file, + closeOnFinish: false, + }), ); }, ); @@ -208,7 +212,12 @@ function getTemplate( label: 'Sharable Link', accelerator: 'CommandOrControl+Shift+E', click: function() { - store.dispatch(setSelectPluginsToExportActiveSheet({type: 'link'})); + store.dispatch( + setSelectPluginsToExportActiveSheet({ + type: 'link', + closeOnFinish: false, + }), + ); }, }); } diff --git a/src/chrome/ExportDataPluginSheet.tsx b/src/chrome/ExportDataPluginSheet.tsx index 7f7e2cbe0..7686423ac 100644 --- a/src/chrome/ExportDataPluginSheet.tsx +++ b/src/chrome/ExportDataPluginSheet.tsx @@ -37,7 +37,10 @@ type StateFromProps = { type DispatchFromProps = { selectedPlugins: (payload: Array) => void; setActiveSheet: (payload: ActiveSheet) => void; - setExportDataToFileActiveSheet: (payload: string) => void; + setExportDataToFileActiveSheet: (payload: { + file: string; + closeOnFinish: boolean; + }) => void; }; type Props = OwnProps & StateFromProps & DispatchFromProps; @@ -61,7 +64,10 @@ class ExportDataPluginSheet extends Component { case 'file': { const file = share.file; if (file) { - this.props.setExportDataToFileActiveSheet(file); + this.props.setExportDataToFileActiveSheet({ + file, + closeOnFinish: true, + }); } else { console.error('share.file is undefined'); } @@ -100,7 +106,10 @@ export default connect( setActiveSheet: (payload: ActiveSheet) => { dispatch(getActiveSheetAction(payload)); }, - setExportDataToFileActiveSheet: (payload: string) => { + setExportDataToFileActiveSheet: (payload: { + file: string; + closeOnFinish: boolean; + }) => { dispatch(getExportDataToFileActiveSheetAction(payload)); }, }), diff --git a/src/chrome/ShareSheetExportUrl.tsx b/src/chrome/ShareSheetExportUrl.tsx index beda6a2b1..a499b09dd 100644 --- a/src/chrome/ShareSheetExportUrl.tsx +++ b/src/chrome/ShareSheetExportUrl.tsx @@ -69,6 +69,7 @@ const ErrorMessage = styled(Text)({ type Props = { onHide: () => any; logger: Logger; + closeOnFinish: boolean; }; type State = { @@ -162,6 +163,24 @@ export default class ShareSheetExportUrl extends Component { } } + sheetHidden: boolean = false; + + hideSheet = () => { + this.sheetHidden = true; + this.props.onHide(); + this.idler.cancel(); + }; + + componentDidUpdate() { + const {result} = this.state; + if (!result || !(result as DataExportResult).flipperUrl) { + return; + } + if (!this.sheetHidden && this.props.closeOnFinish) { + this.hideSheet(); + } + } + renderPending(cancelAndHide: () => void, statusUpdate: string | null) { return ( { render() { const cancelAndHide = () => { this.context.store.dispatch(unsetShare()); - this.props.onHide(); - this.idler.cancel(); + this.hideSheet(); }; + const {result, statusUpdate, errorArray} = this.state; if (!result || !(result as DataExportResult).flipperUrl) { return this.renderPending(cancelAndHide, statusUpdate); diff --git a/src/reducers/application.tsx b/src/reducers/application.tsx index 27e41336d..3d49d0bfa 100644 --- a/src/reducers/application.tsx +++ b/src/reducers/application.tsx @@ -63,6 +63,7 @@ type SubShareType = export type ShareType = { statusComponent?: React.ReactNode; + closeOnFinish: boolean; } & SubShareType; export type State = { @@ -99,7 +100,7 @@ export type Action = } | { type: typeof ACTIVE_SHEET_SHARE_DATA_IN_FILE; - payload: {file: string}; + payload: {file: string; closeOnFinish: boolean}; } | { type: typeof ACTIVE_SHEET_SELECT_PLUGINS_TO_EXPORT; @@ -219,7 +220,11 @@ export default function reducer( return { ...state, activeSheet: ACTIVE_SHEET_SHARE_DATA_IN_FILE, - share: {type: 'file', file: action.payload.file}, + share: { + type: 'file', + file: action.payload.file, + closeOnFinish: action.payload.closeOnFinish, + }, }; } else if (action.type === ACTIVE_SHEET_SELECT_PLUGINS_TO_EXPORT) { return { @@ -311,9 +316,12 @@ export const setSelectPluginsToExportActiveSheet = ( payload, }); -export const setExportDataToFileActiveSheet = (file: string): Action => ({ +export const setExportDataToFileActiveSheet = (payload: { + file: string; + closeOnFinish: boolean; +}): Action => ({ type: ACTIVE_SHEET_SHARE_DATA_IN_FILE, - payload: {file}, + payload: payload, }); export const setActiveSheet = (payload: ActiveSheet): Action => ({