77
88import classNames from 'classnames' ;
99import PropTypes from 'prop-types' ;
10- import React , { useState , ForwardedRef , ReactElement } from 'react' ;
10+ import React , { useState , ForwardedRef , useImperativeHandle } from 'react' ;
1111import Filename from './Filename' ;
1212import FileUploaderButton from './FileUploaderButton' ;
13- import { ButtonKinds } from '../../prop-types/types ' ;
13+ import { ButtonKinds } from '../Button/Button ' ;
1414import { keys , matches } from '../../internal/keyboard' ;
1515import { usePrefix } from '../../internal/usePrefix' ;
1616import { ReactAttr } from '../../types/common' ;
@@ -107,8 +107,15 @@ export interface FileUploaderProps extends ReactAttr<HTMLSpanElement> {
107107 size ?: 'sm' | 'small' | 'md' | 'field' | 'lg' ;
108108}
109109
110+ export interface FileUploaderHandle {
111+ /**
112+ * Clear internal state
113+ */
114+ clearFiles : ( ) => void ;
115+ }
116+
110117const FileUploader = React . forwardRef (
111- < ItemType , > (
118+ (
112119 {
113120 accept,
114121 buttonKind,
@@ -127,15 +134,14 @@ const FileUploader = React.forwardRef(
127134 size,
128135 ...other
129136 } : FileUploaderProps ,
130- ref : ForwardedRef < HTMLButtonElement >
137+ ref : ForwardedRef < FileUploaderHandle >
131138 ) => {
132139 const fileUploaderInstanceId = useId ( 'file-uploader' ) ;
133140 const [ state , updateState ] = useState ( {
134141 fileNames : [ ] as ( string | undefined ) [ ] ,
135142 } ) ;
136143 const nodes : HTMLElement [ ] = [ ] ;
137144 const prefix = usePrefix ( ) ;
138-
139145 const handleChange = ( evt ) => {
140146 evt . stopPropagation ( ) ;
141147 const filenames = Array . prototype . map . call (
@@ -169,10 +175,11 @@ const FileUploader = React.forwardRef(
169175 }
170176 } ;
171177
172- const clearFiles = ( ) => {
173- // A clearFiles function that resets filenames and can be referenced using a ref by the parent.
174- updateState ( { fileNames : [ ] } ) ;
175- } ;
178+ useImperativeHandle ( ref , ( ) => ( {
179+ clearFiles ( ) {
180+ updateState ( { fileNames : [ ] } ) ;
181+ } ,
182+ } ) ) ;
176183
177184 const uploaderButton = React . createRef < HTMLLabelElement > ( ) ;
178185 const classes = classNames ( {
@@ -255,12 +262,7 @@ const FileUploader = React.forwardRef(
255262 </ div >
256263 ) ;
257264 }
258- ) as {
259- < ItemType > ( props : FileUploaderProps ) : ReactElement ;
260- propTypes ?: any ;
261- contextTypes ?: any ;
262- defaultProps ?: any ;
263- } ;
265+ ) ;
264266
265267FileUploader . propTypes = {
266268 /**
@@ -342,6 +344,6 @@ FileUploader.propTypes = {
342344 * sizes.
343345 */
344346 size : PropTypes . oneOf ( [ 'sm' , 'md' , 'lg' ] ) ,
345- } ;
347+ } as PropTypes . ValidationMap < FileUploaderProps > ;
346348
347349export default FileUploader ;
0 commit comments