import React, { useCallback, useEffect, useState } from 'react'; import { useAsync, useDebounce } from 'react-use'; import { FetchError, isFetchError } from '@grafana/runtime'; import { Button, Field, Input, Modal } from '@grafana/ui'; import { OldFolderPicker } from 'app/core/components/Select/OldFolderPicker'; import { t, Trans } from 'app/core/internationalization'; import { PanelModel } from '../../../dashboard/state'; import { getLibraryPanelByName } from '../../state/api'; import { LibraryElementDTO } from '../../types'; import { usePanelSave } from '../../utils/usePanelSave'; interface AddLibraryPanelContentsProps { onDismiss?: () => void; panel: PanelModel; initialFolderUid?: string; } export const AddLibraryPanelContents = ({ panel, initialFolderUid, onDismiss }: AddLibraryPanelContentsProps) => { const [folderUid, setFolderUid] = useState(initialFolderUid); const [panelName, setPanelName] = useState(panel.title); const [debouncedPanelName, setDebouncedPanelName] = useState(panel.title); const [waiting, setWaiting] = useState(false); console.log('folderUid', folderUid); useEffect(() => setWaiting(true), [panelName]); useDebounce(() => setDebouncedPanelName(panelName), 350, [panelName]); const { saveLibraryPanel } = usePanelSave(); const onCreate = useCallback(() => { panel.libraryPanel = { uid: '', name: panelName }; saveLibraryPanel(panel, folderUid!).then((res: LibraryElementDTO | FetchError) => { if (!isFetchError(res)) { onDismiss?.(); } else { panel.libraryPanel = undefined; } }); }, [panel, panelName, folderUid, onDismiss, saveLibraryPanel]); const isValidName = useAsync(async () => { try { return !(await getLibraryPanelByName(panelName)).some((lp) => lp.folderUid === folderUid); } catch (err) { if (isFetchError(err)) { err.isHandled = true; } return true; } finally { setWaiting(false); } }, [debouncedPanelName, folderUid]); console.log('isValidName:', isValidName); const invalidInput = !isValidName?.value && isValidName.value !== undefined && panelName === debouncedPanelName && !waiting; return ( <> setPanelName(e.currentTarget.value)} /> setFolderUid(uid)} initialFolderUid={initialFolderUid} inputId="share-panel-library-panel-folder-picker" /> ); }; interface Props extends AddLibraryPanelContentsProps { isOpen?: boolean; } export const AddLibraryPanelModal = ({ isOpen = false, panel, initialFolderUid, ...props }: Props) => { return ( ); };