Skip to content

Commit e1beb02

Browse files
committed
refactor: rename Pending* types and files to remove 'pending' prefix
- PendingReview -> Review - PendingReviewStatus -> ReviewStatus - usePendingReviews -> useReviews (file and hook) - PendingReviewsBanner -> ReviewsBanner (file and component) - UsePendingReviewsReturn -> UseReviewsReturn - setPendingReviews -> setReviews, createPendingReview -> createReview - Update all story names to remove 'Pending' prefix
1 parent 855383b commit e1beb02

File tree

7 files changed

+93
-105
lines changed

7 files changed

+93
-105
lines changed

src/browser/components/AIView.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ import { useAutoCompactionSettings } from "../hooks/useAutoCompactionSettings";
5050
import { useSendMessageOptions } from "@/browser/hooks/useSendMessageOptions";
5151
import { useForceCompaction } from "@/browser/hooks/useForceCompaction";
5252
import { useAPI } from "@/browser/contexts/API";
53-
import { usePendingReviews } from "@/browser/hooks/usePendingReviews";
54-
import { PendingReviewsBanner } from "./PendingReviewsBanner";
53+
import { useReviews } from "@/browser/hooks/useReviews";
54+
import { ReviewsBanner } from "./ReviewsBanner";
5555
import type { ReviewNoteData } from "@/common/types/review";
5656

