diff --git a/addons/isl/src/CommandHistoryAndProgress.tsx b/addons/isl/src/CommandHistoryAndProgress.tsx index 603241f8a1dbd..51d948f0119c5 100644 --- a/addons/isl/src/CommandHistoryAndProgress.tsx +++ b/addons/isl/src/CommandHistoryAndProgress.tsx @@ -14,8 +14,8 @@ import {Tooltip} from './Tooltip'; import {codeReviewProvider} from './codeReview/CodeReviewInfo'; import {T, t} from './i18n'; import { - operationListJotai, - queuedOperationsJotai, + operationList, + queuedOperations, repositoryInfo, useAbortRunningOperation, } from './serverAPIState'; @@ -87,8 +87,8 @@ function OperationDescription(props: { } export function CommandHistoryAndProgress() { - const list = useAtomValue(operationListJotai); - const queued = useAtomValue(queuedOperationsJotai); + const list = useAtomValue(operationList); + const queued = useAtomValue(queuedOperations); const abortRunningOperation = useAbortRunningOperation(); const info = useAtomValue(repositoryInfo); diff --git a/addons/isl/src/Commit.tsx b/addons/isl/src/Commit.tsx index b657dc72df27f..8e459925adec9 100644 --- a/addons/isl/src/Commit.tsx +++ b/addons/isl/src/Commit.tsx @@ -45,7 +45,7 @@ import { isFetchingUncommittedChanges, latestDag, latestUncommittedChanges, - operationBeingPreviewedJotai, + operationBeingPreviewed, useRunOperation, useRunPreviewedOperation, } from './serverAPIState'; @@ -260,7 +260,7 @@ export const Commit = memo( label: hasChildren ? Hide Commit and Descendants : Hide Commit, onClick: () => writeAtom( - operationBeingPreviewedJotai, + operationBeingPreviewed, new HideOperation(latestSuccessorUnlessExplicitlyObsolete(commit)), ), }); @@ -672,7 +672,7 @@ function DraggableCommit({ commit.remoteBookmarks.length > 0 ? succeedableRevset(commit.remoteBookmarks[0]) : latestSuccessorUnlessExplicitlyObsolete(commit); - writeAtom(operationBeingPreviewedJotai, op => { + writeAtom(operationBeingPreviewed, op => { const newRebase = new RebaseOperation( latestSuccessorUnlessExplicitlyObsolete(beingDragged), destination, diff --git a/addons/isl/src/CommitTreeList.tsx b/addons/isl/src/CommitTreeList.tsx index f5bf8a8226cb7..6639dc5a475f0 100644 --- a/addons/isl/src/CommitTreeList.tsx +++ b/addons/isl/src/CommitTreeList.tsx @@ -32,7 +32,7 @@ import { commitFetchError, commitsShownRange, isFetchingAdditionalCommits, - latestUncommittedChangesDataJotai, + latestUncommittedChangesData, useRunOperation, } from './serverAPIState'; import {MaybeEditStackModal} from './stackEdit/ui/EditStackModal'; @@ -181,7 +181,7 @@ export function CommitTreeList() { // so we don't miss the first returned uncommitted changes message. // TODO: This is a little ugly, is there a better way to tell recoil to start the subscription immediately? // Or should we queue/cache messages? - useAtomValue(latestUncommittedChangesDataJotai); + useAtomValue(latestUncommittedChangesData); const renderer = useAtomValue(configGraphRenderer); useMarkOperationsCompleted(); diff --git a/addons/isl/src/StackActions.tsx b/addons/isl/src/StackActions.tsx index b1bcd8f96881a..ee600862c85e8 100644 --- a/addons/isl/src/StackActions.tsx +++ b/addons/isl/src/StackActions.tsx @@ -20,7 +20,7 @@ import {SyncStatus, syncStatusAtom} from './codeReview/syncStatus'; import {T, t} from './i18n'; import {IconStack} from './icons/IconStack'; import {dagWithPreviews} from './previews'; -import {useRunOperation, latestUncommittedChangesDataJotai} from './serverAPIState'; +import {useRunOperation, latestUncommittedChangesData} from './serverAPIState'; import {useConfirmUnsavedEditsBeforeSplit} from './stackEdit/ui/ConfirmUnsavedEditsBeforeSplit'; import {StackEditIcon} from './stackEdit/ui/StackEditIcon'; import {editingStackIntentionHashes, loadingStackState} from './stackEdit/ui/stackEditState'; @@ -249,7 +249,7 @@ export function StackActions({hash}: {hash: Hash}): React.ReactElement | null { } function StackEditButton({info}: {info: DagCommitInfo}): React.ReactElement | null { - const uncommitted = useAtomValue(latestUncommittedChangesDataJotai); + const uncommitted = useAtomValue(latestUncommittedChangesData); const dag = useAtomValue(dagWithPreviews); const [[, stackHashes], setStackIntentionHashes] = useAtom(editingStackIntentionHashes); const loadingState = useAtomValue(loadingStackState); diff --git a/addons/isl/src/UncommittedChanges.tsx b/addons/isl/src/UncommittedChanges.tsx index 5b4196c70d7da..2d0109b7e65b2 100644 --- a/addons/isl/src/UncommittedChanges.tsx +++ b/addons/isl/src/UncommittedChanges.tsx @@ -59,7 +59,7 @@ import { import {selectedCommits} from './selection'; import { latestHeadCommit, - operationListJotai, + operationList, uncommittedChangesFetchError, useRunOperation, } from './serverAPIState'; @@ -745,7 +745,7 @@ function MergeConflictButtons({ // But only if the abort/continue command succeeded. // TODO: is this reliable? Is it possible to get stuck with buttons disabled because // we think it's still running? - const lastRunOperation = useAtomValue(operationListJotai).currentOperation; + const lastRunOperation = useAtomValue(operationList).currentOperation; const justFinishedContinue = lastRunOperation?.operation instanceof ContinueOperation && lastRunOperation.exitCode === 0; const justFinishedAbort = diff --git a/addons/isl/src/debug/DebugToolsMenu.tsx b/addons/isl/src/debug/DebugToolsMenu.tsx index 13627e67411a4..1cfd7a5c04b5b 100644 --- a/addons/isl/src/debug/DebugToolsMenu.tsx +++ b/addons/isl/src/debug/DebugToolsMenu.tsx @@ -23,8 +23,8 @@ import {dagWithPreviews} from '../previews'; import {RelativeDate} from '../relativeDate'; import { latestCommitsData, - latestUncommittedChangesDataJotai, - mergeConflictsJotai, + latestUncommittedChangesData, + mergeConflicts, repositoryInfo, } from '../serverAPIState'; import {ComponentExplorerButton} from './ComponentExplorer'; @@ -115,9 +115,9 @@ function ServerClientMessageLogging() { } function DebugPerfInfo() { - const latestStatus = useAtomValue(latestUncommittedChangesDataJotai); + const latestStatus = useAtomValue(latestUncommittedChangesData); const latestLog = useAtomValue(latestCommitsData); - const latestConflicts = useAtomValue(mergeConflictsJotai); + const latestConflicts = useAtomValue(mergeConflicts); const heartbeat = useHeartbeat(); const repoInfo = useAtomValue(repositoryInfo); let commandName = 'sl'; diff --git a/addons/isl/src/debug/getInterestingAtoms.ts b/addons/isl/src/debug/getInterestingAtoms.ts index 62d4284acdf4b..5c3ccff5d1ca0 100644 --- a/addons/isl/src/debug/getInterestingAtoms.ts +++ b/addons/isl/src/debug/getInterestingAtoms.ts @@ -14,13 +14,13 @@ import {readAtom} from '../jotaiUtils'; import {uncommittedSelection} from '../partialSelection'; import {selectedCommits} from '../selection'; import { - operationBeingPreviewedJotai, - jotaiRepositoryData, + operationBeingPreviewed, + repositoryData, latestCommitsData, - latestUncommittedChangesDataJotai, - mergeConflictsJotai, - operationListJotai, - queuedOperationsJotai, + latestUncommittedChangesData, + mergeConflicts, + operationList, + queuedOperations, } from '../serverAPIState'; import {SelfUpdate} from 'shared/immutableExt'; @@ -31,14 +31,14 @@ function listInterestingAtoms(): Array> { return [ allDiffSummaries, codeReviewProvider, - jotaiRepositoryData, + repositoryData, latestCommitsData, latestSuccessorsMapAtom, - latestUncommittedChangesDataJotai, - mergeConflictsJotai, - operationBeingPreviewedJotai, - operationListJotai, - queuedOperationsJotai, + latestUncommittedChangesData, + mergeConflicts, + operationBeingPreviewed, + operationList, + queuedOperations, selectedCommits, uncommittedSelection, // This is an atomFamily. Need extra work to read it. diff --git a/addons/isl/src/fold.tsx b/addons/isl/src/fold.tsx index 40ed810e4bac7..920efe01f1cf3 100644 --- a/addons/isl/src/fold.tsx +++ b/addons/isl/src/fold.tsx @@ -25,7 +25,7 @@ import { } from './operations/FoldOperation'; import {type Dag, dagWithPreviews} from './previews'; import {selectedCommits} from './selection'; -import {operationBeingPreviewedJotai, useRunPreviewedOperation} from './serverAPIState'; +import {operationBeingPreviewed, useRunPreviewedOperation} from './serverAPIState'; import {firstOfIterable} from './utils'; import {VSCodeButton} from '@vscode/webview-ui-toolkit/react'; import {atom, useAtomValue} from 'jotai'; @@ -87,7 +87,7 @@ export function FoldButton({commit}: {commit?: CommitInfo}) { foldable.map(commit => parseCommitMessageFields(schema, commit.title, commit.description)), ); const message = commitMessageFieldsToString(schema, messageFields); - writeAtom(operationBeingPreviewedJotai, new FoldOperation(foldable, message)); + writeAtom(operationBeingPreviewed, new FoldOperation(foldable, message)); writeAtom(selectedCommits, new Set([getFoldRangeCommitHash(foldable, /* isPreview */ true)])); }, [foldable]); if (foldable == null || (commit != null && foldable?.[0]?.hash !== commit.hash)) { @@ -108,7 +108,7 @@ export function FoldButton({commit}: {commit?: CommitInfo}) { * This allows running the fold operation to use the newly typed message. */ export function updateFoldedMessageWithEditedMessage(): FoldOperation | undefined { - const beingPreviewed = readAtom(operationBeingPreviewedJotai); + const beingPreviewed = readAtom(operationBeingPreviewed); if (beingPreviewed != null && beingPreviewed instanceof FoldOperation) { const range = beingPreviewed.getFoldRange(); const combinedHash = getFoldRangeCommitHash(range, /* isPreview */ true); diff --git a/addons/isl/src/previews.ts b/addons/isl/src/previews.ts index 3751b38480491..30da41e364912 100644 --- a/addons/isl/src/previews.ts +++ b/addons/isl/src/previews.ts @@ -19,12 +19,12 @@ import { latestUncommittedChanges, latestCommits, latestDag, - operationBeingPreviewedJotai, + operationBeingPreviewed, latestHeadCommit, - queuedOperationsJotai, - operationListJotai, - mergeConflictsJotai, - latestUncommittedChangesDataJotai, + queuedOperations, + operationList, + mergeConflicts, + latestUncommittedChangesData, latestCommitsData, } from './serverAPIState'; import {atom, useAtom, useAtomValue} from 'jotai'; @@ -207,17 +207,17 @@ function applyPreviewsToMergeConflicts( } export const uncommittedChangesWithPreviews = atom>(get => { - const list = get(operationListJotai); - const queued = get(queuedOperationsJotai); + const list = get(operationList); + const queued = get(queuedOperations); const uncommittedChanges = get(latestUncommittedChanges); return applyPreviewsToChangedFiles(uncommittedChanges, list, queued); }); export const optimisticMergeConflicts = atom(get => { - const list = get(operationListJotai); - const queued = get(queuedOperationsJotai); - const conflicts = get(mergeConflictsJotai); + const list = get(operationList); + const queued = get(queuedOperations); + const conflicts = get(mergeConflicts); if (conflicts?.files == null) { return conflicts; } @@ -246,11 +246,11 @@ export type {Dag}; export const dagWithPreviews = atom(get => { const originalDag = get(latestDag); - const list = get(operationListJotai); - const queued = get(queuedOperationsJotai); + const list = get(operationList); + const queued = get(queuedOperations); const currentOperation = list.currentOperation; const history = list.operationHistory; - const currentPreview = get(operationBeingPreviewedJotai); + const currentPreview = get(operationBeingPreviewed); let dag = originalDag; for (const op of optimisticOperations({history, queued, currentOperation})) { dag = op.optimisticDag(dag); @@ -322,11 +322,11 @@ function* optimisticOperations(props: { export function useMarkOperationsCompleted(): void { const fetchedCommits = useAtomValue(latestCommitsData); const commits = useAtomValue(latestCommits); - const uncommittedChanges = useAtomValue(latestUncommittedChangesDataJotai); - const conflicts = useAtomValue(mergeConflictsJotai); + const uncommittedChanges = useAtomValue(latestUncommittedChangesData); + const conflicts = useAtomValue(mergeConflicts); const successorMap = useAtomValue(latestSuccessorsMapAtom); - const [list, setOperationList] = useAtom(operationListJotai); + const [list, setOperationList] = useAtom(operationList); // Mark operations as completed when their optimistic applier is no longer needed // n.b. this must be a useEffect since React doesn't like setCurrentOperation getting called during render @@ -480,8 +480,8 @@ type Class = new (...args: any[]) => T; export function useIsOperationRunningOrQueued( cls: Class, ): 'running' | 'queued' | undefined { - const list = useAtomValue(operationListJotai); - const queued = useAtomValue(queuedOperationsJotai); + const list = useAtomValue(operationList); + const queued = useAtomValue(queuedOperations); if (list.currentOperation?.operation instanceof cls && list.currentOperation?.exitCode == null) { return 'running'; } else if (queued.some(op => op instanceof cls)) { @@ -491,8 +491,8 @@ export function useIsOperationRunningOrQueued( } export function useMostRecentPendingOperation(): Operation | undefined { - const list = useAtomValue(operationListJotai); - const queued = useAtomValue(queuedOperationsJotai); + const list = useAtomValue(operationList); + const queued = useAtomValue(queuedOperations); if (queued.length > 0) { return queued.at(-1); } diff --git a/addons/isl/src/selection.ts b/addons/isl/src/selection.ts index 83bc581edbbad..7752974c8eff7 100644 --- a/addons/isl/src/selection.ts +++ b/addons/isl/src/selection.ts @@ -16,7 +16,7 @@ import {islDrawerState} from './drawerState'; import {atomFamilyWeak, readAtom, writeAtom} from './jotaiUtils'; import {HideOperation} from './operations/HideOperation'; import {dagWithPreviews} from './previews'; -import {latestDag, operationBeingPreviewedJotai} from './serverAPIState'; +import {latestDag, operationBeingPreviewed} from './serverAPIState'; import {firstOfIterable, registerCleanup} from './utils'; import {atom, useAtomValue} from 'jotai'; import {useCallback} from 'react'; @@ -287,7 +287,7 @@ export function useBackspaceToHideSelected(): void { } writeAtom( - operationBeingPreviewedJotai, + operationBeingPreviewed, new HideOperation(latestSuccessorUnlessExplicitlyObsolete(commitToHide)), ); }, []); diff --git a/addons/isl/src/serverAPIState.ts b/addons/isl/src/serverAPIState.ts index 3b85f85896d32..a9a1884f9f440 100644 --- a/addons/isl/src/serverAPIState.ts +++ b/addons/isl/src/serverAPIState.ts @@ -37,22 +37,22 @@ import { import {initialParams} from './urlParams'; import {registerCleanup, registerDisposable, short} from './utils'; import {DEFAULT_DAYS_OF_COMMITS_TO_LOAD} from 'isl-server/src/constants'; -import {atom as jotaiAtom} from 'jotai'; +import {atom} from 'jotai'; import {useCallback} from 'react'; import {reuseEqualObjects} from 'shared/deepEqualExt'; import {defer, randomId} from 'shared/utils'; -export const jotaiRepositoryData = jotaiAtom<{info?: RepoInfo; cwd?: string}>({}); +export const repositoryData = atom<{info?: RepoInfo; cwd?: string}>({}); registerDisposable( - jotaiRepositoryData, + repositoryData, serverAPI.onMessageOfType('repoInfo', event => { - writeAtom(jotaiRepositoryData, {info: event.info, cwd: event.cwd}); + writeAtom(repositoryData, {info: event.info, cwd: event.cwd}); }), import.meta.hot, ); registerCleanup( - jotaiRepositoryData, + repositoryData, serverAPI.onSetup(() => serverAPI.postMessage({ type: 'requestRepoInfo', @@ -61,9 +61,9 @@ registerCleanup( import.meta.hot, ); -export const repositoryInfo = jotaiAtom( +export const repositoryInfo = atom( get => { - const data = get(jotaiRepositoryData); + const data = get(repositoryData); return data?.info; }, ( @@ -71,15 +71,15 @@ export const repositoryInfo = jotaiAtom( set, update: RepoInfo | undefined | ((_prev: RepoInfo | undefined) => RepoInfo | undefined), ) => { - const value = typeof update === 'function' ? update(get(jotaiRepositoryData)?.info) : update; - set(jotaiRepositoryData, last => ({ + const value = typeof update === 'function' ? update(get(repositoryData)?.info) : update; + set(repositoryData, last => ({ ...last, info: value, })); }, ); -export const applicationinfo = jotaiAtom(undefined); +export const applicationinfo = atom(undefined); registerDisposable( applicationinfo, serverAPI.onMessageOfType('applicationInfo', event => { @@ -97,7 +97,7 @@ registerCleanup( import.meta.hot, ); -export const reconnectingStatus = jotaiAtom({type: 'initializing'}); +export const reconnectingStatus = atom({type: 'initializing'}); registerDisposable( reconnectingStatus, messageBus.onChangeStatus(status => { @@ -106,8 +106,8 @@ registerDisposable( import.meta.hot, ); -export const serverCwd = jotaiAtom(get => { - const data = get(jotaiRepositoryData); +export const serverCwd = atom(get => { + const data = get(repositoryData); if (data.info?.type === 'cwdNotARepository') { return data.info.cwd; } @@ -174,7 +174,7 @@ function subscriptionEffect( }; } -export const latestUncommittedChangesDataJotai = jotaiAtom<{ +export const latestUncommittedChangesData = atom<{ fetchStartTimestamp: number; fetchCompletedTimestamp: number; files: UncommittedChanges; @@ -182,12 +182,12 @@ export const latestUncommittedChangesDataJotai = jotaiAtom<{ }>({fetchStartTimestamp: 0, fetchCompletedTimestamp: 0, files: []}); // This is used by a test. Tests do not go through babel to rewrite source // to insert debugLabel. -latestUncommittedChangesDataJotai.debugLabel = 'latestUncommittedChangesData'; +latestUncommittedChangesData.debugLabel = 'latestUncommittedChangesData'; registerCleanup( - latestUncommittedChangesDataJotai, + latestUncommittedChangesData, subscriptionEffect('uncommittedChanges', data => { - writeAtom(latestUncommittedChangesDataJotai, last => ({ + writeAtom(latestUncommittedChangesData, last => ({ ...data, files: data.files.value ?? @@ -205,23 +205,23 @@ registerCleanup( * Prefer using `uncommittedChangesWithPreviews`, since it includes optimistic state * and previews. */ -export const latestUncommittedChanges = jotaiAtom>( - get => get(latestUncommittedChangesDataJotai).files, +export const latestUncommittedChanges = atom>( + get => get(latestUncommittedChangesData).files, ); -export const uncommittedChangesFetchError = jotaiAtom(get => { - return get(latestUncommittedChangesDataJotai).error; +export const uncommittedChangesFetchError = atom(get => { + return get(latestUncommittedChangesData).error; }); -export const mergeConflictsJotai = jotaiAtom(undefined); +export const mergeConflicts = atom(undefined); registerCleanup( - mergeConflictsJotai, + mergeConflicts, subscriptionEffect('mergeConflicts', data => { - writeAtom(mergeConflictsJotai, data); + writeAtom(mergeConflicts, data); }), ); -export const latestCommitsData = jotaiAtom<{ +export const latestCommitsData = atom<{ fetchStartTimestamp: number; fetchCompletedTimestamp: number; commits: SmartlogCommits; @@ -250,24 +250,22 @@ registerCleanup( }), ); -export const latestUncommittedChangesTimestamp = jotaiAtom(get => { - return get(latestUncommittedChangesDataJotai).fetchCompletedTimestamp; +export const latestUncommittedChangesTimestamp = atom(get => { + return get(latestUncommittedChangesData).fetchCompletedTimestamp; }); /** * Lookup a commit by hash, *WITHOUT PREVIEWS*. * Generally, you'd want to look up WITH previews, which you can use dagWithPreviews for. */ -export const commitByHash = atomFamilyWeak((hash: string) => - jotaiAtom(get => get(latestDag).get(hash)), -); +export const commitByHash = atomFamilyWeak((hash: string) => atom(get => get(latestDag).get(hash))); -export const latestCommits = jotaiAtom(get => { +export const latestCommits = atom(get => { return get(latestCommitsData).commits; }); /** The dag also includes a mutationDag to answer successor queries. */ -export const latestDag = jotaiAtom(get => { +export const latestDag = atom(get => { const commits = get(latestCommits); const successorMap = get(latestSuccessorsMapAtom); const commitDag = undefined; // will be populated from `commits` @@ -277,7 +275,7 @@ export const latestDag = jotaiAtom(get => { return dag; }); -export const commitFetchError = jotaiAtom(get => { +export const commitFetchError = atom(get => { return get(latestCommitsData).error; }); @@ -287,7 +285,7 @@ export const hasExperimentalFeatures = configBackedAtom( true /* read-only */, ); -export const isFetchingCommits = jotaiAtom(false); +export const isFetchingCommits = atom(false); registerDisposable( isFetchingCommits, serverAPI.onMessageOfType('subscriptionResult', () => { @@ -303,7 +301,7 @@ registerDisposable( import.meta.hot, ); -export const isFetchingAdditionalCommits = jotaiAtom(false); +export const isFetchingAdditionalCommits = atom(false); registerDisposable( isFetchingAdditionalCommits, serverAPI.onMessageOfType('subscriptionResult', e => { @@ -330,7 +328,7 @@ registerDisposable( import.meta.hot, ); -export const isFetchingUncommittedChanges = jotaiAtom(false); +export const isFetchingUncommittedChanges = atom(false); registerDisposable( isFetchingUncommittedChanges, serverAPI.onMessageOfType('subscriptionResult', e => { @@ -348,7 +346,7 @@ registerDisposable( import.meta.hot, ); -export const commitsShownRange = jotaiAtom(DEFAULT_DAYS_OF_COMMITS_TO_LOAD); +export const commitsShownRange = atom(DEFAULT_DAYS_OF_COMMITS_TO_LOAD); registerCleanup( commitsShownRange, resetOnCwdChange(commitsShownRange, DEFAULT_DAYS_OF_COMMITS_TO_LOAD), @@ -367,7 +365,7 @@ registerDisposable( * Prefer using `dagWithPreviews.resolve('.')`, since it includes optimistic state * and previews. */ -export const latestHeadCommit = jotaiAtom(get => { +export const latestHeadCommit = atom(get => { const commits = get(latestCommits); return commits.find(commit => commit.isHead); }); @@ -377,15 +375,15 @@ export const latestHeadCommit = jotaiAtom(get => { * - Either the list of commits has successfully loaded * - or there was an error during the fetch */ -export const haveCommitsLoadedYet = jotaiAtom(get => { +export const haveCommitsLoadedYet = atom(get => { const data = get(latestCommitsData); return data.commits.length > 0 || data.error != null; }); -export const operationBeingPreviewedJotai = jotaiAtom(undefined); -resetOnCwdChange(operationBeingPreviewedJotai, undefined); +export const operationBeingPreviewed = atom(undefined); +resetOnCwdChange(operationBeingPreviewed, undefined); -export const haveRemotePath = jotaiAtom(get => { +export const haveRemotePath = atom(get => { const info = get(repositoryInfo); // codeReviewSystem.type is 'unknown' or other values if paths.default is present. return info?.type === 'success' && info.codeReviewSystem.type !== 'none'; @@ -445,14 +443,14 @@ function startNewOperation(newOperation: Operation, list: OperationList): Operat } } -export const operationListJotai = jotaiAtom(defaultOperationList()); -resetOnCwdChange(operationListJotai, defaultOperationList()); +export const operationList = atom(defaultOperationList()); +resetOnCwdChange(operationList, defaultOperationList()); registerDisposable( - operationListJotai, + operationList, serverAPI.onMessageOfType('operationProgress', progress => { switch (progress.kind) { case 'spawn': - writeAtom(operationListJotai, list => { + writeAtom(operationList, list => { const operation = operationsById.get(progress.id); if (operation == null) { return list; @@ -463,7 +461,7 @@ registerDisposable( break; case 'stdout': case 'stderr': - writeAtom(operationListJotai, current => { + writeAtom(operationList, current => { const currentOperation = current.currentOperation; if (currentOperation == null) { return current; @@ -480,7 +478,7 @@ registerDisposable( }); break; case 'inlineProgress': - writeAtom(operationListJotai, current => { + writeAtom(operationList, current => { const currentOperation = current.currentOperation; if (currentOperation == null) { return current; @@ -515,7 +513,7 @@ registerDisposable( }); break; case 'progress': - writeAtom(operationListJotai, current => { + writeAtom(operationList, current => { const currentOperation = current.currentOperation; if (currentOperation == null) { return current; @@ -540,7 +538,7 @@ registerDisposable( }); break; case 'exit': - writeAtom(operationListJotai, current => { + writeAtom(operationList, current => { const currentOperation = current.currentOperation; if (currentOperation == null) { return current; @@ -570,8 +568,8 @@ registerDisposable( ); export const inlineProgressByHash = atomFamilyWeak((hash: Hash) => - jotaiAtom(get => { - const info = get(operationListJotai); + atom(get => { + const info = get(operationList); const inlineProgress = info.currentOperation?.inlineProgress; if (inlineProgress == null) { return undefined; @@ -589,26 +587,26 @@ const operationsById = new Map(); /** Store callbacks to run when an operation completes. This is stored outside of the operation since Operations are typically Immutable. */ const operationCompletionCallbacks = new Map void>(); -export const queuedOperationsJotai = jotaiAtom>([]); -resetOnCwdChange(queuedOperationsJotai, []); +export const queuedOperations = atom>([]); +resetOnCwdChange(queuedOperations, []); registerDisposable( - queuedOperationsJotai, + queuedOperations, serverAPI.onMessageOfType('operationProgress', progress => { switch (progress.kind) { case 'queue': case 'spawn': // spawning doubles as our notification to dequeue the next operation, and includes the new queue state. // Update with the latest queue state. We expect this to be sent whenever we try to run a command but it gets queued. - writeAtom(queuedOperationsJotai, () => { + writeAtom(queuedOperations, () => { return progress.queue .map(opId => operationsById.get(opId)) .filter((op): op is Operation => op != null); }); break; case 'error': - writeAtom(queuedOperationsJotai, () => []); // empty queue when a command hits an error + writeAtom(queuedOperations, () => []); // empty queue when a command hits an error break; case 'exit': - writeAtom(queuedOperationsJotai, current => { + writeAtom(queuedOperations, current => { operationsById.delete(progress.id); // we don't need to care about this operation anymore if (progress.exitCode != null && progress.exitCode !== 0) { // if any process in the queue exits with an error, the entire queue is cleared. @@ -641,15 +639,15 @@ function runOperationImpl(operation: Operation): Promise { }); operationsById.set(operation.id, operation); - const ongoing = readAtom(operationListJotai); + const ongoing = readAtom(operationList); if (ongoing?.currentOperation != null && ongoing.currentOperation.exitCode == null) { - const queue = readAtom(queuedOperationsJotai); + const queue = readAtom(queuedOperations); // Add to the queue optimistically. The server will tell us the real state of the queue when it gets our run request. - writeAtom(queuedOperationsJotai, [...(queue || []), operation]); + writeAtom(queuedOperations, [...(queue || []), operation]); } else { // start a new operation. We need to manage the previous operations - writeAtom(operationListJotai, list => startNewOperation(operation, list)); + writeAtom(operationList, list => startNewOperation(operation, list)); } return defered.promise; @@ -683,10 +681,10 @@ export function useAbortRunningOperation() { type: 'abortRunningOperation', operationId, }); - const ongoing = readAtom(operationListJotai); + const ongoing = readAtom(operationList); if (ongoing?.currentOperation?.operation?.id === operationId) { // Mark 'aborting' as true. - writeAtom(operationListJotai, list => { + writeAtom(operationList, list => { const currentOperation = list.currentOperation; if (currentOperation != null) { return {...list, currentOperation: {aborting: true, ...currentOperation}}; @@ -704,12 +702,12 @@ export function useAbortRunningOperation() { export function useRunPreviewedOperation() { return useCallback((isCancel: boolean, operation?: Operation) => { if (isCancel) { - writeAtom(operationBeingPreviewedJotai, undefined); + writeAtom(operationBeingPreviewed, undefined); return; } - const operationToRun = operation ?? readAtom(operationBeingPreviewedJotai); - writeAtom(operationBeingPreviewedJotai, undefined); + const operationToRun = operation ?? readAtom(operationBeingPreviewed); + writeAtom(operationBeingPreviewed, undefined); if (operationToRun) { runOperationImpl(operationToRun); } @@ -723,7 +721,7 @@ export function useRunPreviewedOperation() { */ export function useClearAllOptimisticState() { return useCallback(() => { - writeAtom(operationListJotai, list => { + writeAtom(operationList, list => { const operationHistory = [...list.operationHistory]; for (let i = 0; i < operationHistory.length; i++) { if (operationHistory[i].exitCode != null) {