UploadFile.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { useState, ChangeEvent } from 'react'
  2. import { useUploadFileMutation, useFsFilesQuery, useFilesQuery } from '../../gql'
  3. import { danglingFsFiles } from '../utils'
  4. interface IForm {
  5. file: File | null
  6. comment: string
  7. }
  8. const initialVariables: IForm = {
  9. file: null,
  10. comment: '',
  11. }
  12. const FileManager = () => {
  13. const [folder, setFolder] = useState('upload_files')
  14. const uploadFiles = useFsFilesQuery({ variables: { directory: folder } })
  15. const files = useFilesQuery()
  16. const error = (uploadFiles.error || files.error) && <p>Fehler beim Laden der Dateien...</p>
  17. const loading = (uploadFiles.loading || files.loading) && <p>Lade Dateien...</p>
  18. const danglingFsFilesFound = danglingFsFiles(uploadFiles.data, files.data)
  19. function handleChange(event: ChangeEvent<HTMLInputElement>) {
  20. setFolder(event.target.value)
  21. }
  22. return (
  23. <form>
  24. <h1>File Manager</h1>
  25. <input type='text' name='folder' id='folder' value={folder} onChange={handleChange} />
  26. {error}
  27. {loading}
  28. {danglingFsFilesFound ? (
  29. <table>
  30. <thead>
  31. <tr>
  32. <th></th>
  33. <th>Datei</th>
  34. </tr>
  35. </thead>
  36. <tbody>
  37. {files.data?.files.map((file, index) =>
  38. file ? (
  39. <tr key={index}>
  40. <td>
  41. <input type='checkbox' />
  42. </td>
  43. <td>
  44. <a href={`/${file.path}`} download={file.filename}>
  45. {file.filename}
  46. </a>
  47. </td>
  48. </tr>
  49. ) : null
  50. )}
  51. </tbody>
  52. </table>
  53. ) : (
  54. <p>no dangeling files found.</p>
  55. )}
  56. </form>
  57. )
  58. }
  59. const UploadFile = () => {
  60. const [uploadFile, { error, loading }] = useUploadFileMutation()
  61. const [variables, setVariables] = useState(initialVariables)
  62. return (
  63. <>
  64. <form
  65. onSubmit={(event) => {
  66. event.preventDefault()
  67. uploadFile({ variables })
  68. }}
  69. >
  70. <input
  71. type='file'
  72. name='file'
  73. id='file'
  74. onChange={(event) =>
  75. setVariables({
  76. ...variables,
  77. file: event.target.files && event.target.files[0],
  78. })
  79. }
  80. />
  81. <textarea
  82. name='comment'
  83. id='comment'
  84. placeholder='Kommentar'
  85. onChange={(event) =>
  86. setVariables({
  87. ...variables,
  88. comment: event.target.value,
  89. })
  90. }
  91. ></textarea>
  92. <button type='submit' disabled={loading}>
  93. Upload
  94. </button>
  95. {error && <div className='error'>Error</div>}
  96. </form>
  97. <FileManager />
  98. </>
  99. )
  100. }
  101. export default UploadFile