pageflow 15.2.2 → 15.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of pageflow might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -118
- data/README.md +2 -3
- data/admins/pageflow/accounts.rb +1 -98
- data/admins/pageflow/entry.rb +21 -1
- data/admins/pageflow/entry_templates.rb +140 -0
- data/admins/pageflow/membership.rb +12 -0
- data/admins/pageflow/user.rb +5 -5
- data/app/assets/javascripts/pageflow/admin/entries.js +65 -0
- data/app/assets/javascripts/pageflow/admin/users.js +1 -1
- data/app/assets/javascripts/pageflow/asset_urls.js.erb +1 -0
- data/app/assets/javascripts/pageflow/base.js +0 -12
- data/app/assets/javascripts/pageflow/components.js +2 -6
- data/app/assets/javascripts/pageflow/dist/ui.js +178 -55
- data/app/assets/javascripts/pageflow/editor/vendor.js +1 -0
- data/app/assets/javascripts/pageflow/vendor.js +12 -10
- data/app/assets/stylesheets/pageflow/base.scss +0 -7
- data/app/assets/stylesheets/pageflow/editor/base.scss +5 -2
- data/app/assets/stylesheets/pageflow/editor/composables.scss +5 -1
- data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +1 -1
- data/app/assets/stylesheets/pageflow/editor/emulation_mode_button.scss +44 -55
- data/app/assets/stylesheets/pageflow/editor/help.scss +2 -2
- data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
- data/app/assets/stylesheets/pageflow/editor/sidebar_footer.scss +1 -1
- data/app/assets/stylesheets/pageflow/entries.scss +1 -1
- data/app/assets/stylesheets/pageflow/loading_spinner.scss +4 -1
- data/app/assets/stylesheets/pageflow/navigation_mobile.scss +4 -4
- data/app/assets/stylesheets/pageflow/themes/default/anchors.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/logo/variant/watermark.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/page.scss +7 -0
- data/app/assets/stylesheets/pageflow/themes/default/page/anchors.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/control_bar.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/classic/info_box.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/shared/menu_bar.scss +2 -2
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/control_bar.scss +2 -2
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/info_box.scss +1 -1
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/slim/quality_menu.scss +2 -2
- data/app/assets/stylesheets/pageflow/themes/default/player_controls/waveform/wave.scss +1 -1
- data/app/assets/stylesheets/pageflow/ui/forms.scss +9 -2
- data/app/assets/stylesheets/pageflow/ui/input/extended_select_input.scss +2 -2
- data/app/assets/stylesheets/pageflow/ui/tooltip.scss +17 -3
- data/app/helpers/pageflow/admin/entries_helper.rb +16 -0
- data/app/helpers/pageflow/structured_data_helper.rb +0 -2
- data/app/models/pageflow/account.rb +21 -1
- data/app/models/pageflow/account_role_query.rb +1 -1
- data/app/models/pageflow/chapter.rb +3 -9
- data/app/models/pageflow/entry.rb +9 -2
- data/app/models/pageflow/entry_duplicate.rb +1 -0
- data/app/models/pageflow/entry_template.rb +16 -2
- data/app/models/pageflow/managed_user_query.rb +1 -1
- data/app/models/pageflow/page.rb +1 -4
- data/app/models/pageflow/revision.rb +0 -4
- data/app/models/pageflow/storyline.rb +2 -9
- data/app/policies/pageflow/account_policy.rb +10 -0
- data/app/policies/pageflow/entry_template_policy.rb +5 -1
- data/app/policies/pageflow/folder_policy.rb +2 -2
- data/app/policies/pageflow/membership_policy.rb +2 -2
- data/app/policies/pageflow/theming_policy.rb +2 -2
- data/app/policies/pageflow/user_policy.rb +1 -1
- data/app/views/admin/accounts/_entry_template_details.html.arb +7 -5
- data/app/views/admin/accounts/_form.html.erb +3 -49
- data/app/views/admin/entries/_attributes_table.html.arb +5 -0
- data/app/views/admin/entries/_not_allowed_to_see_entry_types.json.jbuilder +2 -0
- data/app/views/admin/entries/entry_types.json.jbuilder +4 -0
- data/app/views/admin/entry_templates/_form.html.erb +58 -0
- data/app/views/admin/users/_not_allowed_to_see_user_quota.html.erb +3 -0
- data/app/views/components/pageflow/admin/entry_templates_tab.rb +48 -0
- data/app/views/pageflow/admin/initial_passwords/edit.html.erb +2 -1
- data/app/views/pageflow/admin/users/_quota_exhausted.html.erb +1 -1
- data/app/views/pageflow/themes/_theme.json.jbuilder +1 -1
- data/app/views/pageflow/video_files/_video_file.json.jbuilder +8 -1
- data/config/initializers/admin_resource_tabs.rb +5 -0
- data/config/initializers/help_entries.rb +1 -5
- data/config/initializers/revision_components.rb +5 -0
- data/config/locales/de.yml +88 -155
- data/config/locales/en.yml +79 -143
- data/db/migrate/20200515112500_add_constraints_to_entry_templates.rb +21 -0
- data/db/migrate/20200807135200_rename_pageflow_entry_template_entry_type_to_entry_type_name.rb +7 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/components.js +7 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +1528 -1349
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +9258 -0
- data/{app/assets/javascripts/pageflow → entry_types/paged/app/assets/javascripts/pageflow_paged}/dist/react-client.js +1 -1
- data/{app/assets/javascripts/pageflow → entry_types/paged/app/assets/javascripts/pageflow_paged}/dist/react-server.js +3 -3
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/frontend.js +6 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/server_rendering.js +9 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/vendor.js +9 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/videojs.js +6 -0
- data/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb +2 -2
- data/{app/helpers/pageflow → entry_types/paged/app/helpers/pageflow_paged}/page_background_asset_helper.rb +4 -3
- data/{app/helpers/pageflow → entry_types/paged/app/helpers/pageflow_paged}/react_server_side_rendering_helper.rb +23 -2
- data/entry_types/paged/app/views/layouts/pageflow_paged/_loading_spinner_inline_script.html.erb +1 -0
- data/entry_types/paged/app/views/layouts/pageflow_paged/application.html.erb +3 -3
- data/entry_types/paged/app/views/pageflow_paged/editor/entries/_head.html.erb +4 -2
- data/entry_types/paged/app/views/pageflow_paged/entries/_entry.html.erb +1 -1
- data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/page_background_asset/_element.html.erb +0 -0
- data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/react/_widget.html.erb +0 -0
- data/{app/views/pageflow → entry_types/paged/app/views/pageflow_paged}/react/page.html.erb +0 -0
- data/entry_types/paged/config/initializers/features.rb +1 -1
- data/entry_types/paged/config/initializers/help_entries.rb +17 -0
- data/entry_types/paged/config/locales/new/help.de.yml +162 -0
- data/entry_types/paged/config/locales/new/help.en.yml +153 -0
- data/entry_types/paged/lib/pageflow_paged/engine.rb +13 -0
- data/entry_types/paged/lib/pageflow_paged/plugin.rb +5 -1
- data/entry_types/paged/lib/pageflow_paged/react.rb +12 -0
- data/{lib/pageflow → entry_types/paged/lib/pageflow_paged}/react/page_type.rb +2 -2
- data/{lib/pageflow → entry_types/paged/lib/pageflow_paged}/react/widget_type.rb +2 -2
- data/entry_types/paged/lib/tasks/pageflow_paged_tasks.rake +7 -0
- data/entry_types/paged/vendor/assets/javascripts/development/pageflow_paged/vendor/react-server.js +20613 -0
- data/entry_types/paged/vendor/assets/javascripts/development/pageflow_paged/vendor/react.js +21495 -0
- data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/dash.all.min.js +0 -0
- data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/videojs-dash.js +0 -0
- data/{vendor/assets/javascripts → entry_types/paged/vendor/assets/javascripts/pageflow_paged/vendor}/videojs.js +0 -0
- data/entry_types/paged/vendor/assets/javascripts/production/pageflow_paged/vendor/react-server.js +24 -0
- data/entry_types/paged/vendor/assets/javascripts/production/pageflow_paged/vendor/react.js +24 -0
- data/entry_types/scrolled/app/assets/javascripts/pageflow_scrolled/legacy.js +0 -0
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +2 -2
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +14 -4
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +10 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +7 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +2 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/favicon_helper.rb +21 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +40 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +36 -0
- data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +3 -9
- data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +37 -2
- data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +3 -9
- data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +1 -9
- data/entry_types/scrolled/app/views/pageflow_scrolled/editor/content_elements/batch.json.jbuilder +2 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -7
- data/entry_types/scrolled/app/views/pageflow_scrolled/entries/_global_notices.html.erb +10 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +28 -11
- data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +3 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +8 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +10 -0
- data/entry_types/scrolled/config/initializers/help_entries.rb +16 -0
- data/entry_types/scrolled/config/locales/de.yml +669 -0
- data/entry_types/scrolled/config/locales/en.yml +488 -0
- data/entry_types/scrolled/config/routes.rb +1 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +76 -6
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/android-chrome-192x192.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/android-chrome-512x512.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/apple-touch-icon.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/browserconfig.xml +9 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon-16x16.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon-32x32.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/favicon.ico +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/mstile-150x150.png +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/safari-pinned-tab.svg +46 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/favicons/site.webmanifest +19 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDesktop.svg +56 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoMobile.svg +22 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/unmute.mp3 +0 -0
- data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +6 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +3 -1
- data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +90 -30
- data/entry_types/scrolled/lib/tasks/pageflow_scrolled/create_bundle_symlinks_for_yarn.rake +33 -0
- data/entry_types/scrolled/lib/tasks/pageflow_scrolled/dummy.rake +8 -0
- data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +173 -0
- data/entry_types/scrolled/package/config/webpack.js +11 -0
- data/entry_types/scrolled/package/contentElements-editor.js +316 -185
- data/entry_types/scrolled/package/contentElements-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements-frontend.js +940 -304
- data/entry_types/scrolled/package/editor.js +2930 -371
- data/entry_types/scrolled/package/frontend-server.js +228 -0
- data/entry_types/scrolled/package/frontend/EditableText-7093fd0e.js +1071 -0
- data/entry_types/scrolled/package/frontend/Viewer-e49e7807.js +387 -0
- data/entry_types/scrolled/package/frontend/Wavesurfer-0adf5667.js +375 -0
- data/entry_types/scrolled/package/frontend/components-6a6793ca.js +2534 -0
- data/entry_types/scrolled/package/frontend/getPrototypeOf-63c7c8e8.js +86 -0
- data/entry_types/scrolled/package/frontend/i18n-4dc6c377.js +1092 -0
- data/entry_types/scrolled/package/frontend/index.css +9 -0
- data/entry_types/scrolled/package/frontend/index.js +5686 -0
- data/entry_types/scrolled/package/frontend/useBrowserFeature-91a4c29d.js +33 -0
- data/entry_types/scrolled/package/package.json +30 -9
- data/entry_types/scrolled/spec/fixtures/audio.m4a +0 -0
- data/entry_types/scrolled/spec/fixtures/video.mp4 +0 -0
- data/lib/generators/pageflow/initializer/templates/pageflow.rb +14 -9
- data/lib/pageflow/ability_mixin.rb +14 -2
- data/lib/pageflow/configuration.rb +6 -5
- data/lib/pageflow/entry_export_import/revision_serialization.rb +15 -13
- data/lib/pageflow/entry_export_import/revision_serialization/import.rb +18 -26
- data/lib/pageflow/entry_type_configuration.rb +2 -0
- data/lib/pageflow/global_config_api.rb +5 -4
- data/lib/pageflow/nested_revision_component.rb +49 -0
- data/lib/pageflow/react.rb +4 -2
- data/lib/pageflow/revision_component.rb +6 -2
- data/lib/pageflow/themes.rb +4 -0
- data/lib/pageflow/user_mixin.rb +2 -1
- data/lib/pageflow/version.rb +1 -1
- data/{packages/pageflow → package}/config/jest/index.js +8 -2
- data/{packages/pageflow → package}/config/jest/transformers/jst.js +0 -0
- data/{packages/pageflow → package}/config/jest/transformers/upwardBabel.js +0 -0
- data/{packages/pageflow → package}/config/webpack.js +7 -0
- data/{packages/pageflow → package}/editor.js +482 -1130
- data/package/frontend.js +2553 -0
- data/{packages/pageflow → package}/package.json +3 -0
- data/{packages/pageflow → package}/testHelpers.js +114 -13
- data/{packages/pageflow → package}/ui.js +178 -55
- data/spec/factories/accounts.rb +3 -1
- data/spec/factories/entry_templates.rb +1 -0
- data/spec/factories/published_entries.rb +6 -1
- data/spec/factories/test_revision_components.rb +4 -0
- metadata +95 -36
- data/app/assets/javascripts/pageflow/dist/frontend.js +0 -5800
- data/app/assets/javascripts/pageflow/videojs.js +0 -6
- data/config/initializers/entry_types.rb +0 -4
- data/entry_types/scrolled/config/locales/new/de.yml +0 -269
- data/entry_types/scrolled/config/locales/new/en.yml +0 -264
- data/entry_types/scrolled/lib/tasks/pageflow_scrolled_tasks.rake +0 -96
- data/entry_types/scrolled/package/frontend.js +0 -2879
- data/packages/pageflow/config/jest/transformers/cssModules.js +0 -1
@@ -0,0 +1,387 @@
|
|
1
|
+
import 'pageflow/frontend';
|
2
|
+
import React, { useMemo, useEffect, useRef, useState } from 'react';
|
3
|
+
import ReactDOM from 'react-dom';
|
4
|
+
import { b as _objectWithoutProperties, u as useI18n, _ as _slicedToArray, a as _defineProperty } from './i18n-4dc6c377.js';
|
5
|
+
import classNames from 'classnames';
|
6
|
+
import 'use-context-selector';
|
7
|
+
import 'reselect';
|
8
|
+
import 'i18n-js';
|
9
|
+
import 'slugify';
|
10
|
+
import { u as useBrowserFeature } from './useBrowserFeature-91a4c29d.js';
|
11
|
+
import { PanoViewer } from '@egjs/view360';
|
12
|
+
import screenfull from 'screenfull';
|
13
|
+
|
14
|
+
function _extends() {
|
15
|
+
_extends = Object.assign || function (target) {
|
16
|
+
for (var i = 1; i < arguments.length; i++) {
|
17
|
+
var source = arguments[i];
|
18
|
+
|
19
|
+
for (var key in source) {
|
20
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
21
|
+
target[key] = source[key];
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
return target;
|
27
|
+
};
|
28
|
+
|
29
|
+
return _extends.apply(this, arguments);
|
30
|
+
}
|
31
|
+
var EnterFullscreenIcon = (function (_ref) {
|
32
|
+
var _ref$styles = _ref.styles,
|
33
|
+
styles = _ref$styles === void 0 ? {} : _ref$styles,
|
34
|
+
props = _objectWithoutProperties(_ref, ["styles"]);
|
35
|
+
|
36
|
+
return React.createElement("svg", _extends({
|
37
|
+
"aria-hidden": "true",
|
38
|
+
"data-prefix": "fas",
|
39
|
+
"data-icon": "expand",
|
40
|
+
className: (styles["svg-inline--fa"] || "svg-inline--fa") + " " + (styles["fa-expand"] || "fa-expand") + " " + (styles["fa-w-14"] || "fa-w-14"),
|
41
|
+
xmlns: "http://www.w3.org/2000/svg",
|
42
|
+
viewBox: "0 0 448 512"
|
43
|
+
}, props), React.createElement("path", {
|
44
|
+
fill: "currentColor",
|
45
|
+
d: "M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z"
|
46
|
+
}));
|
47
|
+
});
|
48
|
+
|
49
|
+
function _extends$1() {
|
50
|
+
_extends$1 = Object.assign || function (target) {
|
51
|
+
for (var i = 1; i < arguments.length; i++) {
|
52
|
+
var source = arguments[i];
|
53
|
+
|
54
|
+
for (var key in source) {
|
55
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
56
|
+
target[key] = source[key];
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
return target;
|
62
|
+
};
|
63
|
+
|
64
|
+
return _extends$1.apply(this, arguments);
|
65
|
+
}
|
66
|
+
var ExitFullscreenIcon = (function (_ref) {
|
67
|
+
var _ref$styles = _ref.styles,
|
68
|
+
styles = _ref$styles === void 0 ? {} : _ref$styles,
|
69
|
+
props = _objectWithoutProperties(_ref, ["styles"]);
|
70
|
+
|
71
|
+
return React.createElement("svg", _extends$1({
|
72
|
+
"aria-hidden": "true",
|
73
|
+
"data-prefix": "fas",
|
74
|
+
"data-icon": "compress",
|
75
|
+
className: (styles["svg-inline--fa"] || "svg-inline--fa") + " " + (styles["fa-compress"] || "fa-compress") + " " + (styles["fa-w-14"] || "fa-w-14"),
|
76
|
+
xmlns: "http://www.w3.org/2000/svg",
|
77
|
+
viewBox: "0 0 448 512"
|
78
|
+
}, props), React.createElement("path", {
|
79
|
+
fill: "currentColor",
|
80
|
+
d: "M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z"
|
81
|
+
}));
|
82
|
+
});
|
83
|
+
|
84
|
+
var styles = {"button":"ToggleFullscreenButton-module_button__3iBr8 utils-module_unstyledButton__3rgne"};
|
85
|
+
|
86
|
+
function ToggleFullscreenButton(props) {
|
87
|
+
var _useI18n = useI18n(),
|
88
|
+
t = _useI18n.t;
|
89
|
+
|
90
|
+
return (
|
91
|
+
/*#__PURE__*/
|
92
|
+
React.createElement("button", {
|
93
|
+
className: styles.button,
|
94
|
+
title: t(props.isFullscreen ? 'exit_fullscreen' : 'enter_fullscreen', {
|
95
|
+
scope: 'pageflow_scrolled.public'
|
96
|
+
}),
|
97
|
+
onClick: function onClick() {
|
98
|
+
return props.isFullscreen ? props.onExit() : props.onEnter();
|
99
|
+
}
|
100
|
+
}, icon(props))
|
101
|
+
);
|
102
|
+
}
|
103
|
+
|
104
|
+
function icon(props) {
|
105
|
+
if (props.isFullscreen) {
|
106
|
+
return (
|
107
|
+
/*#__PURE__*/
|
108
|
+
React.createElement(ExitFullscreenIcon, null)
|
109
|
+
);
|
110
|
+
} else {
|
111
|
+
return (
|
112
|
+
/*#__PURE__*/
|
113
|
+
React.createElement(EnterFullscreenIcon, null)
|
114
|
+
);
|
115
|
+
}
|
116
|
+
}
|
117
|
+
|
118
|
+
var styles$1 = {"wrapper":"Fullscreen-module_wrapper__300hJ"};
|
119
|
+
|
120
|
+
function Fullscreen(_ref) {
|
121
|
+
var isFullscreen = _ref.isFullscreen,
|
122
|
+
children = _ref.children;
|
123
|
+
var root = useMemo(function () {
|
124
|
+
return document.getElementById('fullscreenRoot');
|
125
|
+
}, []);
|
126
|
+
useEffect(function () {
|
127
|
+
if (isFullscreen) {
|
128
|
+
document.body.style.overflow = 'hidden';
|
129
|
+
} else {
|
130
|
+
document.body.style.overflow = 'initial';
|
131
|
+
}
|
132
|
+
}, [isFullscreen]);
|
133
|
+
|
134
|
+
if (isFullscreen) {
|
135
|
+
return ReactDOM.createPortal(
|
136
|
+
/*#__PURE__*/
|
137
|
+
React.createElement("div", {
|
138
|
+
className: styles$1.wrapper
|
139
|
+
}, children), root);
|
140
|
+
} else {
|
141
|
+
return children;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
var styles$2 = {"full":"Viewer-module_full__1q18y","container":"Viewer-module_container__3eJ34 Viewer-module_full__1q18y","controls":"Viewer-module_controls__3BTof","spinner":"Viewer-module_spinner__2oRve","spin":"Viewer-module_spin__3jBR2","isLoading":"Viewer-module_isLoading__sQuGw"};
|
146
|
+
|
147
|
+
function _extends$2() {
|
148
|
+
_extends$2 = Object.assign || function (target) {
|
149
|
+
for (var i = 1; i < arguments.length; i++) {
|
150
|
+
var source = arguments[i];
|
151
|
+
|
152
|
+
for (var key in source) {
|
153
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
154
|
+
target[key] = source[key];
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
return target;
|
160
|
+
};
|
161
|
+
|
162
|
+
return _extends$2.apply(this, arguments);
|
163
|
+
}
|
164
|
+
var SpinnerIcon = (function (_ref) {
|
165
|
+
var _ref$styles = _ref.styles,
|
166
|
+
props = _objectWithoutProperties(_ref, ["styles"]);
|
167
|
+
|
168
|
+
return React.createElement("svg", _extends$2({
|
169
|
+
xmlns: "http://www.w3.org/2000/svg",
|
170
|
+
fill: "none",
|
171
|
+
viewBox: "0 0 24 24"
|
172
|
+
}, props), React.createElement("circle", {
|
173
|
+
cx: "12",
|
174
|
+
cy: "12",
|
175
|
+
r: "10",
|
176
|
+
stroke: "currentColor",
|
177
|
+
strokeWidth: "4",
|
178
|
+
opacity: ".23"
|
179
|
+
}), React.createElement("path", {
|
180
|
+
fill: "currentColor",
|
181
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z",
|
182
|
+
opacity: ".75"
|
183
|
+
}));
|
184
|
+
});
|
185
|
+
|
186
|
+
function Viewer(_ref) {
|
187
|
+
var imageFile = _ref.imageFile,
|
188
|
+
viewerRef = _ref.viewerRef,
|
189
|
+
initialYaw = _ref.initialYaw,
|
190
|
+
initialPitch = _ref.initialPitch;
|
191
|
+
var elRef = useRef();
|
192
|
+
var initialYawRef = useRef(initialYaw);
|
193
|
+
var initialPitchRef = useRef(initialPitch);
|
194
|
+
var touchSupport = useBrowserFeature('touch support');
|
195
|
+
|
196
|
+
var _useState = useState(true),
|
197
|
+
_useState2 = _slicedToArray(_useState, 2),
|
198
|
+
isLoading = _useState2[0],
|
199
|
+
setIsLoading = _useState2[1];
|
200
|
+
|
201
|
+
var _useState3 = useState(false),
|
202
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
203
|
+
isFullscreen = _useState4[0],
|
204
|
+
setIsFullscreen = _useState4[1]; // When toggling to fullscreen mode, this component renders to a
|
205
|
+
// portal div in the body of the document. We do not want to recreate
|
206
|
+
// the PanoViewer instead to keep its current state (pitch, yaw etc.).
|
207
|
+
// We therefore initialize the PanoViewer on a detached DOM element
|
208
|
+
// and render a component called DOMNodeContainer which appends the
|
209
|
+
// element on each render. React.memo causes the DOMNodeContainer to
|
210
|
+
// render only when either
|
211
|
+
// - the parent Viewer component is mounted
|
212
|
+
// - Fullscreen component switches between using the portal or not
|
213
|
+
|
214
|
+
|
215
|
+
function appendViewerTo(parentNode) {
|
216
|
+
if (!elRef.current) {
|
217
|
+
elRef.current = document.createElement('div');
|
218
|
+
elRef.current.className = styles$2.full;
|
219
|
+
viewerRef.current = new PanoViewer(elRef.current, {
|
220
|
+
image: imageFile.urls.ultra,
|
221
|
+
projectionType: imageFile.configuration.projection === 'equirectangular_stereo' ? PanoViewer.PROJECTION_TYPE.STEREOSCOPIC_EQUI : PanoViewer.PROJECTION_TYPE.EQUIRECTANGULAR,
|
222
|
+
touchDirection: touchSupport ? PanoViewer.TOUCH_DIRECTION.YAW : PanoViewer.TOUCH_DIRECTION.ALL,
|
223
|
+
useZoom: false,
|
224
|
+
yaw: initialYawRef.current,
|
225
|
+
pitch: initialPitchRef.current
|
226
|
+
});
|
227
|
+
viewerRef.current.on(PanoViewer.EVENTS.READY, function () {
|
228
|
+
viewerRef.current.updateViewportDimensions();
|
229
|
+
setIsLoading(false);
|
230
|
+
});
|
231
|
+
}
|
232
|
+
|
233
|
+
parentNode.appendChild(elRef.current);
|
234
|
+
viewerRef.current.updateViewportDimensions();
|
235
|
+
}
|
236
|
+
|
237
|
+
useEffect(function () {
|
238
|
+
return function () {
|
239
|
+
if (elRef.current) {
|
240
|
+
viewerRef.current.destroy();
|
241
|
+
viewerRef.current = null;
|
242
|
+
elRef.current = null;
|
243
|
+
}
|
244
|
+
};
|
245
|
+
}, [viewerRef]);
|
246
|
+
useEffect(function () {
|
247
|
+
if (initialYawRef.current !== initialYaw) {
|
248
|
+
initialYawRef.current = initialYaw;
|
249
|
+
viewerRef.current.lookAt({
|
250
|
+
yaw: initialYaw
|
251
|
+
}, 200);
|
252
|
+
}
|
253
|
+
}, [initialYaw, viewerRef]);
|
254
|
+
useEffect(function () {
|
255
|
+
if (initialPitchRef.current !== initialPitch) {
|
256
|
+
initialPitchRef.current = initialPitch;
|
257
|
+
viewerRef.current.lookAt({
|
258
|
+
pitch: initialPitch
|
259
|
+
}, 200);
|
260
|
+
}
|
261
|
+
}, [initialPitch, viewerRef]);
|
262
|
+
useEffect(function () {
|
263
|
+
function onChange() {
|
264
|
+
if (!screenfull.isFullscreen) {
|
265
|
+
setIsFullscreen(false);
|
266
|
+
}
|
267
|
+
}
|
268
|
+
|
269
|
+
if (screenfull.isEnabled) {
|
270
|
+
screenfull.on('change', onChange);
|
271
|
+
return function () {
|
272
|
+
return screenfull.off('change', onChange);
|
273
|
+
};
|
274
|
+
}
|
275
|
+
}, []);
|
276
|
+
useEffect(function () {
|
277
|
+
function onChange() {
|
278
|
+
viewerRef.current.updateViewportDimensions();
|
279
|
+
}
|
280
|
+
|
281
|
+
window.addEventListener('resize', onChange);
|
282
|
+
return function () {
|
283
|
+
return window.removeEventListener('resize', onChange);
|
284
|
+
};
|
285
|
+
}, [viewerRef]);
|
286
|
+
useEffect(function () {
|
287
|
+
if (isFullscreen) {
|
288
|
+
viewerRef.current.setTouchDirection(PanoViewer.TOUCH_DIRECTION.ALL);
|
289
|
+
viewerRef.current.setGyroMode(PanoViewer.GYRO_MODE.YAWPITCH);
|
290
|
+
viewerRef.current.setUseZoom(true);
|
291
|
+
} else {
|
292
|
+
if (touchSupport) {
|
293
|
+
viewerRef.current.setTouchDirection(PanoViewer.TOUCH_DIRECTION.YAW);
|
294
|
+
viewerRef.current.lookAt({
|
295
|
+
pitch: 0,
|
296
|
+
fov: 65
|
297
|
+
});
|
298
|
+
} else {
|
299
|
+
viewerRef.current.lookAt({
|
300
|
+
fov: 65
|
301
|
+
});
|
302
|
+
}
|
303
|
+
|
304
|
+
viewerRef.current.setGyroMode(PanoViewer.GYRO_MODE.NONE);
|
305
|
+
viewerRef.current.setUseZoom(false);
|
306
|
+
}
|
307
|
+
}, [isFullscreen, viewerRef, touchSupport]);
|
308
|
+
|
309
|
+
function preventDefaultForArrowUpDown(event) {
|
310
|
+
if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
|
311
|
+
event.preventDefault();
|
312
|
+
}
|
313
|
+
}
|
314
|
+
|
315
|
+
function enterFullscreen() {
|
316
|
+
if (screenfull.isEnabled) {
|
317
|
+
screenfull.request();
|
318
|
+
}
|
319
|
+
|
320
|
+
setIsFullscreen(true);
|
321
|
+
viewerRef.current.enableSensor();
|
322
|
+
}
|
323
|
+
|
324
|
+
function exitFullscreen() {
|
325
|
+
if (screenfull.isEnabled) {
|
326
|
+
screenfull.exit();
|
327
|
+
}
|
328
|
+
|
329
|
+
setIsFullscreen(false);
|
330
|
+
}
|
331
|
+
|
332
|
+
return (
|
333
|
+
/*#__PURE__*/
|
334
|
+
React.createElement(Fullscreen, {
|
335
|
+
isFullscreen: isFullscreen
|
336
|
+
},
|
337
|
+
/*#__PURE__*/
|
338
|
+
React.createElement("div", {
|
339
|
+
className: styles$2.container,
|
340
|
+
onKeyDown: preventDefaultForArrowUpDown
|
341
|
+
},
|
342
|
+
/*#__PURE__*/
|
343
|
+
React.createElement(DOMNodeContainer, {
|
344
|
+
className: styles$2.full,
|
345
|
+
onUpdate: function onUpdate(el) {
|
346
|
+
return appendViewerTo(el);
|
347
|
+
}
|
348
|
+
})),
|
349
|
+
/*#__PURE__*/
|
350
|
+
React.createElement(SpinnerIcon, {
|
351
|
+
className: classNames(styles$2.spinner, _defineProperty({}, styles$2.isLoading, isLoading))
|
352
|
+
}),
|
353
|
+
/*#__PURE__*/
|
354
|
+
React.createElement("div", {
|
355
|
+
className: styles$2.controls
|
356
|
+
},
|
357
|
+
/*#__PURE__*/
|
358
|
+
React.createElement(ToggleFullscreenButton, {
|
359
|
+
isFullscreen: isFullscreen,
|
360
|
+
onEnter: enterFullscreen,
|
361
|
+
onExit: exitFullscreen
|
362
|
+
})))
|
363
|
+
);
|
364
|
+
}
|
365
|
+
var DOMNodeContainer = React.memo(function (_ref2) {
|
366
|
+
var className = _ref2.className,
|
367
|
+
onUpdate = _ref2.onUpdate;
|
368
|
+
var ref = useRef();
|
369
|
+
useEffect(function () {
|
370
|
+
var current = ref.current;
|
371
|
+
onUpdate(current);
|
372
|
+
return function () {
|
373
|
+
current.removeChild(current.firstChild);
|
374
|
+
};
|
375
|
+
});
|
376
|
+
return (
|
377
|
+
/*#__PURE__*/
|
378
|
+
React.createElement("div", {
|
379
|
+
ref: ref,
|
380
|
+
className: className
|
381
|
+
})
|
382
|
+
);
|
383
|
+
}, function () {
|
384
|
+
return true;
|
385
|
+
});
|
386
|
+
|
387
|
+
export default Viewer;
|
@@ -0,0 +1,375 @@
|
|
1
|
+
import React, { Component } from 'react';
|
2
|
+
import Measure from 'react-measure';
|
3
|
+
import { b as _inherits, a as _classCallCheck, e as _assertThisInitialized, _ as _createClass, c as _getPrototypeOf, d as _possibleConstructorReturn } from './getPrototypeOf-63c7c8e8.js';
|
4
|
+
import assign from 'deep-assign';
|
5
|
+
import WaveSurfer from 'wavesurfer.js';
|
6
|
+
|
7
|
+
function _createSuper(Derived) {
|
8
|
+
function isNativeReflectConstruct() {
|
9
|
+
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
|
10
|
+
if (Reflect.construct.sham) return false;
|
11
|
+
if (typeof Proxy === "function") return true;
|
12
|
+
|
13
|
+
try {
|
14
|
+
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
|
15
|
+
return true;
|
16
|
+
} catch (e) {
|
17
|
+
return false;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
return function () {
|
22
|
+
var Super = _getPrototypeOf(Derived),
|
23
|
+
result;
|
24
|
+
|
25
|
+
if (isNativeReflectConstruct()) {
|
26
|
+
var NewTarget = _getPrototypeOf(this).constructor;
|
27
|
+
|
28
|
+
result = Reflect.construct(Super, arguments, NewTarget);
|
29
|
+
} else {
|
30
|
+
result = Super.apply(this, arguments);
|
31
|
+
}
|
32
|
+
|
33
|
+
return _possibleConstructorReturn(this, result);
|
34
|
+
};
|
35
|
+
}
|
36
|
+
var EVENTS = ['audioprocess', 'error', 'finish', 'loading', 'mouseup', 'pause', 'play', 'ready', 'scroll', 'seek', 'zoom'];
|
37
|
+
|
38
|
+
function capitaliseFirstLetter(string) {
|
39
|
+
return string.split('-').map(function (part) {
|
40
|
+
return part.charAt(0).toUpperCase() + part.slice(1);
|
41
|
+
}).join('');
|
42
|
+
}
|
43
|
+
|
44
|
+
var Wavesurfer =
|
45
|
+
/*#__PURE__*/
|
46
|
+
function (_Component) {
|
47
|
+
_inherits(Wavesurfer, _Component);
|
48
|
+
|
49
|
+
var _super = _createSuper(Wavesurfer);
|
50
|
+
|
51
|
+
function Wavesurfer(props) {
|
52
|
+
var _this;
|
53
|
+
|
54
|
+
_classCallCheck(this, Wavesurfer);
|
55
|
+
|
56
|
+
_this = _super.call(this, props);
|
57
|
+
_this.state = {
|
58
|
+
isReady: false
|
59
|
+
};
|
60
|
+
|
61
|
+
if (typeof WaveSurfer === undefined) {
|
62
|
+
throw new Error('WaveSurfer is undefined!');
|
63
|
+
}
|
64
|
+
|
65
|
+
_this._wavesurfer = Object.create(WaveSurfer);
|
66
|
+
_this._loadMediaElt = _this._loadMediaElt.bind(_assertThisInitialized(_this));
|
67
|
+
_this._loadAudio = _this._loadAudio.bind(_assertThisInitialized(_this));
|
68
|
+
_this._seekTo = _this._seekTo.bind(_assertThisInitialized(_this));
|
69
|
+
|
70
|
+
_this._handleResize = function () {
|
71
|
+
if (_this.state.isReady) {
|
72
|
+
_this._wavesurfer.refresh();
|
73
|
+
}
|
74
|
+
};
|
75
|
+
|
76
|
+
return _this;
|
77
|
+
}
|
78
|
+
|
79
|
+
_createClass(Wavesurfer, [{
|
80
|
+
key: "componentDidMount",
|
81
|
+
value: function componentDidMount() {
|
82
|
+
var _this2 = this;
|
83
|
+
|
84
|
+
var options = assign({}, this.props.options, {
|
85
|
+
container: this.wavesurferEl
|
86
|
+
}); // media element loading is only supported by MediaElement backend
|
87
|
+
|
88
|
+
if (this.props.mediaElt) {
|
89
|
+
options.backend = 'MediaElement';
|
90
|
+
}
|
91
|
+
|
92
|
+
this._wavesurfer.init(options); // file was loaded, wave was drawn
|
93
|
+
|
94
|
+
|
95
|
+
this._wavesurfer.on('ready', function () {
|
96
|
+
_this2.setState({
|
97
|
+
isReady: true,
|
98
|
+
pos: _this2.props.pos
|
99
|
+
}); // set initial position
|
100
|
+
|
101
|
+
|
102
|
+
if (_this2.props.pos) {
|
103
|
+
_this2._seekTo(_this2.props.pos);
|
104
|
+
} // set initial volume
|
105
|
+
|
106
|
+
|
107
|
+
if (_this2.props.volume != null) {
|
108
|
+
_this2._wavesurfer.setVolume(_this2.props.volume);
|
109
|
+
} // set initial playing state
|
110
|
+
|
111
|
+
|
112
|
+
if (_this2.props.playing) {
|
113
|
+
_this2.wavesurfer.play();
|
114
|
+
} // set initial zoom
|
115
|
+
|
116
|
+
|
117
|
+
if (_this2.props.zoom) {
|
118
|
+
_this2._wavesurfer.zoom(_this2.props.zoom);
|
119
|
+
}
|
120
|
+
});
|
121
|
+
|
122
|
+
this._wavesurfer.on('audioprocess', function (pos) {
|
123
|
+
_this2.setState({
|
124
|
+
pos: pos
|
125
|
+
});
|
126
|
+
|
127
|
+
_this2.props.onPosChange({
|
128
|
+
wavesurfer: _this2._wavesurfer,
|
129
|
+
originalArgs: [pos]
|
130
|
+
});
|
131
|
+
}); // `audioprocess` is not fired when seeking, so we have to plug into the
|
132
|
+
// `seek` event and calculate the equivalent in seconds (seek event
|
133
|
+
// receives a position float 0-1) – See the README.md for explanation why we
|
134
|
+
// need this
|
135
|
+
|
136
|
+
|
137
|
+
this._wavesurfer.on('seek', function (pos) {
|
138
|
+
var formattedPos = _this2._posToSec(pos);
|
139
|
+
|
140
|
+
_this2.setState({
|
141
|
+
formattedPos: formattedPos
|
142
|
+
});
|
143
|
+
|
144
|
+
_this2.props.onPosChange({
|
145
|
+
wavesurfer: _this2._wavesurfer,
|
146
|
+
originalArgs: [formattedPos]
|
147
|
+
});
|
148
|
+
}); // hook up events to callback handlers passed in as props
|
149
|
+
|
150
|
+
|
151
|
+
EVENTS.forEach(function (e) {
|
152
|
+
var propCallback = _this2.props["on".concat(capitaliseFirstLetter(e))];
|
153
|
+
|
154
|
+
var wavesurfer = _this2._wavesurfer;
|
155
|
+
|
156
|
+
if (propCallback) {
|
157
|
+
_this2._wavesurfer.on(e, function () {
|
158
|
+
for (var _len = arguments.length, originalArgs = new Array(_len), _key = 0; _key < _len; _key++) {
|
159
|
+
originalArgs[_key] = arguments[_key];
|
160
|
+
}
|
161
|
+
|
162
|
+
propCallback({
|
163
|
+
wavesurfer: wavesurfer,
|
164
|
+
originalArgs: originalArgs
|
165
|
+
});
|
166
|
+
});
|
167
|
+
}
|
168
|
+
}); // if audioFile prop, load file
|
169
|
+
|
170
|
+
if (this.props.audioFile) {
|
171
|
+
this._loadAudio(this.props.audioFile, this.props.audioPeaks);
|
172
|
+
} // if mediaElt prop, load media Element
|
173
|
+
|
174
|
+
|
175
|
+
if (this.props.mediaElt) {
|
176
|
+
this._loadMediaElt(this.props.mediaElt, this.props.audioPeaks);
|
177
|
+
}
|
178
|
+
} // update wavesurfer rendering manually
|
179
|
+
|
180
|
+
}, {
|
181
|
+
key: "componentDidUpdate",
|
182
|
+
value: function componentDidUpdate(prevProps) {
|
183
|
+
// update audioFile
|
184
|
+
if (this.props.audioFile !== this.props.audioFile) {
|
185
|
+
this._loadAudio(this.props.audioFile, this.props.audioPeaks);
|
186
|
+
} // update mediaElt
|
187
|
+
|
188
|
+
|
189
|
+
if (prevProps.mediaElt !== this.props.mediaElt) {
|
190
|
+
this._loadMediaElt(this.props.mediaElt, this.props.audioPeaks);
|
191
|
+
} // update peaks
|
192
|
+
|
193
|
+
|
194
|
+
if (prevProps.audioPeaks !== this.props.audioPeaks) {
|
195
|
+
if (this.props.mediaElt) {
|
196
|
+
this._loadMediaElt(prevProps.mediaElt, this.props.audioPeaks);
|
197
|
+
} else {
|
198
|
+
this._loadAudio(this.props.audioFile, this.props.audioPeaks);
|
199
|
+
}
|
200
|
+
} // update position
|
201
|
+
|
202
|
+
|
203
|
+
if (this.props.pos && this.state.isReady && prevProps.pos !== this.props.pos && this.props.pos !== this.state.pos) {
|
204
|
+
this._seekTo(this.props.pos);
|
205
|
+
} // update playing state
|
206
|
+
|
207
|
+
|
208
|
+
if (this.props.playing !== prevProps.playing) {
|
209
|
+
if (this.props.playing) {
|
210
|
+
this._wavesurfer.play();
|
211
|
+
} else {
|
212
|
+
this._wavesurfer.pause();
|
213
|
+
}
|
214
|
+
} // update volume
|
215
|
+
|
216
|
+
|
217
|
+
if (this.props.volume !== prevProps.volume) {
|
218
|
+
this._wavesurfer.setVolume(this.props.volume);
|
219
|
+
} // update volume
|
220
|
+
|
221
|
+
|
222
|
+
if (this.props.zoom !== prevProps.zoom) {
|
223
|
+
this._wavesurfer.zoom(this.props.zoom);
|
224
|
+
} // update audioRate
|
225
|
+
|
226
|
+
|
227
|
+
if (this.props.options.audioRate !== prevProps.options.audioRate) {
|
228
|
+
this._wavesurfer.setPlaybackRate(this.props.options.audioRate);
|
229
|
+
}
|
230
|
+
|
231
|
+
if (prevProps.options.waveColor !== this.props.options.waveColor) {
|
232
|
+
this._wavesurfer.setWaveColor(this.props.options.waveColor);
|
233
|
+
}
|
234
|
+
|
235
|
+
if (prevProps.options.progressColor !== this.props.options.progressColor) {
|
236
|
+
this._wavesurfer.setProgressColor(this.props.options.progressColor);
|
237
|
+
}
|
238
|
+
|
239
|
+
if (prevProps.options.cursorColor !== this.props.options.cursorColor) {
|
240
|
+
this._wavesurfer.setCursorColor(this.props.options.cursorColor);
|
241
|
+
}
|
242
|
+
|
243
|
+
if (prevProps.options.height !== this.props.options.height) {
|
244
|
+
this._wavesurfer.setHeight(this.props.options.height);
|
245
|
+
}
|
246
|
+
}
|
247
|
+
}, {
|
248
|
+
key: "componentWillUnmount",
|
249
|
+
value: function componentWillUnmount() {
|
250
|
+
var _this3 = this;
|
251
|
+
|
252
|
+
// remove listeners
|
253
|
+
EVENTS.forEach(function (e) {
|
254
|
+
_this3._wavesurfer.un(e);
|
255
|
+
}); // destroy wavesurfer instance
|
256
|
+
|
257
|
+
this._wavesurfer.destroy();
|
258
|
+
} // receives seconds and transforms this to the position as a float 0-1
|
259
|
+
|
260
|
+
}, {
|
261
|
+
key: "_secToPos",
|
262
|
+
value: function _secToPos(sec) {
|
263
|
+
return 1 / this._wavesurfer.getDuration() * sec;
|
264
|
+
} // receives position as a float 0-1 and transforms this to seconds
|
265
|
+
|
266
|
+
}, {
|
267
|
+
key: "_posToSec",
|
268
|
+
value: function _posToSec(pos) {
|
269
|
+
return pos * this._wavesurfer.getDuration();
|
270
|
+
} // pos is in seconds, the 0-1 proportional position we calculate here …
|
271
|
+
|
272
|
+
}, {
|
273
|
+
key: "_seekTo",
|
274
|
+
value: function _seekTo(sec) {
|
275
|
+
var pos = this._secToPos(sec);
|
276
|
+
|
277
|
+
if (this.props.options.autoCenter) {
|
278
|
+
this._wavesurfer.seekAndCenter(pos);
|
279
|
+
} else {
|
280
|
+
this._wavesurfer.seekTo(pos);
|
281
|
+
}
|
282
|
+
} // load a media element selector or HTML element
|
283
|
+
// if selector, get the HTML element for it
|
284
|
+
// and pass to _loadAudio
|
285
|
+
|
286
|
+
}, {
|
287
|
+
key: "_loadMediaElt",
|
288
|
+
value: function _loadMediaElt(selectorOrElt, audioPeaks) {
|
289
|
+
if (selectorOrElt instanceof global.HTMLElement) {
|
290
|
+
this._loadAudio(selectorOrElt, audioPeaks);
|
291
|
+
} else {
|
292
|
+
// Ignore if media element cannot be found. There are edge cases
|
293
|
+
// where React already unmounted the corresponding media element,
|
294
|
+
// but the parent Waveform component still holds the old media
|
295
|
+
// element id.
|
296
|
+
if (global.document.querySelector(selectorOrElt)) {
|
297
|
+
this._loadAudio(global.document.querySelector(selectorOrElt), audioPeaks);
|
298
|
+
}
|
299
|
+
}
|
300
|
+
} // pass audio data to wavesurfer
|
301
|
+
|
302
|
+
}, {
|
303
|
+
key: "_loadAudio",
|
304
|
+
value: function _loadAudio(audioFileOrElt, audioPeaks) {
|
305
|
+
if (audioFileOrElt instanceof global.HTMLElement) {
|
306
|
+
// media element
|
307
|
+
this._wavesurfer.loadMediaElement(audioFileOrElt, audioPeaks);
|
308
|
+
} else if (typeof audioFileOrElt === 'string') {
|
309
|
+
// bog-standard string is handled by load method and ajax call
|
310
|
+
this._wavesurfer.load(audioFileOrElt, audioPeaks);
|
311
|
+
} else if (audioFileOrElt instanceof global.Blob || audioFileOrElt instanceof global.File) {
|
312
|
+
// blob or file is loaded with loadBlob method
|
313
|
+
this._wavesurfer.loadBlob(audioFileOrElt, audioPeaks);
|
314
|
+
} else {
|
315
|
+
throw new Error("Wavesurfer._loadAudio expects prop audioFile\n to be either HTMLElement, string or file/blob");
|
316
|
+
}
|
317
|
+
}
|
318
|
+
}, {
|
319
|
+
key: "_measureIfResponsive",
|
320
|
+
value: function _measureIfResponsive(children) {
|
321
|
+
if (this.props.responsive) {
|
322
|
+
return (
|
323
|
+
/*#__PURE__*/
|
324
|
+
React.createElement(Measure, {
|
325
|
+
client: true,
|
326
|
+
onResize: this._handleResize
|
327
|
+
}, function (_ref) {
|
328
|
+
var measureRef = _ref.measureRef;
|
329
|
+
return (
|
330
|
+
/*#__PURE__*/
|
331
|
+
React.createElement("div", {
|
332
|
+
ref: measureRef
|
333
|
+
}, children)
|
334
|
+
);
|
335
|
+
})
|
336
|
+
);
|
337
|
+
}
|
338
|
+
|
339
|
+
return children;
|
340
|
+
}
|
341
|
+
}, {
|
342
|
+
key: "render",
|
343
|
+
value: function render() {
|
344
|
+
var _this4 = this;
|
345
|
+
|
346
|
+
var childrenWithProps = this.props.children ? React.Children.map(this.props.children, function (child) {
|
347
|
+
return React.cloneElement(child, {
|
348
|
+
wavesurfer: _this4._wavesurfer,
|
349
|
+
isReady: _this4.state.isReady
|
350
|
+
});
|
351
|
+
}) : false;
|
352
|
+
return this._measureIfResponsive(
|
353
|
+
/*#__PURE__*/
|
354
|
+
React.createElement("div", null,
|
355
|
+
/*#__PURE__*/
|
356
|
+
React.createElement("div", {
|
357
|
+
ref: function ref(c) {
|
358
|
+
_this4.wavesurferEl = c;
|
359
|
+
}
|
360
|
+
}), childrenWithProps));
|
361
|
+
}
|
362
|
+
}]);
|
363
|
+
|
364
|
+
return Wavesurfer;
|
365
|
+
}(Component);
|
366
|
+
|
367
|
+
Wavesurfer.defaultProps = {
|
368
|
+
playing: false,
|
369
|
+
pos: 0,
|
370
|
+
options: WaveSurfer.defaultParams,
|
371
|
+
responsive: true,
|
372
|
+
onPosChange: function onPosChange() {}
|
373
|
+
};
|
374
|
+
|
375
|
+
export default Wavesurfer;
|