mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-24 10:27:10 +02:00
Adjust file picker control styles
This commit is contained in:
parent
00cbe5aaf8
commit
f56d022930
@ -12,11 +12,13 @@ import type FsDriverWeb from '../../../utils/fs-driver/fs-driver-rn.web';
|
|||||||
import { IconButton, TouchableRipple } from 'react-native-paper';
|
import { IconButton, TouchableRipple } from 'react-native-paper';
|
||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
|
||||||
|
type Mode = 'read'|'readwrite';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
themeId: number;
|
themeId: number;
|
||||||
styles: ConfigScreenStyles;
|
styles: ConfigScreenStyles;
|
||||||
settingMetadata: SettingItem;
|
settingMetadata: SettingItem;
|
||||||
mode: 'read'|'readwrite';
|
mode: Mode;
|
||||||
description: React.ReactNode|null;
|
description: React.ReactNode|null;
|
||||||
updateSettingValue: UpdateSettingValueCallback;
|
updateSettingValue: UpdateSettingValueCallback;
|
||||||
}
|
}
|
||||||
@ -26,6 +28,48 @@ type ExtendedSelf = (typeof window.self) & {
|
|||||||
};
|
};
|
||||||
declare const self: ExtendedSelf;
|
declare const self: ExtendedSelf;
|
||||||
|
|
||||||
|
const useFileSystemPath = (settingId: string, updateSettingValue: UpdateSettingValueCallback, accessMode: Mode) => {
|
||||||
|
const [fileSystemPath, setFileSystemPath] = useState<string>('');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setFileSystemPath(Setting.value(settingId));
|
||||||
|
}, [settingId]);
|
||||||
|
|
||||||
|
const showDirectoryPicker = useCallback(async () => {
|
||||||
|
if (shim.mobilePlatform() === 'web') {
|
||||||
|
// Directory picker IDs can't include certain characters.
|
||||||
|
const pickerId = `setting-${settingId}`.replace(/[^a-zA-Z]/g, '_');
|
||||||
|
const handle = await self.showDirectoryPicker({ id: pickerId, mode: accessMode });
|
||||||
|
const fsDriver = shim.fsDriver() as FsDriverWeb;
|
||||||
|
const uri = await fsDriver.mountExternalDirectory(handle, pickerId, accessMode);
|
||||||
|
await updateSettingValue(settingId, uri);
|
||||||
|
setFileSystemPath(uri);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
const doc = await openDocumentTree(true);
|
||||||
|
if (doc?.uri) {
|
||||||
|
setFileSystemPath(doc.uri);
|
||||||
|
await updateSettingValue(settingId, doc.uri);
|
||||||
|
} else {
|
||||||
|
throw new Error('User cancelled operation');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
reg.logger().info('Didn\'t pick sync dir: ', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [updateSettingValue, settingId, accessMode]);
|
||||||
|
|
||||||
|
const clearPath = useCallback(() => {
|
||||||
|
setFileSystemPath('');
|
||||||
|
void updateSettingValue(settingId, '');
|
||||||
|
}, [updateSettingValue, settingId]);
|
||||||
|
|
||||||
|
// Supported on Android and some versions of Chrome
|
||||||
|
const supported = shim.fsDriver().isUsingAndroidSAF() || (shim.mobilePlatform() === 'web' && 'showDirectoryPicker' in self);
|
||||||
|
|
||||||
|
return { clearPath, showDirectoryPicker, fileSystemPath, supported };
|
||||||
|
};
|
||||||
|
|
||||||
const pathSelectorStyles = StyleSheet.create({
|
const pathSelectorStyles = StyleSheet.create({
|
||||||
innerContainer: {
|
innerContainer: {
|
||||||
paddingTop: 0,
|
paddingTop: 0,
|
||||||
@ -36,7 +80,8 @@ const pathSelectorStyles = StyleSheet.create({
|
|||||||
mainButton: {
|
mainButton: {
|
||||||
flexGrow: 1,
|
flexGrow: 1,
|
||||||
flexShrink: 1,
|
flexShrink: 1,
|
||||||
padding: 22,
|
paddingHorizontal: 16,
|
||||||
|
paddingVertical: 22,
|
||||||
margin: 0,
|
margin: 0,
|
||||||
},
|
},
|
||||||
buttonContent: {
|
buttonContent: {
|
||||||
@ -45,48 +90,8 @@ const pathSelectorStyles = StyleSheet.create({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const FileSystemPathSelector: FunctionComponent<Props> = props => {
|
const FileSystemPathSelector: FunctionComponent<Props> = props => {
|
||||||
const [fileSystemPath, setFileSystemPath] = useState<string>('');
|
|
||||||
|
|
||||||
const settingId = props.settingMetadata.key;
|
const settingId = props.settingMetadata.key;
|
||||||
|
const { clearPath, showDirectoryPicker, fileSystemPath, supported } = useFileSystemPath(settingId, props.updateSettingValue, props.mode);
|
||||||
useEffect(() => {
|
|
||||||
setFileSystemPath(Setting.value(settingId));
|
|
||||||
}, [settingId]);
|
|
||||||
|
|
||||||
const selectDirectoryButtonPress = useCallback(async () => {
|
|
||||||
if (shim.mobilePlatform() === 'web') {
|
|
||||||
// Directory picker IDs can't include certain characters.
|
|
||||||
const pickerId = `setting-${settingId}`.replace(/[^a-zA-Z]/g, '_');
|
|
||||||
const handle = await self.showDirectoryPicker({ id: pickerId, mode: props.mode });
|
|
||||||
const fsDriver = shim.fsDriver() as FsDriverWeb;
|
|
||||||
const uri = await fsDriver.mountExternalDirectory(handle, pickerId, props.mode);
|
|
||||||
await props.updateSettingValue(settingId, uri);
|
|
||||||
setFileSystemPath(uri);
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
const doc = await openDocumentTree(true);
|
|
||||||
if (doc?.uri) {
|
|
||||||
setFileSystemPath(doc.uri);
|
|
||||||
await props.updateSettingValue(settingId, doc.uri);
|
|
||||||
} else {
|
|
||||||
throw new Error('User cancelled operation');
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
reg.logger().info('Didn\'t pick sync dir: ', e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, [props.updateSettingValue, settingId, props.mode]);
|
|
||||||
|
|
||||||
const clearPathButtonPress = useCallback(() => {
|
|
||||||
setFileSystemPath('');
|
|
||||||
void props.updateSettingValue(settingId, '');
|
|
||||||
}, [props.updateSettingValue, settingId]);
|
|
||||||
|
|
||||||
// Supported on Android and some versions of Chrome
|
|
||||||
const supported = shim.fsDriver().isUsingAndroidSAF() || (shim.mobilePlatform() === 'web' && 'showDirectoryPicker' in self);
|
|
||||||
if (!supported) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const styleSheet = props.styles.styleSheet;
|
const styleSheet = props.styles.styleSheet;
|
||||||
|
|
||||||
@ -94,7 +99,7 @@ const FileSystemPathSelector: FunctionComponent<Props> = props => {
|
|||||||
<IconButton
|
<IconButton
|
||||||
icon='delete'
|
icon='delete'
|
||||||
accessibilityLabel={_('Clear')}
|
accessibilityLabel={_('Clear')}
|
||||||
onPress={clearPathButtonPress}
|
onPress={clearPath}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -102,7 +107,7 @@ const FileSystemPathSelector: FunctionComponent<Props> = props => {
|
|||||||
|
|
||||||
const control = <View style={[containerStyles.innerContainer, pathSelectorStyles.innerContainer]}>
|
const control = <View style={[containerStyles.innerContainer, pathSelectorStyles.innerContainer]}>
|
||||||
<TouchableRipple
|
<TouchableRipple
|
||||||
onPress={selectDirectoryButtonPress}
|
onPress={showDirectoryPicker}
|
||||||
style={pathSelectorStyles.mainButton}
|
style={pathSelectorStyles.mainButton}
|
||||||
role='button'
|
role='button'
|
||||||
>
|
>
|
||||||
@ -119,6 +124,7 @@ const FileSystemPathSelector: FunctionComponent<Props> = props => {
|
|||||||
</View>;
|
</View>;
|
||||||
|
|
||||||
if (!supported) return null;
|
if (!supported) return null;
|
||||||
|
|
||||||
return <View style={containerStyles.outerContainer}>
|
return <View style={containerStyles.outerContainer}>
|
||||||
{control}
|
{control}
|
||||||
{props.description}
|
{props.description}
|
||||||
|
Loading…
Reference in New Issue
Block a user