import * as React from 'react'; import { useState, useEffect } from 'react'; import ButtonBar from '../ConfigScreen/ButtonBar'; import { _ } from '@joplin/lib/locale'; const { connect } = require('react-redux'); const Setting = require('@joplin/lib/models/Setting').default; const bridge = require('electron').remote.require('./bridge').default; const { themeStyle } = require('@joplin/lib/theme'); const { ReportService } = require('@joplin/lib/services/report.js'); const fs = require('fs-extra'); interface Props { themeId: string; style: any; dispatch: Function; } async function exportDebugReportClick() { const filename = `syncReport-${new Date().getTime()}.csv`; const filePath = bridge().showSaveDialog({ title: _('Please select where the sync status should be exported to'), defaultPath: filename, }); if (!filePath) return; const service = new ReportService(); const csv = await service.basicItemList({ format: 'csv' }); await fs.writeFileSync(filePath, csv); } function StatusScreen(props: Props) { const [report, setReport] = useState([]); async function resfreshScreen() { const service = new ReportService(); const r = await service.status(Setting.value('sync.target')); setReport(r); } useEffect(() => { resfreshScreen(); }, []); const theme = themeStyle(props.themeId); const style = { ...props.style, display: 'flex', flexDirection: 'column', }; const retryStyle = Object.assign({}, theme.urlStyle, { marginLeft: 5 }); const retryAllStyle = Object.assign({}, theme.urlStyle, { marginTop: 5, display: 'inline-block' }); const containerPadding = theme.configScreenPadding; const containerStyle = Object.assign({}, theme.containerStyle, { padding: containerPadding, flex: 1, }); function renderSectionTitleHtml(key: string, title: string) { return (

{title}

); } function renderSectionRetryAllHtml(key: string, retryAllHandler: any) { return ( {_('Retry All')} ); } const renderSectionHtml = (key: string, section: any) => { const itemsHtml = []; itemsHtml.push(renderSectionTitleHtml(section.title, section.title)); for (const n in section.body) { if (!section.body.hasOwnProperty(n)) continue; const item = section.body[n]; let text = ''; let retryLink = null; if (typeof item === 'object') { if (item.canRetry) { const onClick = async () => { await item.retryHandler(); resfreshScreen(); }; retryLink = ( {_('Retry')} ); } text = item.text; } else { text = item; } if (!text) text = '\xa0'; itemsHtml.push(
{text} {retryLink}
); } if (section.canRetryAll) { itemsHtml.push(renderSectionRetryAllHtml(section.title, section.retryAllHandler)); } return
{itemsHtml}
; }; function renderBodyHtml(report: any) { const sectionsHtml = []; for (let i = 0; i < report.length; i++) { const section = report[i]; if (!section.body.length) continue; sectionsHtml.push(renderSectionHtml(`${i}`, section)); } return
{sectionsHtml}
; } const body = renderBodyHtml(report); return (
exportDebugReportClick()} href="#"> Export debug report {body}
props.dispatch({ type: 'NAV_BACK' })} />
); } const mapStateToProps = (state: any) => { return { themeId: state.settings.theme, settings: state.settings, locale: state.settings.locale, }; }; export default connect(mapStateToProps)(StatusScreen);