11"use client" ;
22import React , { useEffect , useState } from "react" ;
33import { Button } from "@/components/ui/button" ;
4- import { CheckCircle , Edit , Shuffle } from "lucide-react" ;
4+ import { CheckCircle , History , PenLine , Shuffle } from "lucide-react" ;
55import { Input } from "@/components/ui/input" ;
66import SelectWrap from "@/components/select-wrap" ;
77import { DOMAIN_LIST } from "@/lib/constant" ;
@@ -11,6 +11,7 @@ import { Skeleton } from "@/components/ui/skeleton";
1111import { randomMail } from "@/lib/utils" ;
1212import { emitter , mittKey } from "@/lib/mitt" ;
1313import { toast } from "sonner" ;
14+ import MailHistory from "@/components/mail-history" ;
1415
1516function Actions ( ) {
1617 const config = useConfig ( ) ;
@@ -36,12 +37,17 @@ function Actions() {
3637
3738 function onRandom ( ) {
3839 const random = randomMail ( ) ;
39- setMail ( random ) ;
4040 config . update ( random , domain ) ;
4141 setTimeout ( ( ) => emitter . emit ( mittKey . REFRESH ) ) ;
4242 toast . success ( "已随机至新地址 " + random + domain ) ;
4343 }
4444
45+ function onChange ( mail : string , domain : string ) {
46+ config . update ( mail , domain ) ;
47+ setTimeout ( ( ) => emitter . emit ( mittKey . REFRESH ) ) ;
48+ toast . success ( "已切换至新地址 " + mail + domain ) ;
49+ }
50+
4551 function onMailChange ( e : React . ChangeEvent < HTMLInputElement > ) {
4652 const value = e . currentTarget . value . replace ( / [ ^ a - z A - Z 0 - 9 - _ .] / g, "" ) ;
4753 if ( value . length > 64 ) {
@@ -60,40 +66,50 @@ function Actions() {
6066
6167 const [ edited , setEdited ] = useState ( false ) ;
6268 return (
63- < div className = "flex flex-wrap items-center gap-1" >
64- < Mounted fallback = { < Skeleton className = "h-8 w-28" /> } >
65- < Input
66- onKeyDown = { onKeyDown }
67- disabled = { ! edited }
68- value = { mail }
69- className = "w-28 text-end"
70- onChange = { onMailChange }
71- />
72- </ Mounted >
73- < Mounted fallback = { < Skeleton className = "h-8 w-28" /> } >
74- < SelectWrap
75- value = { domain }
76- setValue = { ( domain ) => setDomain ( domain ) }
77- list = { DOMAIN_LIST }
78- disabled = { ! edited }
79- />
80- </ Mounted >
69+ < div className = "flex flex-wrap items-center gap-2" >
70+ < div className = "flex h-9 items-center gap-1" >
71+ < Mounted fallback = { < Skeleton className = "h-8 w-28" /> } >
72+ < Input
73+ onKeyDown = { onKeyDown }
74+ disabled = { ! edited }
75+ value = { mail }
76+ className = "w-28 text-end"
77+ onChange = { onMailChange }
78+ />
79+ </ Mounted >
80+ < Mounted fallback = { < Skeleton className = "h-8 w-[118px]" /> } >
81+ < SelectWrap
82+ value = { domain }
83+ setValue = { ( domain ) => setDomain ( domain ) }
84+ list = { DOMAIN_LIST }
85+ disabled = { ! edited }
86+ className = "w-[118px] px-2"
87+ />
88+ </ Mounted >
89+ </ div >
8190
82- < div className = "ml-1" >
83- { ! edited && (
84- < Button variant = "ghost" size = "icon" onClick = { ( ) => setEdited ( true ) } >
85- < Edit size = { 20 } strokeWidth = { 1.8 } />
86- </ Button >
87- ) }
88- { edited && (
89- < Button variant = "ghost" size = "icon" onClick = { onSave } >
90- < CheckCircle size = { 20 } strokeWidth = { 1.8 } />
91- </ Button >
92- ) }
93- < Button variant = "ghost" size = "icon" onClick = { onRandom } >
94- < Shuffle size = { 20 } strokeWidth = { 1.8 } />
91+ { ! edited && (
92+ < Button variant = "outline" size = "sm" onClick = { ( ) => setEdited ( true ) } >
93+ < PenLine size = { 14 } className = "mr-1" />
94+ 编辑
9595 </ Button >
96- </ div >
96+ ) }
97+ { edited && (
98+ < Button variant = "outline" size = "sm" onClick = { onSave } >
99+ < CheckCircle size = { 14 } className = "mr-1" />
100+ 保存
101+ </ Button >
102+ ) }
103+ < Button variant = "outline" size = "sm" onClick = { onRandom } >
104+ < Shuffle size = { 14 } className = "mr-1" />
105+ 随机
106+ </ Button >
107+ < MailHistory onChange = { onChange } >
108+ < Button variant = "outline" size = "sm" >
109+ < History size = { 14 } className = "mr-1" />
110+ 历史
111+ </ Button >
112+ </ MailHistory >
97113 </ div >
98114 ) ;
99115}
0 commit comments