import * as React from 'react'; import DismissibleDialog, { DialogVariant } from '../DismissibleDialog'; import { AppState } from '../../utils/types'; import { connect } from 'react-redux'; import { Dispatch } from 'redux'; import { useCallback } from 'react'; import { Icon, Text } from 'react-native-paper'; import { _ } from '@joplin/lib/locale'; import JoplinCloudIcon from './JoplinCloudIcon'; import NavService from '@joplin/lib/services/NavService'; import { Platform, StyleSheet, View } from 'react-native'; import CardButton from '../buttons/CardButton'; import Setting from '@joplin/lib/models/Setting'; import shim from '@joplin/lib/shim'; interface Props { dispatch: Dispatch; visible: boolean; themeId: number; } const iconSize = 24; const styles = StyleSheet.create({ titleContainer: { flexDirection: 'row', gap: 8, paddingBottom: 6, alignItems: 'center', }, subheading: { marginBottom: 24, }, cardContent: { padding: 12, borderRadius: 14, }, syncProviderList: { gap: 8, }, featuresList: { marginTop: 4, }, listItem: { flexDirection: 'row', gap: 8, marginVertical: 6, verticalAlign: 'middle', }, }); const isAppJoplinCloud = () => { return Setting.value('isJoplinCloudWebApp'); }; const useShouldShowOtherButton = () => { // Don't show "other" when hosted on Joplin Cloud (other sync // targets can still be selected from settings). return !isAppJoplinCloud(); }; interface SyncProviderProps { title: string; icon: ()=> React.ReactNode; description: string|null; onPress: ()=> void; featuresList: string[]; disabled: boolean; } const SyncProvider: React.FC = props => { return {props.icon()} {props.title}{props.disabled ? ' (Not supported)' : ''} {props.description && {props.description}} {props.featuresList.map((feature, index) => ( {feature} ))} ; }; const SyncWizard: React.FC = ({ themeId, visible, dispatch }) => { const onDismiss = useCallback(() => { dispatch({ type: 'SYNC_WIZARD_VISIBLE_CHANGE', visible: false, }); }, [dispatch]); const onManualDismiss = useCallback(() => { Setting.setValue('sync.wizard.autoShowOnStartup', false); onDismiss(); }, [onDismiss]); const onSelectJoplinCloud = useCallback(async () => { onDismiss(); if (Platform.OS === 'web' && !isAppJoplinCloud()) { if (await shim.showConfirmationDialog( _('Self-hosted instances of the Joplin web app cannot sync with Joplin Cloud. Open the official web app?'), )) { await shim.openUrl('https://app.joplincloud.com/'); } } else { await NavService.go('JoplinCloudLogin'); } }, [onDismiss]); const onSelectOtherTarget = useCallback(async () => { onDismiss(); await NavService.go('Config', { sectionName: 'sync' }); }, [onDismiss]); const showOther = useShouldShowOtherButton(); const isJoplinCloud = isAppJoplinCloud(); return { isJoplinCloud ? _('You can synchronise your notes using Joplin Cloud, which also gives access to Joplin-specific features such as publishing notes or collaborating on notebooks with others.') : _('Joplin can synchronise your notes using various providers. Select one from the list below.') } } onPress={onSelectJoplinCloud} disabled={false} /> {showOther && } featuresList={[]} onPress={onSelectOtherTarget} disabled={false} />} ; }; export default connect((state: AppState) => ({ visible: state.syncWizardVisible, themeId: state.settings.theme, }))(SyncWizard);