file-tree-create-name.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { createContext, useContext, useMemo, useReducer } from 'react'
  2. import { isCleanFilename } from '../util/safe-path'
  3. import PropTypes from 'prop-types'
  4. const FileTreeCreateNameContext = createContext()
  5. export const useFileTreeCreateName = () => {
  6. const context = useContext(FileTreeCreateNameContext)
  7. if (!context) {
  8. throw new Error(
  9. 'useFileTreeCreateName is only available inside FileTreeCreateNameProvider'
  10. )
  11. }
  12. return context
  13. }
  14. export default function FileTreeCreateNameProvider({
  15. children,
  16. initialName = '',
  17. }) {
  18. const [state, setName] = useReducer(
  19. (state, name) => ({
  20. name, // the file name
  21. touchedName: true, // whether the name has been edited
  22. }),
  23. {
  24. name: initialName,
  25. touchedName: false,
  26. }
  27. )
  28. // validate the file name
  29. const validName = useMemo(() => isCleanFilename(state.name.trim()), [state])
  30. return (
  31. <FileTreeCreateNameContext.Provider
  32. value={{ ...state, setName, validName }}
  33. >
  34. {children}
  35. </FileTreeCreateNameContext.Provider>
  36. )
  37. }
  38. FileTreeCreateNameProvider.propTypes = {
  39. children: PropTypes.oneOfType([
  40. PropTypes.arrayOf(PropTypes.node),
  41. PropTypes.node,
  42. ]).isRequired,
  43. initialName: PropTypes.string,
  44. }