Guest User

Untitled

a guest
Apr 19th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.64 KB | None | 0 0
  1. var D = React.DOM;
  2.  
  3. var FileInput = React.createClass({
  4. getInitialState: function(){
  5. return {
  6. active: false,
  7. target: false,
  8. hover: false
  9. };
  10. },
  11. componentDidMount: function(){
  12. var self = this;
  13.  
  14. window.addEventListener('dragover', self.dropTarget);
  15. window.addEventListener('dragleave', self.dropLeave);
  16. window.addEventListener('drop', self.handleDrop);
  17. },
  18. componentWillUnmount: function(){
  19. var self = this;
  20.  
  21. window.removeEventListener('dragover', self.dropTarget);
  22. window.removeEventListener('dragleave', self.dropLeave);
  23. window.removeEventListener('drop', self.handleDrop);
  24. },
  25. handleChange: function(e){
  26. var file = e.target.files[0];
  27. this.props.onFileChange({
  28. file: file,
  29. name: file.name,
  30. type: file.type
  31. });
  32. },
  33. dropTarget: function(e){
  34. var self = this;
  35.  
  36. if (!self.state.active) {
  37. self.setState({
  38. target: true
  39. });
  40. }
  41. },
  42. dropLeave: function(e) {
  43. var self = this;
  44.  
  45. if(e.screenX === 0 && e.screenY === 0) { // Checks for if the leave event is when leaving the window
  46. self.setState({
  47. target: false
  48. });
  49. }
  50. },
  51. handleDrop: function(e){
  52. e.preventDefault();
  53. e.stopPropagation();
  54.  
  55. var self = this;
  56. var uploadObj = {
  57. target: e.nativeEvent.dataTransfer
  58. };
  59.  
  60. self.setState({
  61. target: false,
  62. hover: false
  63. });
  64.  
  65. self.handleChange(uploadObj);
  66. },
  67. handleDragEnter: function(e) {
  68. e.preventDefault();
  69. e.stopPropagation();
  70. var self = this;
  71.  
  72. if (!self.state.active) {
  73. self.setState({
  74. hover: true
  75. });
  76. }
  77. },
  78. handleDragLeave: function(e) {
  79. var self = this;
  80.  
  81. self.setState({
  82. hover: false
  83. });
  84. },
  85. handleDragOver: function(e){
  86. e.preventDefault();
  87. },
  88. getClassNames: function(){
  89. var classes = [];
  90. if(this.state.target) {
  91. classes.push('target');
  92. }
  93. if(this.state.hover) {
  94. classes.push('hover')
  95. }
  96. return classes.join(' ');
  97. },
  98. render: function(){
  99. var self = this;
  100. var classNames = self.getClassNames();
  101.  
  102. return D.div({
  103. className: 'file-container'
  104. }, [
  105. D.input({
  106. className: "file-input " + classNames,
  107. name: "upload",
  108. type: "file",
  109. ref: "upload",
  110. onChange: self.handleChange,
  111. onDrop: self.handleDrop,
  112. onDragEnter: self.handleDragEnter,
  113. onDragOver: self.handleDragOver,
  114. onDragLeave: self.handleDragLeave
  115. })
  116. ]);
  117. }
  118. });
  119.  
  120. var FilePreview = React.createClass({
  121. getChild: function(){
  122. var self = this;
  123. var child = [];
  124.  
  125. if( self.props.type.indexOf("image") > -1 ) {
  126. child.push(
  127. D.img({
  128. className: "preview-img",
  129. src: self.props.file
  130. })
  131. );
  132. } else {
  133. child.push(
  134. D.p({
  135. className: "preview-name"
  136. }, self.props.name)
  137. );
  138. }
  139.  
  140. child.push(
  141. D.button({
  142. className: "remove-file",
  143. onClick: self.props.handleFileRemove
  144. }, "Remove File")
  145. );
  146.  
  147. return child;
  148. },
  149. render: function(){
  150. var child = this.getChild();
  151. return D.div({
  152. className: "file-preview"
  153. }, child);
  154. }
  155. });
  156.  
  157. var App = React.createClass({
  158. getInitialState: function(){
  159. return {
  160. previewing: false,
  161. reset: false
  162. };
  163. },
  164. handleFile: function(fileObj){
  165. var self = this;
  166. var reader = new FileReader();
  167.  
  168. self.fileName = fileObj.name;
  169. self.fileType = fileObj.type;
  170.  
  171. reader.onload = function(e) {
  172. self.file = reader.result;
  173. self.setState({
  174. previewing: true
  175. });
  176. }
  177. reader.readAsDataURL(fileObj.file);
  178.  
  179. self.setState({
  180. reset: true
  181. });
  182. },
  183. resetFile: function(){
  184. var self = this;
  185.  
  186. self.setState({
  187. previewing: false,
  188. reset: true
  189. });
  190.  
  191. setTimeout(function(){
  192. self.setState({
  193. reset: false
  194. });
  195. }, 100);
  196. },
  197. getChildren: function(){
  198. var self = this;
  199. var childrenArr = [];
  200.  
  201. if(!self.state.reset){
  202. childrenArr.push(
  203. React.createElement(FileInput, {
  204. onFileChange: self.handleFile
  205. })
  206. );
  207. }
  208.  
  209. if(self.state.previewing){
  210. childrenArr.push(
  211. React.createElement(FilePreview, {
  212. file: self.file,
  213. name: self.fileName,
  214. type: self.fileType,
  215. handleFileRemove: self.resetFile
  216. })
  217. );
  218. }
  219.  
  220. return childrenArr;
  221. },
  222. render: function(){
  223. var children = this.getChildren();
  224. return D.div({
  225. className: "app"
  226. }, children);
  227. }
  228. });
  229.  
  230. React.render(React.createElement(App, null), document.body);
Add Comment
Please, Sign In to add comment