Fix dropdown refresh after Git init

This commit is contained in:
Gregory Schier
2025-03-19 11:35:20 -07:00
parent 6e25c26e9f
commit c300e8cbd5
5 changed files with 43 additions and 28 deletions

View File

@@ -52,7 +52,7 @@ export function useGit(dir: string) {
onSuccess, onSuccess,
}), }),
commitAndPush: useMutation<PushResult, string, { message: string }>({ commitAndPush: useMutation<PushResult, string, { message: string }>({
mutationKey: ['git', 'commitpush', dir], mutationKey: ['git', 'commit_push', dir],
mutationFn: async (args) => { mutationFn: async (args) => {
await invoke('plugin:yaak-git|commit', { dir, ...args }); await invoke('plugin:yaak-git|commit', { dir, ...args });
return invoke('plugin:yaak-git|push', { dir }); return invoke('plugin:yaak-git|push', { dir });
@@ -79,10 +79,18 @@ export function useGit(dir: string) {
mutationFn: (args) => invoke('plugin:yaak-git|unstage', { dir, ...args }), mutationFn: (args) => invoke('plugin:yaak-git|unstage', { dir, ...args }),
onSuccess, onSuccess,
}), }),
init: useGitInit(),
}, },
] as const; ] as const;
} }
export async function gitInit(dir: string) { export function useGitInit() {
await invoke('plugin:yaak-git|initialize', { dir }); const queryClient = useQueryClient();
const onSuccess = () => queryClient.invalidateQueries({ queryKey: ['git'] });
return useMutation<void, string, { dir: string }>({
mutationKey: ['git', 'init'],
mutationFn: (args) => invoke('plugin:yaak-git|initialize', { ...args }),
onSuccess,
});
} }

View File

@@ -1,4 +1,4 @@
import { gitInit } from '@yaakapp-internal/git'; import { useGitInit } from '@yaakapp-internal/git';
import type { WorkspaceMeta } from '@yaakapp-internal/models'; import type { WorkspaceMeta } from '@yaakapp-internal/models';
import { useState } from 'react'; import { useState } from 'react';
import { upsertWorkspace } from '../commands/upsertWorkspace'; import { upsertWorkspace } from '../commands/upsertWorkspace';
@@ -17,6 +17,7 @@ interface Props {
export function CreateWorkspaceDialog({ hide }: Props) { export function CreateWorkspaceDialog({ hide }: Props) {
const [name, setName] = useState<string>(''); const [name, setName] = useState<string>('');
const gitInit = useGitInit();
const [syncConfig, setSyncConfig] = useState<{ const [syncConfig, setSyncConfig] = useState<{
filePath: string | null; filePath: string | null;
initGit?: boolean; initGit?: boolean;
@@ -44,7 +45,7 @@ export function CreateWorkspaceDialog({ hide }: Props) {
}); });
if (syncConfig.initGit && syncConfig.filePath) { if (syncConfig.initGit && syncConfig.filePath) {
gitInit(syncConfig.filePath).catch((err) => { gitInit.mutateAsync({ dir: syncConfig.filePath }).catch((err) => {
showErrorToast('git-init-error', String(err)); showErrorToast('git-init-error', String(err));
}); });
} }

View File

@@ -1,4 +1,4 @@
import { gitInit, useGit } from '@yaakapp-internal/git'; import { useGit } from '@yaakapp-internal/git';
import type { WorkspaceMeta } from '@yaakapp-internal/models'; import type { WorkspaceMeta } from '@yaakapp-internal/models';
import classNames from 'classnames'; import classNames from 'classnames';
import type { HTMLAttributes } from 'react'; import type { HTMLAttributes } from 'react';
@@ -34,8 +34,10 @@ export function GitDropdown() {
function SyncDropdownWithSyncDir({ syncDir }: { syncDir: string }) { function SyncDropdownWithSyncDir({ syncDir }: { syncDir: string }) {
const workspace = useActiveWorkspace(); const workspace = useActiveWorkspace();
const [{ status, log }, { branch, deleteBranch, fetchAll, mergeBranch, push, pull, checkout }] = const [
useGit(syncDir); { status, log },
{ branch, deleteBranch, fetchAll, mergeBranch, push, pull, checkout, init },
] = useGit(syncDir);
const localBranches = status.data?.localBranches ?? []; const localBranches = status.data?.localBranches ?? [];
const remoteBranches = status.data?.remoteBranches ?? []; const remoteBranches = status.data?.remoteBranches ?? [];
@@ -50,7 +52,9 @@ function SyncDropdownWithSyncDir({ syncDir }: { syncDir: string }) {
const noRepo = status.error?.includes('not found'); const noRepo = status.error?.includes('not found');
if (noRepo) { if (noRepo) {
return <SetupGitDropdown workspaceId={workspace.id} initRepo={() => gitInit(syncDir)} />; return (
<SetupGitDropdown workspaceId={workspace.id} initRepo={() => init.mutate({ dir: syncDir })} />
);
} }
const tryCheckout = (branch: string, force: boolean) => { const tryCheckout = (branch: string, force: boolean) => {

View File

@@ -0,0 +1,18 @@
import {QueryCache, QueryClient} from "@tanstack/react-query";
export const queryClient = new QueryClient({
queryCache: new QueryCache({
onError: (err, query) => {
console.log('Query client error', { err, query });
},
}),
defaultOptions: {
queries: {
retry: false,
networkMode: 'always',
refetchOnWindowFocus: true,
refetchOnReconnect: false,
refetchOnMount: false, // Don't refetch when a hook mounts
},
},
});

View File

@@ -1,8 +1,8 @@
import { QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { QueryClientProvider } from '@tanstack/react-query';
import { createRootRoute, Outlet } from '@tanstack/react-router'; import { createRootRoute, Outlet } from '@tanstack/react-router';
import classNames from 'classnames'; import classNames from 'classnames';
import { domAnimation, LazyMotion, MotionConfig } from 'motion/react';
import { Provider as JotaiProvider } from 'jotai'; import { Provider as JotaiProvider } from 'jotai';
import { domAnimation, LazyMotion, MotionConfig } from 'motion/react';
import React, { Suspense } from 'react'; import React, { Suspense } from 'react';
import { DndProvider } from 'react-dnd'; import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend'; import { HTML5Backend } from 'react-dnd-html5-backend';
@@ -13,23 +13,7 @@ import RouteError from '../components/RouteError';
import { Toasts } from '../components/Toasts'; import { Toasts } from '../components/Toasts';
import { useOsInfo } from '../hooks/useOsInfo'; import { useOsInfo } from '../hooks/useOsInfo';
import { jotaiStore } from '../lib/jotai'; import { jotaiStore } from '../lib/jotai';
import { queryClient } from '../lib/queryClient';
const queryClient = new QueryClient({
queryCache: new QueryCache({
onError: (err, query) => {
console.log('Query client error', { err, query });
},
}),
defaultOptions: {
queries: {
retry: false,
networkMode: 'always',
refetchOnWindowFocus: true,
refetchOnReconnect: false,
refetchOnMount: false, // Don't refetch when a hook mounts
},
},
});
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const TanStackRouterDevtools = const TanStackRouterDevtools =