mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-25 10:42:45 +00:00
* feat(app): add fileView preference for changes panel * feat(app): add buildDiffTree util for changed-files tree * feat(app): add changed-files tree directory row * feat(app): changed-files tree view mode in changes panel (#117) * feat(protocol): add checkout.commits.list RPC + commitsList feature flag * feat(server): list branch commits ahead of base with on-remote flags * feat(server): handle checkout.commits.list RPC and advertise capability * feat(client): checkout.commits.list method + useCommitsQuery hook * feat(app): per-commit inline view with local-vs-remote markers (#117) * feat(protocol,server): per-commit file diff RPC (checkout.commits.file_diff) * feat(app): open per-commit file diff on click (#117) * refactor: surface baseRef + commits loading/error, drop dead depth field * fix(app): flip commit local/remote dot — local hollow, remote filled * feat(app): list/tree view for expanded commit file list (#117) * fix(app): syntax-highlight per-commit file diff to match Changes view * feat(app): draggable resize between commits and diff sections * refactor(app): dedupe wrap-text helpers into diff-highlighted-text * fix(app): clean up commits resize drag on unmount + a11y label * fix(app): collapse commits section by default * fix(app): render per-commit file diff with the shared Changes line renderer * perf(app): memoize shared diff line row; drop redundant DiffLineView wrapper * refactor(app): extract shared DiffFileBody; render commit file diff through it * fix(app): hide inline-comment affordance in per-commit diffs (no reviewActions) * feat(app): move commits to a resizable bottom drawer in the Changes panel * feat(review): commitSha scoping for per-commit review drafts + attachment * feat(app): per-commit inline comments wired through to the composer (#117) * refactor(app): own commit file-diff open state in CommitFileList (drop reset effect) * refactor(app): colocate diff-render cluster under git/diff-file-body/ * feat(app): add diff tab target kind (working/commit diff tabs) * feat(app): useDiffFiles hook unifying working + commit diff targets * feat(app): diff tab panel rendering working/commit diffs * feat(app): open a commit diff tab on commit click; drop per-commit drawer/file list * feat(app): open/scroll working diff tab on changed-file click * fix(app): keep commit diff tabs ephemeral; align working diff whitespace * feat(app): collapsible file sections in the diff tab, collapsed by default * feat(app): make the on-remote commit dot more subtle Dims the filled green remote dot (row + legend) to ~0.55 opacity so the local-only ring stays the state that draws the eye. * Reshape commit diffs around the existing Changes view * Fix diff tab migration complexity after rebase * Address diff tab review findings * Clean up diff tab review interfaces * Collapse commit diffs into the existing view * Load commits when expanded --------- Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
114 lines
3.1 KiB
TypeScript
114 lines
3.1 KiB
TypeScript
import {
|
|
keepPreviousData,
|
|
skipToken,
|
|
useQueries,
|
|
useQuery,
|
|
type QueryKey,
|
|
type UseQueryOptions,
|
|
type UseQueryResult,
|
|
} from "@tanstack/react-query";
|
|
|
|
type QueryFnOption<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = NonNullable<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>["queryFn"]
|
|
>;
|
|
|
|
type ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = Omit<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
| "gcTime"
|
|
| "initialData"
|
|
| "refetchOnMount"
|
|
| "refetchOnReconnect"
|
|
| "refetchOnWindowFocus"
|
|
| "staleTime"
|
|
> & {
|
|
pushEvent: string;
|
|
};
|
|
|
|
type FetchQueryInput<TQueryFnData, TError, TData, TQueryKey extends QueryKey> = Omit<
|
|
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
"initialData" | "placeholderData" | "queryFn" | "refetchOnMount" | "staleTime"
|
|
> & {
|
|
dataShape: "list" | "value";
|
|
queryFn: QueryFnOption<TQueryFnData, TError, TData, TQueryKey>;
|
|
staleTimeMs: number;
|
|
};
|
|
|
|
export function useReplicaQuery<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(input: ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey>): UseQueryResult<TData, TError> {
|
|
return useQuery(replicaQueryOptions(input));
|
|
}
|
|
|
|
export function useFetchQuery<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(input: FetchQueryInput<TQueryFnData, TError, TData, TQueryKey>): UseQueryResult<TData, TError> {
|
|
return useQuery(fetchQueryOptions(input));
|
|
}
|
|
|
|
export function useFetchQueries<TData>(
|
|
inputs: FetchQueryInput<TData, Error, TData, QueryKey>[],
|
|
): UseQueryResult<TData, Error>[] {
|
|
return useQueries({ queries: inputs.map((input) => fetchQueryOptions(input)) });
|
|
}
|
|
|
|
function replicaQueryOptions<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(
|
|
input: ReplicaQueryInput<TQueryFnData, TError, TData, TQueryKey>,
|
|
): UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
const { pushEvent, meta, ...options } = input;
|
|
return {
|
|
...options,
|
|
gcTime: Infinity,
|
|
meta: {
|
|
...meta,
|
|
serverDataPolicy: {
|
|
class: "replica",
|
|
pushEvent,
|
|
},
|
|
},
|
|
queryFn: options.queryFn ?? skipToken,
|
|
refetchOnMount: false,
|
|
refetchOnReconnect: false,
|
|
refetchOnWindowFocus: false,
|
|
staleTime: Infinity,
|
|
};
|
|
}
|
|
|
|
function fetchQueryOptions<
|
|
TQueryFnData,
|
|
TError = Error,
|
|
TData = TQueryFnData,
|
|
TQueryKey extends QueryKey = QueryKey,
|
|
>(
|
|
input: FetchQueryInput<TQueryFnData, TError, TData, TQueryKey>,
|
|
): UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
if (!Number.isFinite(input.staleTimeMs)) {
|
|
throw new Error("Fetch queries must declare a finite staleTimeMs.");
|
|
}
|
|
|
|
const { dataShape, meta, staleTimeMs, ...options } = input;
|
|
return {
|
|
...options,
|
|
...(dataShape === "list" ? { placeholderData: keepPreviousData } : {}),
|
|
meta: {
|
|
...meta,
|
|
serverDataPolicy: {
|
|
class: "fetch",
|
|
dataShape,
|
|
},
|
|
},
|
|
refetchOnMount: "always",
|
|
staleTime: staleTimeMs,
|
|
};
|
|
}
|