| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import React, { useState, useEffect } from 'react'
- import PropTypes from 'prop-types'
- const MAX_FILE_SIZE = 2 * 1024 * 1024
- export default function BinaryFileText({ file, onLoad, onError }) {
- const [textPreview, setTextPreview] = useState('')
- const [shouldShowDots, setShouldShowDots] = useState(false)
- useEffect(() => {
- let path = `/project/${window.project_id}/file/${file.id}`
- fetch(path, { method: 'HEAD' })
- .then(response => {
- if (!response.ok) throw new Error('HTTP Error Code: ' + response.status)
- return response.headers.get('Content-Length')
- })
- .then(fileSize => {
- let truncated = false
- let maxSize = null
- if (fileSize > MAX_FILE_SIZE) {
- truncated = true
- maxSize = MAX_FILE_SIZE
- }
- if (maxSize != null) {
- path += `?range=0-${maxSize}`
- }
- fetch(path)
- .then(response => {
- response.text().then(text => {
- if (truncated) {
- text = text.replace(/\n.*$/, '')
- }
- setTextPreview(text)
- onLoad()
- setShouldShowDots(truncated)
- })
- })
- .catch(err => {
- onError()
- console.error(err)
- })
- })
- .catch(err => {
- onError()
- })
- }, [file.id, onError, onLoad])
- return (
- <div>
- {textPreview && (
- <div className="text-preview">
- <div className="scroll-container">
- <p>{textPreview}</p>
- {shouldShowDots && <p>...</p>}
- </div>
- </div>
- )}
- </div>
- )
- }
- BinaryFileText.propTypes = {
- file: PropTypes.shape({ id: PropTypes.string }).isRequired,
- onLoad: PropTypes.func.isRequired,
- onError: PropTypes.func.isRequired
- }
|