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'); import Setting from '@joplin/lib/models/Setting'; const { themeStyle } = require('@joplin/lib/theme'); import ReportService from '@joplin/lib/services/ReportService'; import Button, { ButtonLevel } from '../Button/Button'; import bridge from '../../services/bridge'; const fs = require('fs-extra'); import styled from 'styled-components'; interface Props { themeId: string; style: any; dispatch: Function; } const StyledAdvancedToolItem = styled.div` margin-bottom: 1em; `; 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(() => { void 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)); let currentListKey = ''; let listItems: any[] = []; for (const n in section.body) { if (!section.body.hasOwnProperty(n)) continue; const item = section.body[n]; let text = ''; let retryLink = null; let itemType = null; if (typeof item === 'object') { if (item.canRetry) { const onClick = async () => { await item.retryHandler(); void resfreshScreen(); }; retryLink = ( {_('Retry')} ); } text = item.text; itemType = item.type; } else { text = item; } if (itemType === 'openList') { currentListKey = item.key; continue; } if (itemType === 'closeList') { itemsHtml.push(); currentListKey = ''; listItems = []; continue; } if (!text) text = '\xa0'; if (currentListKey) { listItems.push(
  • {text} {retryLink}
  • ); } else { 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}
    ; } function renderTools() { return (

    {_('Advanced tools')}

    ); } const body = renderBodyHtml(report); return (
    {renderTools()} {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);