addons/isl/src/SelectAllCommits.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 {Kbd} from 'isl-components/Kbd';
b69ab3111import {KeyCode, Modifier} from 'isl-components/KeyboardShortcuts';
b69ab3112import {Tooltip} from 'isl-components/Tooltip';
b69ab3113import {useCallback} from 'react';
b69ab3114import {useCommand} from './ISLShortcuts';
b69ab3115import {islDrawerState} from './drawerState';
b69ab3116import {t, T} from './i18n';
b69ab3117import {readAtom, writeAtom} from './jotaiUtils';
b69ab3118import {dagWithPreviews} from './previews';
b69ab3119import {selectedCommits} from './selection';
b69ab3120
b69ab3121/** By default, "select all" selects draft, non-obsoleted commits. */
b69ab3122function getSelectAllCommitHashSet(): Set<string> {
b69ab3123 const dag = readAtom(dagWithPreviews);
b69ab3124 return new Set(
b69ab3125 dag
b69ab3126 .nonObsolete(dag.draft())
b69ab3127 .toArray()
b69ab3128 .filter(hash => !hash.startsWith('OPTIMISTIC')),
b69ab3129 );
b69ab3130}
b69ab3131
b69ab3132export function useSelectAllCommitsShortcut() {
b69ab3133 const cb = useSelectAllCommits();
b69ab3134 useCommand('SelectAllCommits', cb);
b69ab3135}
b69ab3136
b69ab3137export function useSelectAllCommits() {
b69ab3138 return useCallback(() => {
b69ab3139 const draftCommits = getSelectAllCommitHashSet();
b69ab3140 writeAtom(selectedCommits, draftCommits);
b69ab3141 // pop open sidebar so you can act on the bulk selection
b69ab3142 writeAtom(islDrawerState, last => ({
b69ab3143 ...last,
b69ab3144 right: {
b69ab3145 ...last.right,
b69ab3146 collapsed: false,
b69ab3147 },
b69ab3148 }));
b69ab3149 }, []);
b69ab3150}
b69ab3151
b69ab3152export function SelectAllButton({dismiss}: {dismiss: () => unknown}) {
b69ab3153 const onClick = useSelectAllCommits();
b69ab3154 return (
b69ab3155 <Tooltip
b69ab3156 title={t(
b69ab3157 'Select all draft commits. This allows more granular bulk manipulations in the sidebar.',
b69ab3158 )}>
b69ab3159 <Button
b69ab3160 data-testid="select-all-button"
b69ab3161 onClick={() => {
b69ab3162 onClick();
b69ab3163 dismiss();
b69ab3164 }}>
b69ab3165 <Icon icon="check-all" slot="start" />
b69ab3166 <T>Select all commits</T>
b69ab3167 <Kbd keycode={KeyCode.A} modifiers={[Modifier.ALT]} />
b69ab3168 </Button>
b69ab3169 </Tooltip>
b69ab3170 );
b69ab3171}