Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.69 KB | None | 0 0
  1. diff --git a/src/components/App.js b/src/components/App.js
  2. index e744e47..c7595bc 100644
  3. --- a/src/components/App.js
  4. +++ b/src/components/App.js
  5. @@ -6,6 +6,7 @@ import * as components from './index';
  6. const {
  7. Bloggur,
  8. EntryCreator,
  9. + EntryEditor,
  10. Entry,
  11. Home,
  12. UserLogIn,
  13. @@ -24,6 +25,10 @@ const App = () => (
  14. <Route path="create" component={EntryCreator} />
  15.  
  16. <Route path=":userName">
  17. + <Route path="edit/:entryId" component={EntryEditor}>
  18. + <Route path=":entrySlug" />
  19. + </Route>
  20. +
  21. <Route path=":entryId" component={Entry}>
  22. <Route path=":entrySlug" />
  23. </Route>
  24. diff --git a/src/components/Entry.js b/src/components/Entry.js
  25. index 5d3fea4..ea6fb64 100644
  26. --- a/src/components/Entry.js
  27. +++ b/src/components/Entry.js
  28. @@ -2,19 +2,13 @@ import React, { PropTypes } from 'react';
  29. import Markdown from 'react-remarkable';
  30. import { Link } from 'react-router';
  31.  
  32. -const Entry = ({
  33. - classes,
  34. - userName,
  35. - entryId,
  36. - entrySlug,
  37. +export function getEntryContents({
  38. entryName,
  39. entryContents,
  40. entryDeleted,
  41. - entryByUserId,
  42. - requestSession,
  43. setStatusCode,
  44. setDocumentTitle
  45. -}) => {
  46. +}) {
  47. if (entryDeleted || !entryName) {
  48. setStatusCode(404);
  49. setDocumentTitle('404 - Entry not found!');
  50. @@ -35,25 +29,45 @@ const Entry = ({
  51. }
  52. }
  53.  
  54. - return (
  55. - <div className={classes.Entry}>
  56. - <Markdown source={entryContents} />
  57. -
  58. - {entryByUserId === requestSession.userId
  59. - ? (
  60. - <Link
  61. - className={classes.EditButton}
  62. - to={`/${userName}/edit/${entryId}/${entrySlug}`}
  63. - >
  64. - Edit
  65. - </Link>
  66. - )
  67. - : undefined
  68. - }
  69. - </div>
  70. - );
  71. + return entryContents;
  72. };
  73.  
  74. +const Entry = ({
  75. + classes,
  76. + userName,
  77. + entryId,
  78. + entrySlug,
  79. + entryName,
  80. + entryContents,
  81. + entryDeleted,
  82. + entryByUserId,
  83. + requestSession,
  84. + setStatusCode,
  85. + setDocumentTitle
  86. +}) => (
  87. + <div className={classes.Entry}>
  88. + <Markdown source={getEntryContents({
  89. + entryName,
  90. + entryContents,
  91. + entryDeleted,
  92. + setStatusCode,
  93. + setDocumentTitle
  94. + })} />
  95. +
  96. + {entryByUserId === requestSession.userId
  97. + ? (
  98. + <Link
  99. + className={classes.EditButton}
  100. + to={`/${userName}/edit/${entryId}/${entrySlug}`}
  101. + >
  102. + Edit
  103. + </Link>
  104. + )
  105. + : undefined
  106. + }
  107. + </div>
  108. +);
  109. +
  110. Entry.propTypes = {
  111. classes: PropTypes.object.isRequired,
  112. userName: PropTypes.string.isRequired,
  113. diff --git a/src/components/EntryEditor.js b/src/components/EntryEditor.js
  114. new file mode 100644
  115. index 0000000..64d0f63
  116. --- /dev/null
  117. +++ b/src/components/EntryEditor.js
  118. @@ -0,0 +1,110 @@
  119. +import React, { PropTypes } from 'react';
  120. +import { Form } from 'provide-page';
  121. +import { getEntryContents } from './Entry';
  122. +
  123. +const EntryEditor = ({
  124. + classes,
  125. + userName,
  126. + entryId,
  127. + entryName,
  128. + entryContents,
  129. + entryByUserId,
  130. + entryDeleted,
  131. + entryError,
  132. + setEntryError,
  133. + updateEntry,
  134. + deleteEntry,
  135. + replaceRoute,
  136. + pushRoute,
  137. + requestSession,
  138. + setStatusCode,
  139. + setDocumentTitle,
  140. + formId,
  141. + formData
  142. +}) => {
  143. + const canEdit = entryByUserId === requestSession.userId;
  144. + const onSubmit = (event, formData) => {
  145. + if (!formData) {
  146. + return;
  147. + }
  148. +
  149. + if (!canEdit) {
  150. + setEntryError(`You don't have permission to do that!`);
  151. + return;
  152. + }
  153. +
  154. + if (formData.entryContents) {
  155. + updateEntry(formData, ({ entrySlug }) => {
  156. + replaceRoute(`/${userName}/${entryId}/${entrySlug}`);
  157. + });
  158. + } else {
  159. + deleteEntry(() => pushRoute(`/`));
  160. + }
  161. + };
  162. +
  163. + return (
  164. + <Form
  165. + formId={formId}
  166. + className={classes.EntryEditor}
  167. + onSubmit={onSubmit}
  168. + >
  169. + <textarea
  170. + className={classes.EntryEditorInput}
  171. + name="entryContents"
  172. + defaultValue={getEntryContents({
  173. + entryName,
  174. + entryContents,
  175. + entryDeleted,
  176. + setStatusCode,
  177. + setDocumentTitle
  178. + })}
  179. + autoFocus
  180. + />
  181. +
  182. + {canEdit
  183. + ? (
  184. + <button className={classes.SaveButton} type="submit">
  185. + Save
  186. + </button>
  187. + )
  188. + : undefined
  189. + }
  190. +
  191. + {entryError
  192. + ? (
  193. + <div className={classes.EntryError}>
  194. + {entryError}
  195. + </div>
  196. + )
  197. + : undefined
  198. + }
  199. + </Form>
  200. + );
  201. +};
  202. +
  203. +EntryEditor.propTypes = {
  204. + classes: PropTypes.object.isRequired,
  205. + userName: PropTypes.string.isRequired,
  206. + entryId: PropTypes.string.isRequired,
  207. + entryName: PropTypes.string.isRequired,
  208. + entryContents: PropTypes.string.isRequired,
  209. + entryByUserId: PropTypes.string.isRequired,
  210. + entryDeleted: PropTypes.bool.isRequired,
  211. + entryError: PropTypes.string.isRequired,
  212. + setEntryError: PropTypes.func.isRequired,
  213. + updateEntry: PropTypes.func.isRequired,
  214. + deleteEntry: PropTypes.func.isRequired,
  215. + replaceRoute: PropTypes.func.isRequired,
  216. + pushRoute: PropTypes.func.isRequired,
  217. + requestSession: PropTypes.object.isRequired,
  218. + setStatusCode: PropTypes.func.isRequired,
  219. + setDocumentTitle: PropTypes.func.isRequired,
  220. + formId: PropTypes.string.isRequired,
  221. + formData: PropTypes.object
  222. +};
  223. +
  224. +EntryEditor.defaultProps = {
  225. + formId: 'EntryEditor'
  226. +};
  227. +
  228. +export default EntryEditor;
  229. diff --git a/src/components/index.js b/src/components/index.js
  230. index b6f740a..a069a67 100644
  231. --- a/src/components/index.js
  232. +++ b/src/components/index.js
  233. @@ -3,6 +3,7 @@ export Home from './Home';
  234. export Bloggur from './Bloggur';
  235. export Entry from './Entry';
  236. export EntryCreator from './EntryCreator';
  237. +export EntryEditor from './EntryEditor';
  238. export EntryLink from './EntryLink';
  239. export NotFound from './NotFound';
  240. export ThemeSelector from './ThemeSelector';
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement