1- import { DropdownMenu , DropdownMenuContent , DropdownMenuGroup , DropdownMenuItem , DropdownMenuLabel , DropdownMenuSeparator , DropdownMenuTrigger } from "@/components/ui/dropdown-menu" ;
2- import { HistoryIcon , LoaderCircle } from "lucide-react" ;
1+ import { GitPullRequestArrow , HistoryIcon , LoaderCircle } from "lucide-react" ;
32import { ExposeParam } from "md-editor-rt" ;
43import { RefObject , useState } from "react" ;
54import { Button } from "@/components/ui/button" ;
@@ -9,17 +8,23 @@ import { RepoNames, ResCommit } from "@/lib/github.types";
98import dayjs from "dayjs" ;
109import relativeTime from "dayjs/plugin/relativeTime" ;
1110import zh from "dayjs/locale/zh-cn" ;
11+ import { Sheet , SheetContent , SheetDescription , SheetHeader , SheetTitle , SheetTrigger } from "@/components/ui/sheet" ;
12+ import { Avatar , AvatarFallback , AvatarImage } from "@/components/ui/avatar" ;
13+ import { TooltipButton } from "@/components/tooltip-button" ;
14+ import { open } from "@tauri-apps/plugin-shell" ;
1215
1316dayjs . extend ( relativeTime )
1417dayjs . locale ( zh )
1518
1619export default function History ( { mdRef} : { mdRef : RefObject < ExposeParam > } ) {
20+ const [ sheetOpen , setSheetOpen ] = useState ( false ) ;
1721 const { activeFilePath, setCurrentArticle, currentArticle } = useArticleStore ( )
1822 const [ commits , setCommits ] = useState < ResCommit [ ] > ( [ ] )
1923 const [ loading , setLoading ] = useState ( false )
2024 const [ commitsLoading , setCommitsLoading ] = useState ( false )
2125
2226 async function onOpenChange ( e : boolean ) {
27+ setSheetOpen ( e )
2328 if ( ! e ) return
2429 setCommitsLoading ( true )
2530 setCommits ( [ ] )
@@ -31,6 +36,7 @@ export default function History({mdRef}: {mdRef: RefObject<ExposeParam>}) {
3136
3237 async function handleCommit ( sha : string ) {
3338 setLoading ( true )
39+ setSheetOpen ( false )
3440 const cacheArticle = currentArticle ;
3541 setCurrentArticle ( '正在读取历史记录...' )
3642 const res = await getFiles ( { path : `${ activeFilePath } ?ref=${ sha } ` , repo : RepoNames . article } )
@@ -41,35 +47,58 @@ export default function History({mdRef}: {mdRef: RefObject<ExposeParam>}) {
4147 }
4248 setLoading ( false )
4349 }
50+
51+ function openHandler ( url : string ) {
52+ open ( url )
53+ }
4454 return (
45- < DropdownMenu onOpenChange = { onOpenChange } >
46- < DropdownMenuTrigger asChild className = "outline-none" >
55+ < Sheet open = { sheetOpen } onOpenChange = { onOpenChange } >
56+ < SheetTrigger asChild >
4757 < Button variant = "ghost" size = "icon" title = "翻译" >
4858 {
4959 loading ? < LoaderCircle className = "animate-spin size-4" /> : < HistoryIcon />
5060 }
5161 </ Button >
52- </ DropdownMenuTrigger >
53- < DropdownMenuContent align = "end" >
54- < DropdownMenuLabel > 历史记录(60秒间隔)</ DropdownMenuLabel >
55- < DropdownMenuSeparator />
56- {
57- commitsLoading ?
58- < DropdownMenuItem > < LoaderCircle className = "animate-spin size-4" /> 正在获取历史记录...</ DropdownMenuItem > :
59- < DropdownMenuGroup >
60- {
61- commits . length ?
62- commits . map ( ( commit ) => (
63- < DropdownMenuItem className = "flex justify-between" key = { commit . sha } onClick = { ( ) => handleCommit ( commit . sha ) } >
64- < span > { commit . commit . message } </ span >
65- < span className = "ml-4" > { dayjs ( commit . commit . committer . date ) . fromNow ( ) } </ span >
66- </ DropdownMenuItem >
67- ) ) :
68- < DropdownMenuItem > 暂无历史记录</ DropdownMenuItem >
69- }
70- </ DropdownMenuGroup >
71- }
72- </ DropdownMenuContent >
73- </ DropdownMenu >
62+ </ SheetTrigger >
63+ < SheetContent className = "p-0 min-w-[500px]" >
64+ < SheetHeader className = "p-4 border-b" >
65+ < SheetTitle > 历史记录</ SheetTitle >
66+ < SheetDescription className = "flex items-center gap-1" >
67+ {
68+ commitsLoading ? < LoaderCircle className = "size-4 animate-spin" /> : < HistoryIcon className = "size-4" />
69+ }
70+ {
71+ commitsLoading ? < span > 加载中</ span > : < span > { commits . length } 条记录</ span >
72+ }
73+ </ SheetDescription >
74+ </ SheetHeader >
75+ < div className = "max-h-[calc(100vh-90px)] overflow-y-auto" >
76+ {
77+ commits . map ( ( commit ) => (
78+ < div className = "flex justify-between items-center gap-4 border-b px-4 py-2" key = { commit . sha } >
79+ < div className = "flex-1 flex flex-col" >
80+ < span
81+ className = "text-sm line-clamp-1 hover:underline cursor-pointer"
82+ onClick = { ( ) => openHandler ( commit . html_url ) }
83+ > { commit . commit . message } </ span >
84+ < div className = "flex gap-1 items-center mt-2" >
85+ < Avatar className = "size-5" >
86+ < AvatarImage src = { commit . author . avatar_url } alt = { commit . author . login } />
87+ < AvatarFallback > CN</ AvatarFallback >
88+ </ Avatar >
89+ < span className = "text-xs text-zinc-500" >
90+ { commit . author . login } 提交于 { dayjs ( commit . commit . committer . date ) . fromNow ( ) }
91+ </ span >
92+ </ div >
93+ </ div >
94+ < div className = "w-8" >
95+ < TooltipButton icon = { < GitPullRequestArrow /> } tooltipText = "拉取" onClick = { ( ) => handleCommit ( commit . sha ) } />
96+ </ div >
97+ </ div >
98+ ) )
99+ }
100+ </ div >
101+ </ SheetContent >
102+ </ Sheet >
74103 )
75104}
0 commit comments