summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/player/components.inline
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-07-27 23:04:55 +0200
committerJules Laplace <julescarbon@gmail.com>2020-07-27 23:04:55 +0200
commitb54da8c0e7e062cee8406d642e4cc7170d279753 (patch)
tree27963770423d8b183e4e140377e5827fb011371e /animism-align/frontend/app/views/viewer/player/components.inline
parent0919fde0919aa8ce2724ecb9797eee94774fe126 (diff)
stub for fullscreen player. adjusting sizes. refactor component
Diffstat (limited to 'animism-align/frontend/app/views/viewer/player/components.inline')
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js46
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js37
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js21
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/index.js24
4 files changed, 128 insertions, 0 deletions
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js
new file mode 100644
index 0000000..f005fc0
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js
@@ -0,0 +1,46 @@
+import React, { Component } from 'react'
+
+export const MediaCitation = ({ media }) => {
+ if (media.citation) {
+ return (
+ <span dangerouslySetInnerHTML={{ _html: media.citation }} />
+ )
+ }
+ return (
+ <span>
+ {media.author}
+ {', '}
+ {media.pre_title}
+ <i>{media.title}</i>
+ {media.post_title}
+ {'. '}
+ {media.date && (
+ ' ' + media.date + '.'
+ )}
+ {media.medium && (
+ ' ' + media.medium + '.'
+ )}
+ {media.source && (
+ ' ' + media.source.trim()
+ )}
+ </span>
+ )
+}
+
+export const MediaImage = ({ paragraph, media, currentParagraph, currentAnnotation, onAnnotationClick, onDoubleClick }) => {
+ if (!media.lookup) return <div />
+ const className = currentParagraph ? 'media image current' : 'media image'
+ const annotation = paragraph.annotations[0]
+ const item = media.lookup[annotation.settings.media_id]
+ if (!item) return <div>Media not found: {annotation.settings.media_id}</div>
+ return (
+ <div
+ className={className}
+ onDoubleClick={e => onDoubleClick(e, paragraph)}
+ >
+ {"["}
+ <MediaCitation media={item} />
+ {"]"}
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js
new file mode 100644
index 0000000..8825479
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js
@@ -0,0 +1,37 @@
+import React, { Component } from 'react'
+
+import { ROMAN_NUMERALS } from 'app/constants'
+
+export const Paragraph = ({ paragraph, currentParagraph, currentAnnotation, onAnnotationClick, onDoubleClick }) => {
+ let className = paragraph.type
+ if (className !== 'paragraph') className += ' paragraph'
+ if (currentParagraph) className += ' current'
+ return (
+ <div
+ className={className}
+ onDoubleClick={e => onDoubleClick(e, paragraph)}
+ >
+ {paragraph.annotations.map(annotation => (
+ <span
+ key={annotation.id}
+ className={annotation.id === currentAnnotation ? 'current' : ''}
+ onClick={e => onAnnotationClick(e, paragraph, annotation)}
+ dangerouslySetInnerHTML={{ __html: ' ' + annotation.text + ' ' }}
+ />
+ ))}
+ </div>
+ )
+}
+
+export const ParagraphHeading = ({ paragraph, currentParagraph, currentAnnotation, onAnnotationClick, onDoubleClick }) => {
+ let className = currentParagraph ? 'header current' : 'header'
+ const text = paragraph.annotations.map(annotation => annotation.text).join(' ')
+ return (
+ <div
+ className={className}
+ onDoubleClick={e => onDoubleClick(e, paragraph)}
+ >
+ <span>{ROMAN_NUMERALS[paragraph.sectionIndex]}{'. '}{text}</span>
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js
new file mode 100644
index 0000000..fe821eb
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js
@@ -0,0 +1,21 @@
+import React, { Component } from 'react'
+
+import { MediaCitation } from './elementTypes.image'
+
+export const MediaVideo = ({ paragraph, media, currentParagraph, currentAnnotation, onAnnotationClick, onDoubleClick }) => {
+ if (!media.lookup) return <div />
+ const className = currentParagraph ? 'media current' : 'media'
+ const annotation = paragraph.annotations[0]
+ const item = media.lookup[annotation.settings.media_id]
+ if (!item) return <div>Media not found: {annotation.settings.media_id}</div>
+ return (
+ <div
+ className={className}
+ onDoubleClick={e => onDoubleClick(e, paragraph)}
+ >
+ {"["}
+ <MediaCitation media={item} />
+ {"]"}
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/index.js b/animism-align/frontend/app/views/viewer/player/components.inline/index.js
new file mode 100644
index 0000000..ee65641
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/index.js
@@ -0,0 +1,24 @@
+import React from 'react'
+
+import {
+ Paragraph, ParagraphHeading
+} from './elementTypes.text'
+
+import {
+ MediaVideo
+} from './elementTypes.video'
+
+import {
+ MediaImage
+} from './elementTypes.image'
+
+export const transcriptElementLookup = {
+ paragraph: React.memo(Paragraph),
+ hidden: React.memo(Paragraph),
+ blockquote: React.memo(Paragraph),
+ section_heading: React.memo(ParagraphHeading),
+ heading_text: React.memo(ParagraphHeading),
+ header: React.memo(ParagraphHeading),
+ video: React.memo(MediaVideo),
+ image: React.memo(MediaImage),
+}