11import React , { useEffect , useMemo , useState } from 'react' ;
22import { useTranslation } from '@i18next-toolkit/react' ;
3- import { trpc } from '@/api/trpc' ;
3+ import { trpc , defaultErrorHandler } from '@/api/trpc' ;
44import { Card , CardContent , CardHeader , CardTitle } from '@/components/ui/card' ;
55import { Button } from '@/components/ui/button' ;
66import { Badge } from '@/components/ui/badge' ;
@@ -15,25 +15,45 @@ import {
1515import { ScrollArea } from '@/components/ui/scroll-area' ;
1616import { Loading } from '@/components/Loading' ;
1717import { WorkerRevisionDiffViewer } from './WorkerRevisionDiffViewer' ;
18- import { LuArrowLeftRight , LuArrowRight } from 'react-icons/lu' ;
18+ import { AlertConfirm } from '@/components/AlertConfirm' ;
19+ import {
20+ LuArrowLeftRight ,
21+ LuArrowRight ,
22+ LuUndo2 ,
23+ LuGitCompareArrows ,
24+ LuDiff ,
25+ } from 'react-icons/lu' ;
26+ import { SimpleTooltip } from '@/components/ui/tooltip' ;
1927import dayjs from 'dayjs' ;
2028
2129interface WorkerRevisionsSectionProps {
2230 workspaceId : string ;
2331 workerId : string ;
32+ onRollback ?: ( ) => void ;
2433}
2534
2635export const WorkerRevisionsSection : React . FC < WorkerRevisionsSectionProps > = ( {
2736 workspaceId,
2837 workerId,
38+ onRollback,
2939} ) => {
3040 const { t } = useTranslation ( ) ;
31- const { data : revisions = [ ] , isLoading } = trpc . worker . getRevisions . useQuery (
32- {
33- workspaceId,
34- workerId,
35- }
36- ) ;
41+ const {
42+ data : revisions = [ ] ,
43+ isLoading,
44+ refetch : refetchRevisions ,
45+ } = trpc . worker . getRevisions . useQuery ( {
46+ workspaceId,
47+ workerId,
48+ } ) ;
49+
50+ const rollbackMutation = trpc . worker . rollbackToRevision . useMutation ( {
51+ onError : defaultErrorHandler ,
52+ onSuccess : ( ) => {
53+ refetchRevisions ( ) ;
54+ onRollback ?.( ) ;
55+ } ,
56+ } ) ;
3757 const [ baseRevisionId , setBaseRevisionId ] = useState < string | null > ( null ) ;
3858 const [ targetRevisionId , setTargetRevisionId ] = useState < string | null > ( null ) ;
3959
@@ -186,25 +206,55 @@ export const WorkerRevisionsSection: React.FC<WorkerRevisionsSectionProps> = ({
186206 : '' }
187207 </ div >
188208 </ div >
189- < div className = "flex items-center gap-2" >
190- < Button
191- type = "button"
192- size = "sm"
193- variant = "outline"
194- onClick = { ( ) => setBaseRevisionId ( revision . id ) }
195- className = "h-7 text-xs"
196- >
197- { t ( 'Set base' ) }
198- </ Button >
199- < Button
200- type = "button"
201- size = "sm"
202- variant = "outline"
203- onClick = { ( ) => setTargetRevisionId ( revision . id ) }
204- className = "h-7 text-xs"
205- >
206- { t ( 'Set compare' ) }
207- </ Button >
209+ < div className = "flex items-center gap-1" >
210+ < SimpleTooltip content = { t ( 'Set base' ) } >
211+ < Button
212+ type = "button"
213+ size = "icon"
214+ variant = { isBase ? 'default' : 'ghost' }
215+ onClick = { ( ) => setBaseRevisionId ( revision . id ) }
216+ className = "h-7 w-7"
217+ Icon = { LuGitCompareArrows }
218+ />
219+ </ SimpleTooltip >
220+ < SimpleTooltip content = { t ( 'Set compare' ) } >
221+ < Button
222+ type = "button"
223+ size = "icon"
224+ variant = { isTarget ? 'default' : 'ghost' }
225+ onClick = { ( ) => setTargetRevisionId ( revision . id ) }
226+ className = "h-7 w-7"
227+ Icon = { LuDiff }
228+ />
229+ </ SimpleTooltip >
230+ { ! isLatest && (
231+ < AlertConfirm
232+ title = { t ( 'Rollback to Revision #{{num}}' , {
233+ num : revision . revision ,
234+ } ) }
235+ description = { t (
236+ 'Are you sure you want to rollback the worker code to this revision? This will create a new revision with the rolled-back code.'
237+ ) }
238+ onConfirm = { async ( ) => {
239+ await rollbackMutation . mutateAsync ( {
240+ workspaceId,
241+ workerId,
242+ revisionId : revision . id ,
243+ } ) ;
244+ } }
245+ >
246+ < SimpleTooltip content = { t ( 'Rollback' ) } >
247+ < Button
248+ type = "button"
249+ size = "icon"
250+ variant = "ghost"
251+ className = "h-7 w-7"
252+ Icon = { LuUndo2 }
253+ loading = { rollbackMutation . isPending }
254+ />
255+ </ SimpleTooltip >
256+ </ AlertConfirm >
257+ ) }
208258 </ div >
209259 </ div >
210260 ) ;
0 commit comments