11import { useAtomValue , useSetAtom } from 'jotai' ;
22import { useEffect , useState } from 'react' ;
3- import { VscDesktopDownload , VscNewFile , VscOpenPreview } from 'react-icons/vsc' ;
43
54import { openReferenceAtom , openReferencePdfAtom , openReferencesAtom } from '../../../atoms/editorActions' ;
65import { getReferencesAtom } from '../../../atoms/referencesState' ;
7- import { PanelSection } from '../../../components/PanelSection' ;
86import { PanelWrapper } from '../../../components/PanelWrapper' ;
7+ import { SearchBar } from '../../../components/SearchBar' ;
98import { emitEvent } from '../../../events' ;
10- import { useDebouncedCallback } from '../../../hooks/useDebouncedCallback' ;
119import { Author , ReferenceItem } from '../../../types/ReferenceItem' ;
12- import { UploadTipInstructions } from '../components/UploadTipInstructions ' ;
10+ import { ExportIcon , TableIcon } from '../components/icons ' ;
1311import { ReferencesList } from './ReferencesList' ;
1412
1513export function ReferencesPanel ( ) {
@@ -23,10 +21,6 @@ export function ReferencesPanel() {
2321 setVisibleReferences ( references ) ;
2422 } , [ references ] ) ;
2523
26- const handleAddReferences = ( ) => {
27- emitEvent ( 'refstudio://menu/references/upload' ) ;
28- } ;
29-
3024 const handleOpenReferences = ( ) => {
3125 emitEvent ( 'refstudio://menu/references/open' ) ;
3226 } ;
@@ -45,10 +39,6 @@ export function ReferencesPanel() {
4539
4640 const handleAuthorClicked = ( author : Author ) => openReferences ( author . lastName ) ;
4741
48- const handleRemoveClicked = ( reference : ReferenceItem ) => {
49- emitEvent ( 'refstudio://references/remove' , { referenceIds : [ reference . id ] } ) ;
50- } ;
51-
5242 const handleFilterChanged = ( filter : string ) => {
5343 if ( filter . trim ( ) === '' ) {
5444 return setVisibleReferences ( references ) ;
@@ -65,58 +55,32 @@ export function ReferencesPanel() {
6555 } ;
6656
6757 return (
68- < PanelWrapper title = "References" >
69- < PanelSection
70- grow
71- rightIcons = { [
72- { key : 'new' , Icon : VscNewFile , title : 'Add References' , onClick : handleAddReferences } ,
73- { key : 'open' , Icon : VscOpenPreview , title : 'Open References' , onClick : handleOpenReferences } ,
74- {
75- key : 'export' ,
76- disabled : references . length === 0 ,
77- Icon : VscDesktopDownload ,
78- title : 'Export References' ,
79- onClick : ( ) => handleExportReferences ( ) ,
80- } ,
81- ] }
82- title = "Library"
83- >
84- < div className = "min-h-[200px] " >
85- < FilterInput placeholder = "Filter (e.g. title, author)" onChange = { handleFilterChanged } />
86- < ReferencesList
87- references = { visibleReferences }
88- onAuthorClicked = { handleAuthorClicked }
89- onRefClicked = { handleRefClicked }
90- onRemoveClicked = { handleRemoveClicked }
91- />
92-
93- { references . length === 0 && (
94- < div className = "p-2" > Welcome to your RefStudio references library. Start by uploading some PDFs.</ div >
95- ) }
96-
97- < UploadTipInstructions />
98- </ div >
99- </ PanelSection >
58+ < PanelWrapper
59+ actions = { [
60+ {
61+ key : 'new' ,
62+ title : 'Open References' ,
63+ Icon : < TableIcon /> ,
64+ onClick : handleOpenReferences ,
65+ } ,
66+ {
67+ key : 'export' ,
68+ disabled : references . length === 0 ,
69+ title : 'Export References' ,
70+ Icon : < ExportIcon /> ,
71+ onClick : handleExportReferences ,
72+ } ,
73+ ] }
74+ title = "References"
75+ >
76+ < div className = "flex flex-1 flex-col items-start gap-4 self-stretch p-4 pt-2" >
77+ < SearchBar placeholder = "Filter author/title..." onChange = { handleFilterChanged } />
78+ < ReferencesList
79+ references = { visibleReferences }
80+ onAuthorClicked = { handleAuthorClicked }
81+ onRefClicked = { handleRefClicked }
82+ />
83+ </ div >
10084 </ PanelWrapper >
10185 ) ;
10286}
103-
104- function FilterInput ( { placeholder, onChange } : { placeholder : string ; onChange : ( filter : string ) => void } ) {
105- const [ value , setValue ] = useState ( '' ) ;
106- const debouncedOnChange = useDebouncedCallback ( onChange , 200 ) ;
107-
108- return (
109- < div className = "relative mx-1 flex" >
110- < input
111- className = "grow border border-slate-400 bg-slate-100 px-4 py-2 outline-none"
112- placeholder = { placeholder }
113- type = "text"
114- value = { value }
115- onChange = { ( evt ) => {
116- setValue ( evt . target . value ) ;
117- debouncedOnChange ( evt . target . value ) ;
118- } }
119- />
120- </ div >
121- ) ;
122- }
0 commit comments