addons/isl/src/ChangedFileDisplayTypePicker.tsxblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import {Button} from 'isl-components/Button';
b69ab319import {Icon} from 'isl-components/Icon';
b69ab3110import {isMac} from 'isl-components/OperatingSystem';
b69ab3111import {Tooltip} from 'isl-components/Tooltip';
b69ab3112import {useAtom} from 'jotai';
b69ab3113import {useContextMenu} from 'shared/ContextMenu';
b69ab3114import {Row} from './ComponentUtils';
b69ab3115import {t, T} from './i18n';
b69ab3116import {configBackedAtom} from './jotaiUtils';
b69ab3117
b69ab3118export type ChangedFilesDisplayType = 'short' | 'fullPaths' | 'tree' | 'fish';
b69ab3119
b69ab3120export const defaultChangedFilesDisplayType: ChangedFilesDisplayType = 'short';
b69ab3121
b69ab3122export const changedFilesDisplayType = configBackedAtom<ChangedFilesDisplayType>(
b69ab3123 'isl.changedFilesDisplayType',
b69ab3124 defaultChangedFilesDisplayType,
b69ab3125);
b69ab3126
b69ab3127type ChangedFileDisplayTypeOption = {icon: string; label: JSX.Element};
b69ab3128const ChangedFileDisplayTypeOptions: Record<ChangedFilesDisplayType, ChangedFileDisplayTypeOption> =
b69ab3129 {
b69ab3130 short: {icon: 'list-selection', label: <T>Short file names</T>},
b69ab3131 fullPaths: {icon: 'menu', label: <T>Full file paths</T>},
b69ab3132 tree: {icon: 'list-tree', label: <T>Tree</T>},
b69ab3133 fish: {icon: 'whole-word', label: <T>One-letter directories</T>},
b69ab3134 };
b69ab3135const entries = Object.entries(ChangedFileDisplayTypeOptions) as Array<
b69ab3136 [ChangedFilesDisplayType, ChangedFileDisplayTypeOption]
b69ab3137>;
b69ab3138
b69ab3139export function ChangedFileDisplayTypePicker() {
b69ab3140 const [displayType, setDisplayType] = useAtom(changedFilesDisplayType);
b69ab3141
b69ab3142 const actions = entries.map(([type, options]) => ({
b69ab3143 label: (
b69ab3144 <Row>
b69ab3145 <Icon icon={displayType === type ? 'check' : 'blank'} slot="start" />
b69ab3146 <Icon icon={options.icon} slot="start" />
b69ab3147 {options.label}
b69ab3148 </Row>
b69ab3149 ),
b69ab3150 onClick: () => setDisplayType(type),
b69ab3151 }));
b69ab3152 const contextMenu = useContextMenu(() => actions);
b69ab3153
b69ab3154 return (
b69ab3155 <Tooltip
b69ab3156 title={t(
b69ab3157 isMac
b69ab3158 ? 'Change how file paths are displayed.\n\nTip: Hold the alt key to quickly see full file paths.'
b69ab3159 : 'Change how file paths are displayed.\n\nTip: Hold the ctrl key to quickly see full file paths.',
b69ab3160 )}>
b69ab3161 <Button
b69ab3162 icon
b69ab3163 className="changed-file-display-type-picker"
b69ab3164 data-testid="changed-file-display-type-picker"
b69ab3165 onClick={contextMenu}>
b69ab3166 <Icon icon={ChangedFileDisplayTypeOptions[displayType].icon} />
b69ab3167 </Button>
b69ab3168 </Tooltip>
b69ab3169 );
b69ab3170}