5757
interface AIViewProps {
@@ -109,8 +109,8 @@ const AIViewInner: React.FC<AIViewProps> = ({
109109
const aggregator = useWorkspaceAggregator(workspaceId);
110110
const workspaceUsage = useWorkspaceUsage(workspaceId);
111111

112-
// Pending reviews state
113-
const pendingReviews = usePendingReviews(workspaceId);
112+
// Reviews state
113+
const reviews = useReviews(workspaceId);
114114
const { options } = useProviderOptions();
115115
const use1M = options.anthropic?.use1MContext ?? false;
116116
// Get pending model for auto-compaction settings (threshold is per-model)
@@ -219,13 +219,13 @@ const AIViewInner: React.FC<AIViewProps> = ({
219219
chatInputAPI.current = api;
220220
}, []);
221221

222-
// Handler for review notes from Code Review tab - adds to pending reviews (starts attached)
222+
// Handler for review notes from Code Review tab - adds review (starts attached)
223223
const handleReviewNote = useCallback(
224224
(data: ReviewNoteData) => {
225-
pendingReviews.addReview(data);
225+
reviews.addReview(data);
226226
// New reviews start with status "attached" so they appear in chat input immediately
227227
},
228-
[pendingReviews]
228+
[reviews]
229229
);
230230

231231
// Handler for manual compaction from CompactionWarning click
@@ -617,7 +617,7 @@ const AIViewInner: React.FC<AIViewProps> = ({
617617
onCompactClick={handleCompactClick}
618618
/>
619619
)}
620-
<PendingReviewsBanner workspaceId={workspaceId} />
620+
<ReviewsBanner workspaceId={workspaceId} />
621621
<ChatInput
622622
variant="workspace"
623623
workspaceId={workspaceId}
@@ -633,10 +633,10 @@ const AIViewInner: React.FC<AIViewProps> = ({
633633
canInterrupt={canInterrupt}
634634
onReady={handleChatInputReady}
635635
autoCompactionCheck={autoCompactionResult}
636-
attachedReviews={pendingReviews.attachedReviews}
637-
onDetachReview={pendingReviews.detachReview}
638-
onCheckReviews={(ids) => ids.forEach((id) => pendingReviews.checkReview(id))}
639-
onUpdateReviewNote={pendingReviews.updateReviewNote}
636+
attachedReviews={reviews.attachedReviews}
637+
onDetachReview={reviews.detachReview}
638+
onCheckReviews={(ids) => ids.forEach((id) => reviews.checkReview(id))}
639+
onUpdateReviewNote={reviews.updateReviewNote}
640640
/>
641641
</div>
642642

src/browser/components/ChatInput/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ImagePart } from "@/common/orpc/types";
22
import type { FrontendWorkspaceMetadata } from "@/common/types/workspace";
33
import type { TelemetryRuntimeType } from "@/common/telemetry/payload";
44
import type { AutoCompactionCheckResult } from "@/browser/utils/compaction/autoCompactionCheck";
5-
import type { PendingReview } from "@/common/types/review";
5+
import type { Review } from "@/common/types/review";
66

77
export interface ChatInputAPI {
88
focus: () => void;
@@ -30,8 +30,8 @@ export interface ChatInputWorkspaceVariant {
3030
disabled?: boolean;
3131
onReady?: (api: ChatInputAPI) => void;
3232
autoCompactionCheck?: AutoCompactionCheckResult; // Computed in parent (AIView) to avoid duplicate calculation
33-
/** Reviews currently attached to chat (from usePendingReviews hook) */
34-
attachedReviews?: PendingReview[];
33+
/** Reviews currently attached to chat (from useReviews hook) */
34+
attachedReviews?: Review[];
3535
/** Detach a review from chat input (sets status to pending) */
3636
onDetachReview?: (reviewId: string) => void;
3737
/** Mark reviews as checked after sending */

src/browser/components/PendingReviewsBanner.tsx renamed to src/browser/components/ReviewsBanner.tsx

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* PendingReviewsBanner - Self-contained pending reviews UI
2+
* ReviewsBanner - Self-contained reviews UI
33
*
44
* Features:
55
* - Collapsible banner above chat input
@@ -25,8 +25,8 @@ import {
2525
import { cn } from "@/common/lib/utils";
2626
import { Button } from "./ui/button";
2727
import { Tooltip, TooltipTrigger, TooltipContent } from "./ui/tooltip";
28-
import type { PendingReview } from "@/common/types/review";
29-
import { usePendingReviews } from "@/browser/hooks/usePendingReviews";
28+
import type { Review } from "@/common/types/review";
29+
import { useReviews } from "@/browser/hooks/useReviews";
3030
import { formatRelativeTime } from "@/browser/utils/ui/dateTime";
3131
import { DiffRenderer } from "./shared/DiffRenderer";
3232
import { matchesKeybind, KEYBINDS } from "@/browser/utils/ui/keybinds";
@@ -79,7 +79,7 @@ class BannerErrorBoundary extends Component<
7979
// ═══════════════════════════════════════════════════════════════════════════════
8080

8181
interface ReviewItemProps {
82-
review: PendingReview;
82+
review: Review;
8383
onCheck: () => void;
8484
onUncheck: () => void;
8585
onSendToChat: () => void;
@@ -309,12 +309,12 @@ const ReviewItem: React.FC<ReviewItemProps> = ({
309309
// MAIN BANNER COMPONENT
310310
// ═══════════════════════════════════════════════════════════════════════════════
311311

312-
interface PendingReviewsBannerInnerProps {
312+
interface ReviewsBannerInnerProps {
313313
workspaceId: string;
314314
}
315315

316-
const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ workspaceId }) => {
317-
const pendingReviews = usePendingReviews(workspaceId);
316+
const ReviewsBannerInner: React.FC<ReviewsBannerInnerProps> = ({ workspaceId }) => {
317+
const reviewsHook = useReviews(workspaceId);
318318
const [isExpanded, setIsExpanded] = useState(false);
319319
const [showAllCompleted, setShowAllCompleted] = useState(false);
320320

@@ -323,10 +323,10 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
323323
// Separate pending and completed reviews
324324
// "attached" reviews are shown in ChatInput, so we only show "pending" and "checked" here
325325
const { pendingList, completedList } = useMemo(() => {
326-
const pending = pendingReviews.reviews.filter((r) => r.status === "pending");
327-
const completed = pendingReviews.reviews.filter((r) => r.status === "checked");
326+
const pending = reviewsHook.reviews.filter((r) => r.status === "pending");
327+
const completed = reviewsHook.reviews.filter((r) => r.status === "checked");
328328
return { pendingList: pending, completedList: completed };
329-
}, [pendingReviews.reviews]);
329+
}, [reviewsHook.reviews]);
330330

331331
// Completed reviews to display (limited unless expanded)
332332
const displayedCompleted = useMemo(() => {
@@ -342,20 +342,20 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
342342

343343
const handleSendToChat = useCallback(
344344
(reviewId: string) => {
345-
pendingReviews.attachReview(reviewId);
345+
reviewsHook.attachReview(reviewId);
346346
},
347-
[pendingReviews]
347+
[reviewsHook]
348348
);
349349

350350
const handleUpdateNote = useCallback(
351351
(reviewId: string, newNote: string) => {
352-
pendingReviews.updateReviewNote(reviewId, newNote);
352+
reviewsHook.updateReviewNote(reviewId, newNote);
353353
},
354-
[pendingReviews]
354+
[reviewsHook]
355355
);
356356

357357
// Don't show anything if no reviews
358-
if (pendingReviews.reviews.length === 0) {
358+
if (reviewsHook.reviews.length === 0) {
359359
return null;
360360
}
361361

@@ -370,23 +370,23 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
370370
<MessageSquare
371371
className={cn(
372372
"size-3.5",
373-
pendingReviews.pendingCount > 0 ? "text-[var(--color-review-accent)]" : "text-muted"
373+
reviewsHook.pendingCount > 0 ? "text-[var(--color-review-accent)]" : "text-muted"
374374
)}
375375
/>
376376
<span className="text-secondary">
377-
{pendingReviews.pendingCount > 0 ? (
377+
{reviewsHook.pendingCount > 0 ? (
378378
<>
379379
<span className="font-medium text-[var(--color-review-accent)]">
380-
{pendingReviews.pendingCount}
380+
{reviewsHook.pendingCount}
381381
</span>
382382
{" pending review"}
383-
{pendingReviews.pendingCount !== 1 && "s"}
383+
{reviewsHook.pendingCount !== 1 && "s"}
384384
</>
385385
) : (
386386
<span className="text-muted">No pending reviews</span>
387387
)}
388-
{pendingReviews.checkedCount > 0 && (
389-
<span className="text-muted"> · {pendingReviews.checkedCount} completed</span>
388+
{reviewsHook.checkedCount > 0 && (
389+
<span className="text-muted"> · {reviewsHook.checkedCount} completed</span>
390390
)}
391391
</span>
392392
<div className="ml-auto">
@@ -411,10 +411,10 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
411411
<ReviewItem
412412
key={review.id}
413413
review={review}
414-
onCheck={() => pendingReviews.checkReview(review.id)}
415-
onUncheck={() => pendingReviews.uncheckReview(review.id)}
414+
onCheck={() => reviewsHook.checkReview(review.id)}
415+
onUncheck={() => reviewsHook.uncheckReview(review.id)}
416416
onSendToChat={() => handleSendToChat(review.id)}
417-
onRemove={() => pendingReviews.removeReview(review.id)}
417+
onRemove={() => reviewsHook.removeReview(review.id)}
418418
onUpdateNote={(note) => handleUpdateNote(review.id, note)}
419419
/>
420420
))}
@@ -431,7 +431,7 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
431431
{completedList.length > 0 && (
432432
<button
433433
type="button"
434-
onClick={pendingReviews.clearChecked}
434+
onClick={reviewsHook.clearChecked}
435435
className="text-muted hover:text-error text-[10px] transition-colors"
436436
>
437437
Clear
@@ -442,10 +442,10 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
442442
<ReviewItem
443443
key={review.id}
444444
review={review}
445-
onCheck={() => pendingReviews.checkReview(review.id)}
446-
onUncheck={() => pendingReviews.uncheckReview(review.id)}
445+
onCheck={() => reviewsHook.checkReview(review.id)}
446+
onUncheck={() => reviewsHook.uncheckReview(review.id)}
447447
onSendToChat={() => handleSendToChat(review.id)}
448-
onRemove={() => pendingReviews.removeReview(review.id)}
448+
onRemove={() => reviewsHook.removeReview(review.id)}
449449
onUpdateNote={(note) => handleUpdateNote(review.id, note)}
450450
/>
451451
))}
@@ -476,21 +476,21 @@ const PendingReviewsBannerInner: React.FC<PendingReviewsBannerInnerProps> = ({ w
476476
// EXPORTED COMPONENT
477477
// ═══════════════════════════════════════════════════════════════════════════════
478478

479-
interface PendingReviewsBannerProps {
479+
interface ReviewsBannerProps {
480480
workspaceId: string;
481481
}
482482

483483
/**
484-
* Self-contained pending reviews banner.
485-
* Uses usePendingReviews hook internally - only needs workspaceId.
484+
* Self-contained reviews banner.
485+
* Uses useReviews hook internally - only needs workspaceId.
486486
* Shows only "pending" and "checked" reviews (not "attached" which are in ChatInput).
487487
*/
488-
export const PendingReviewsBanner: React.FC<PendingReviewsBannerProps> = ({ workspaceId }) => {
489-
const pendingReviews = usePendingReviews(workspaceId);
488+
export const ReviewsBanner: React.FC<ReviewsBannerProps> = ({ workspaceId }) => {
489+
const reviewsHook = useReviews(workspaceId);
490490

491491
return (
492-
<BannerErrorBoundary onClear={pendingReviews.clearAll}>
493-
<PendingReviewsBannerInner workspaceId={workspaceId} />
492+
<BannerErrorBoundary onClear={reviewsHook.clearAll}>
493+
<ReviewsBannerInner workspaceId={workspaceId} />
494494
</BannerErrorBoundary>
495495
);
496496
};
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/**
2-
* Hook for managing pending reviews per workspace
2+
* Hook for managing reviews per workspace
33
* Provides interface for adding, checking, and removing reviews
44
*/
55

66
import { useCallback, useMemo } from "react";
77
import { usePersistedState } from "./usePersistedState";
88
import { getReviewsKey } from "@/common/constants/storage";
9-
import type { PendingReview, ReviewsState, ReviewNoteData } from "@/common/types/review";
9+
import type { Review, ReviewsState, ReviewNoteData } from "@/common/types/review";
1010

1111
/**
1212
* Generate a unique ID for a review
@@ -15,19 +15,19 @@ function generateReviewId(): string {
1515
return `review-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
1616
}
1717

18-
export interface UsePendingReviewsReturn {
18+
export interface UseReviewsReturn {
1919
/** All reviews (pending, attached, and checked) */
20-
reviews: PendingReview[];
20+
reviews: Review[];
2121
/** Count of pending reviews (not attached, not checked) */
2222
pendingCount: number;
2323
/** Count of attached reviews (in chat input draft) */
2424
attachedCount: number;
2525
/** Count of checked reviews */
2626
checkedCount: number;
2727
/** Reviews currently attached to chat input */
28-
attachedReviews: PendingReview[];
28+
attachedReviews: Review[];
2929
/** Add a new review from structured data (starts as attached) */
30-
addReview: (data: ReviewNoteData) => PendingReview;
30+
addReview: (data: ReviewNoteData) => Review;
3131
/** Mark a review as attached to chat input */
3232
attachReview: (reviewId: string) => void;
3333
/** Detach a review from chat input (back to pending) */
@@ -45,14 +45,14 @@ export interface UsePendingReviewsReturn {
4545
/** Clear all reviews (for error recovery) */
4646
clearAll: () => void;
4747
/** Get a review by ID */
48-
getReview: (reviewId: string) => PendingReview | undefined;
48+
getReview: (reviewId: string) => Review | undefined;
4949
}
5050

5151
/**
52-
* Hook for managing pending reviews for a workspace
52+
* Hook for managing reviews for a workspace
5353
* Persists reviews to localStorage
5454
*/
55-
export function usePendingReviews(workspaceId: string): UsePendingReviewsReturn {
55+
export function useReviews(workspaceId: string): UseReviewsReturn {
5656
const [state, setState] = usePersistedState<ReviewsState>(
5757
getReviewsKey(workspaceId),
5858
{
@@ -85,8 +85,8 @@ export function usePendingReviews(workspaceId: string): UsePendingReviewsReturn
8585
}, [reviews]);
8686

8787
const addReview = useCallback(
88-
(data: ReviewNoteData): PendingReview => {
89-
const review: PendingReview = {
88+
(data: ReviewNoteData): Review => {
89+
const review: Review = {
9090
id: generateReviewId(),
9191
data,
9292
status: "attached", // New reviews start attached to chat input
@@ -260,7 +260,7 @@ export function usePendingReviews(workspaceId: string): UsePendingReviewsReturn
260260
}, [setState]);
261261

262262
const getReview = useCallback(
263-
(reviewId: string): PendingReview | undefined => {
263+
(reviewId: string): Review | undefined => {
264264
return state.reviews[reviewId];
265265
},
266266
[state.reviews]

0 commit comments

Comments
 (0)