sanity-plugin-mux-input 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +86 -0
- package/build/actions/assets.js +37 -0
- package/build/actions/assets.js.map +1 -0
- package/build/actions/secrets.js +125 -0
- package/build/actions/secrets.js.map +1 -0
- package/build/actions/upload.js +280 -0
- package/build/actions/upload.js.map +1 -0
- package/build/clients/SanityClient.js +19 -0
- package/build/clients/SanityClient.js.map +1 -0
- package/build/clients/upChunkObservable.js +66 -0
- package/build/clients/upChunkObservable.js.map +1 -0
- package/build/components/FileInputButton.js +84 -0
- package/build/components/FileInputButton.js.map +1 -0
- package/build/components/Input.css +30 -0
- package/build/components/Input.js +823 -0
- package/build/components/Input.js.map +1 -0
- package/build/components/MuxLogo.js +19 -0
- package/build/components/MuxLogo.js.map +1 -0
- package/build/components/Preview.css +16 -0
- package/build/components/Preview.js +95 -0
- package/build/components/Preview.js.map +1 -0
- package/build/components/SelectAsset.css +56 -0
- package/build/components/SelectAsset.js +162 -0
- package/build/components/SelectAsset.js.map +1 -0
- package/build/components/Setup.css +7 -0
- package/build/components/Setup.js +311 -0
- package/build/components/Setup.js.map +1 -0
- package/build/components/UploadPlaceholder.css +81 -0
- package/build/components/UploadPlaceholder.js +92 -0
- package/build/components/UploadPlaceholder.js.map +1 -0
- package/build/components/Uploader.css +28 -0
- package/build/components/Uploader.js +534 -0
- package/build/components/Uploader.js.map +1 -0
- package/build/components/Video.css +21 -0
- package/build/components/Video.js +360 -0
- package/build/components/Video.js.map +1 -0
- package/build/config.js +17 -0
- package/build/config.js.map +1 -0
- package/build/index.js +22 -0
- package/build/index.js.map +1 -0
- package/build/schema/mux.video.js +41 -0
- package/build/schema/mux.video.js.map +1 -0
- package/build/schema/mux.videoAsset.js +29 -0
- package/build/schema/mux.videoAsset.js.map +1 -0
- package/build/util/extractFiles.js +70 -0
- package/build/util/extractFiles.js.map +1 -0
- package/build/util/formatTime.js +28 -0
- package/build/util/formatTime.js.map +1 -0
- package/build/util/generateJwt.js +30 -0
- package/build/util/generateJwt.js.map +1 -0
- package/build/util/getPosterSrc.js +46 -0
- package/build/util/getPosterSrc.js.map +1 -0
- package/build/util/getStoryboardSrc.js +26 -0
- package/build/util/getStoryboardSrc.js.map +1 -0
- package/build/util/getVideoSrc.js +23 -0
- package/build/util/getVideoSrc.js.map +1 -0
- package/config.dist.json +3 -0
- package/package.json +85 -0
- package/sanity.json +16 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _ui = require("@sanity/ui");
|
|
9
|
+
|
|
10
|
+
var _lodash = require("lodash");
|
|
11
|
+
|
|
12
|
+
var _default2 = _interopRequireDefault(require("part:@sanity/components/formfields/default"));
|
|
13
|
+
|
|
14
|
+
var _default3 = _interopRequireDefault(require("part:@sanity/components/textinputs/default"));
|
|
15
|
+
|
|
16
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
17
|
+
|
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
19
|
+
|
|
20
|
+
var _secrets = require("../actions/secrets");
|
|
21
|
+
|
|
22
|
+
var _Setup = _interopRequireDefault(require("./Setup.css"));
|
|
23
|
+
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
+
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
30
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
31
|
+
|
|
32
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
33
|
+
|
|
34
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
35
|
+
|
|
36
|
+
var propTypes = {
|
|
37
|
+
onSave: _propTypes.default.func.isRequired,
|
|
38
|
+
onCancel: _propTypes.default.func.isRequired,
|
|
39
|
+
secrets: _propTypes.default.shape({
|
|
40
|
+
token: _propTypes.default.string,
|
|
41
|
+
secretKey: _propTypes.default.string,
|
|
42
|
+
enableSignedUrls: _propTypes.default.bool,
|
|
43
|
+
signingKeyId: _propTypes.default.string,
|
|
44
|
+
signingKeyPrivate: _propTypes.default.string
|
|
45
|
+
})
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
class MuxVideoInputSetup extends _react.Component {
|
|
49
|
+
static getDerivedStateFromProps(nextProps, nextState) {
|
|
50
|
+
if (!nextState.secrets) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (nextProps.secrets) {
|
|
55
|
+
return {
|
|
56
|
+
token: nextProps.secrets.token,
|
|
57
|
+
secretKey: nextProps.secrets.secretKey,
|
|
58
|
+
enableSignedUrls: nextProps.secrets.enableSignedUrls,
|
|
59
|
+
signingKeyId: nextProps.secrets.signingKeyId,
|
|
60
|
+
signingKeyPrivate: nextProps.secrets.signingKeyPrivate
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
constructor(props) {
|
|
68
|
+
var _this;
|
|
69
|
+
|
|
70
|
+
super(props);
|
|
71
|
+
_this = this;
|
|
72
|
+
|
|
73
|
+
_defineProperty(this, "tokenInputId", (0, _lodash.uniqueId)('MuxTokenInput'));
|
|
74
|
+
|
|
75
|
+
_defineProperty(this, "secretKeyInputId", (0, _lodash.uniqueId)('MuxSecretInput'));
|
|
76
|
+
|
|
77
|
+
_defineProperty(this, "enableSignedUrlsInputId", (0, _lodash.uniqueId)('MuxEnableSignedUrlsInput'));
|
|
78
|
+
|
|
79
|
+
_defineProperty(this, "state", {
|
|
80
|
+
token: null,
|
|
81
|
+
secretKey: null,
|
|
82
|
+
enableSignedUrls: false,
|
|
83
|
+
isLoading: false,
|
|
84
|
+
error: null
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
_defineProperty(this, "handleTokenChanged", event => {
|
|
88
|
+
this.setState({
|
|
89
|
+
token: event.currentTarget.value
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
_defineProperty(this, "handleSecretKeyChanged", event => {
|
|
94
|
+
this.setState({
|
|
95
|
+
secretKey: event.currentTarget.value
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
_defineProperty(this, "handleEnableSignedUrls", event => this.setState({
|
|
100
|
+
enableSignedUrls: event.currentTarget.checked
|
|
101
|
+
}));
|
|
102
|
+
|
|
103
|
+
_defineProperty(this, "handleCancel", event => {
|
|
104
|
+
this.props.onCancel();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
_defineProperty(this, "handleOnSubmit", event => {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
_defineProperty(this, "handleSaveToken", /*#__PURE__*/_asyncToGenerator(function* () {
|
|
112
|
+
var handleError = err => {
|
|
113
|
+
console.error(err); // eslint-disable-line no-console
|
|
114
|
+
|
|
115
|
+
_this.setState({
|
|
116
|
+
isLoading: false,
|
|
117
|
+
error: 'Something went wrong saving the token. See console.error for more info.'
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
_this.setState({
|
|
122
|
+
isLoading: true
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
var _ref2 = _this.state || {},
|
|
126
|
+
token = _ref2.token,
|
|
127
|
+
secretKey = _ref2.secretKey,
|
|
128
|
+
enableSignedUrls = _ref2.enableSignedUrls;
|
|
129
|
+
|
|
130
|
+
var _ref3 = _this.state || {},
|
|
131
|
+
signingKeyId = _ref3.signingKeyId,
|
|
132
|
+
signingKeyPrivate = _ref3.signingKeyPrivate;
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
yield (0, _secrets.saveSecrets)(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate);
|
|
136
|
+
} catch (err) {
|
|
137
|
+
handleError('Error while trying to save secrets:', err);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (enableSignedUrls) {
|
|
142
|
+
var hasValidSigningKeys = yield (0, _secrets.haveValidSigningKeys)(signingKeyId, signingKeyPrivate);
|
|
143
|
+
|
|
144
|
+
if (!hasValidSigningKeys) {
|
|
145
|
+
try {
|
|
146
|
+
var _yield$createSigningK = yield (0, _secrets.createSigningKeys)(),
|
|
147
|
+
data = _yield$createSigningK.data;
|
|
148
|
+
|
|
149
|
+
signingKeyId = data.id;
|
|
150
|
+
signingKeyPrivate = data.private_key;
|
|
151
|
+
yield (0, _secrets.saveSecrets)(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate);
|
|
152
|
+
} catch (_ref4) {
|
|
153
|
+
var message = _ref4.message;
|
|
154
|
+
// eslint-disable-next-line no-console
|
|
155
|
+
console.log('Error while creating and saving signing key:', message);
|
|
156
|
+
|
|
157
|
+
_this.setState({
|
|
158
|
+
error: message
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
_this.setState({
|
|
165
|
+
isLoading: false
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
_this.props.onSave({
|
|
169
|
+
token,
|
|
170
|
+
secretKey,
|
|
171
|
+
enableSignedUrls,
|
|
172
|
+
signingKeyId,
|
|
173
|
+
signingKeyPrivate
|
|
174
|
+
});
|
|
175
|
+
}));
|
|
176
|
+
|
|
177
|
+
if (props.secrets) {
|
|
178
|
+
var _props$secrets = props.secrets,
|
|
179
|
+
token = _props$secrets.token,
|
|
180
|
+
secretKey = _props$secrets.secretKey,
|
|
181
|
+
enableSignedUrls = _props$secrets.enableSignedUrls,
|
|
182
|
+
signingKeyId = _props$secrets.signingKeyId,
|
|
183
|
+
signingKeyPrivate = _props$secrets.signingKeyPrivate;
|
|
184
|
+
this.state.token = token;
|
|
185
|
+
this.state.secretKey = secretKey;
|
|
186
|
+
this.state.enableSignedUrls = enableSignedUrls;
|
|
187
|
+
this.state.signingKeyId = signingKeyId;
|
|
188
|
+
this.state.signingKeyPrivate = signingKeyPrivate;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
this.firstField = /*#__PURE__*/_react.default.createRef();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
componentDidMount() {
|
|
195
|
+
this.firstField.current.focus();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
render() {
|
|
199
|
+
var _this$state = this.state,
|
|
200
|
+
error = _this$state.error,
|
|
201
|
+
isLoading = _this$state.isLoading;
|
|
202
|
+
return /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
203
|
+
paddingRight: 4,
|
|
204
|
+
paddingLeft: 4,
|
|
205
|
+
paddingBottom: 4,
|
|
206
|
+
paddingTop: 4,
|
|
207
|
+
style: {
|
|
208
|
+
position: 'relative'
|
|
209
|
+
}
|
|
210
|
+
}, /*#__PURE__*/_react.default.createElement("form", {
|
|
211
|
+
onSubmit: this.handleOnSubmit
|
|
212
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
213
|
+
space: 4
|
|
214
|
+
}, !this.state.token && /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
215
|
+
padding: [3, 3, 3],
|
|
216
|
+
radius: 2,
|
|
217
|
+
shadow: 1,
|
|
218
|
+
tone: "primary"
|
|
219
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
220
|
+
space: 3
|
|
221
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Text, {
|
|
222
|
+
size: 1
|
|
223
|
+
}, "To set up a new access token, go to your", ' ', /*#__PURE__*/_react.default.createElement("a", {
|
|
224
|
+
href: "https://dashboard.mux.com/settings/access-tokens",
|
|
225
|
+
target: "_blank",
|
|
226
|
+
rel: "noreferrer noopener"
|
|
227
|
+
}, "account on mux.com"), "."), /*#__PURE__*/_react.default.createElement(_ui.Text, {
|
|
228
|
+
size: 1
|
|
229
|
+
}, "The access token needs permissions: ", /*#__PURE__*/_react.default.createElement("strong", null, "Mux Video "), "(Full Access) and ", /*#__PURE__*/_react.default.createElement("strong", null, "Mux Data"), " (Read)", /*#__PURE__*/_react.default.createElement("br", null), "The credentials will be stored safely in a hidden document only available to editors."))), /*#__PURE__*/_react.default.createElement(_default2.default, {
|
|
230
|
+
changeIndicator: false,
|
|
231
|
+
label: "Access Token",
|
|
232
|
+
labelFor: this.tokenInputId,
|
|
233
|
+
level: 0
|
|
234
|
+
}, /*#__PURE__*/_react.default.createElement(_default3.default, {
|
|
235
|
+
id: this.tokenInputId,
|
|
236
|
+
ref: this.firstField,
|
|
237
|
+
onChange: this.handleTokenChanged,
|
|
238
|
+
type: "text",
|
|
239
|
+
value: this.state.token || ''
|
|
240
|
+
})), /*#__PURE__*/_react.default.createElement(_default2.default, {
|
|
241
|
+
changeIndicator: false,
|
|
242
|
+
label: "Secret Key",
|
|
243
|
+
labelFor: this.secretKeyInputId,
|
|
244
|
+
level: 0
|
|
245
|
+
}, /*#__PURE__*/_react.default.createElement(_default3.default, {
|
|
246
|
+
id: this.secretKeyInputId,
|
|
247
|
+
onChange: this.handleSecretKeyChanged,
|
|
248
|
+
type: "text",
|
|
249
|
+
value: this.state.secretKey || ''
|
|
250
|
+
})), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
251
|
+
space: 4
|
|
252
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
|
|
253
|
+
align: "center"
|
|
254
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
|
|
255
|
+
id: this.enableSignedUrlsInputId,
|
|
256
|
+
onChange: this.handleEnableSignedUrls,
|
|
257
|
+
checked: this.state.enableSignedUrls || false,
|
|
258
|
+
style: {
|
|
259
|
+
display: 'block'
|
|
260
|
+
}
|
|
261
|
+
}), /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
262
|
+
flex: 1,
|
|
263
|
+
paddingLeft: 3
|
|
264
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Text, null, /*#__PURE__*/_react.default.createElement("label", {
|
|
265
|
+
htmlFor: this.enableSignedUrlsInputId
|
|
266
|
+
}, "Enable Signed Urls")))), this.state.signingKeyId && this.state.enableSignedUrls ? /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
267
|
+
padding: [3, 3, 3],
|
|
268
|
+
radius: 2,
|
|
269
|
+
shadow: 1,
|
|
270
|
+
tone: "caution"
|
|
271
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
272
|
+
space: 3
|
|
273
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Text, {
|
|
274
|
+
size: 1
|
|
275
|
+
}, "The signing key ID that Sanity will use is:"), /*#__PURE__*/_react.default.createElement(_ui.Code, {
|
|
276
|
+
size: 1
|
|
277
|
+
}, this.state.signingKeyId), /*#__PURE__*/_react.default.createElement(_ui.Text, {
|
|
278
|
+
size: 1
|
|
279
|
+
}, "This key is only used for previewing content in the Sanity UI.", /*#__PURE__*/_react.default.createElement("br", null), "You should generate a different key to use in your application server."))) : null), /*#__PURE__*/_react.default.createElement(_ui.Inline, {
|
|
280
|
+
space: 2
|
|
281
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Button, {
|
|
282
|
+
text: "Save",
|
|
283
|
+
loading: isLoading,
|
|
284
|
+
tone: "primary",
|
|
285
|
+
mode: "default",
|
|
286
|
+
onClick: this.handleSaveToken
|
|
287
|
+
}), /*#__PURE__*/_react.default.createElement(_ui.Button, {
|
|
288
|
+
text: "Cancel",
|
|
289
|
+
tone: "primary",
|
|
290
|
+
mode: "bleed",
|
|
291
|
+
onClick: this.handleCancel
|
|
292
|
+
})), error && /*#__PURE__*/_react.default.createElement("p", {
|
|
293
|
+
className: _Setup.default.error
|
|
294
|
+
}, error))));
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
MuxVideoInputSetup.propTypes = propTypes;
|
|
300
|
+
MuxVideoInputSetup.defaultProps = {
|
|
301
|
+
secrets: {
|
|
302
|
+
token: null,
|
|
303
|
+
secretKey: null,
|
|
304
|
+
enableSignedUrls: false,
|
|
305
|
+
signingKeyId: null,
|
|
306
|
+
signingKeyPrivate: null
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
var _default = MuxVideoInputSetup;
|
|
310
|
+
exports.default = _default;
|
|
311
|
+
//# sourceMappingURL=Setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Setup.js"],"names":["propTypes","onSave","PropTypes","func","isRequired","onCancel","secrets","shape","token","string","secretKey","enableSignedUrls","bool","signingKeyId","signingKeyPrivate","MuxVideoInputSetup","Component","getDerivedStateFromProps","nextProps","nextState","constructor","props","isLoading","error","event","setState","currentTarget","value","checked","preventDefault","handleError","err","console","state","hasValidSigningKeys","data","id","private_key","message","log","firstField","React","createRef","componentDidMount","current","focus","render","position","handleOnSubmit","tokenInputId","handleTokenChanged","secretKeyInputId","handleSecretKeyChanged","enableSignedUrlsInputId","handleEnableSignedUrls","display","handleSaveToken","handleCancel","styles","defaultProps"],"mappings":"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","sourcesContent":["import {Box, Button, Card, Checkbox, Code, Flex, Inline, Stack, Text} from '@sanity/ui'\r\nimport {uniqueId} from 'lodash'\r\nimport FormField from 'part:@sanity/components/formfields/default'\r\nimport TextInput from 'part:@sanity/components/textinputs/default'\r\nimport PropTypes from 'prop-types'\r\nimport React, {Component} from 'react'\r\nimport {createSigningKeys, haveValidSigningKeys, saveSecrets} from '../actions/secrets'\r\nimport styles from './Setup.css'\r\n\r\nconst propTypes = {\r\n onSave: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n secrets: PropTypes.shape({\r\n token: PropTypes.string,\r\n secretKey: PropTypes.string,\r\n enableSignedUrls: PropTypes.bool,\r\n signingKeyId: PropTypes.string,\r\n signingKeyPrivate: PropTypes.string,\r\n }),\r\n}\r\nclass MuxVideoInputSetup extends Component {\r\n tokenInputId = uniqueId('MuxTokenInput')\r\n secretKeyInputId = uniqueId('MuxSecretInput')\r\n enableSignedUrlsInputId = uniqueId('MuxEnableSignedUrlsInput')\r\n\r\n state = {\r\n token: null,\r\n secretKey: null,\r\n enableSignedUrls: false,\r\n isLoading: false,\r\n error: null,\r\n }\r\n\r\n static getDerivedStateFromProps(nextProps, nextState) {\r\n if (!nextState.secrets) {\r\n return null\r\n }\r\n if (nextProps.secrets) {\r\n return {\r\n token: nextProps.secrets.token,\r\n secretKey: nextProps.secrets.secretKey,\r\n enableSignedUrls: nextProps.secrets.enableSignedUrls,\r\n signingKeyId: nextProps.secrets.signingKeyId,\r\n signingKeyPrivate: nextProps.secrets.signingKeyPrivate,\r\n }\r\n }\r\n return null\r\n }\r\n\r\n constructor(props) {\r\n super(props)\r\n if (props.secrets) {\r\n const {token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate} = props.secrets\r\n this.state.token = token\r\n this.state.secretKey = secretKey\r\n this.state.enableSignedUrls = enableSignedUrls\r\n this.state.signingKeyId = signingKeyId\r\n this.state.signingKeyPrivate = signingKeyPrivate\r\n }\r\n this.firstField = React.createRef()\r\n }\r\n\r\n componentDidMount() {\r\n this.firstField.current.focus()\r\n }\r\n\r\n handleTokenChanged = (event) => {\r\n this.setState({token: event.currentTarget.value})\r\n }\r\n\r\n handleSecretKeyChanged = (event) => {\r\n this.setState({secretKey: event.currentTarget.value})\r\n }\r\n\r\n handleEnableSignedUrls = (event) => this.setState({enableSignedUrls: event.currentTarget.checked})\r\n\r\n handleCancel = (event) => {\r\n this.props.onCancel()\r\n }\r\n\r\n handleOnSubmit = (event) => {\r\n event.preventDefault()\r\n }\r\n\r\n handleSaveToken = async () => {\r\n const handleError = (err) => {\r\n console.error(err) // eslint-disable-line no-console\r\n this.setState({\r\n isLoading: false,\r\n error: 'Something went wrong saving the token. See console.error for more info.',\r\n })\r\n }\r\n\r\n this.setState({isLoading: true})\r\n\r\n const {token, secretKey, enableSignedUrls} = this.state || {}\r\n let {signingKeyId, signingKeyPrivate} = this.state || {}\r\n\r\n try {\r\n await saveSecrets(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate)\r\n } catch (err) {\r\n handleError('Error while trying to save secrets:', err)\r\n return\r\n }\r\n\r\n if (enableSignedUrls) {\r\n const hasValidSigningKeys = await haveValidSigningKeys(signingKeyId, signingKeyPrivate)\r\n\r\n if (!hasValidSigningKeys) {\r\n try {\r\n const {data} = await createSigningKeys()\r\n signingKeyId = data.id\r\n signingKeyPrivate = data.private_key\r\n await saveSecrets(token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate)\r\n } catch ({message}) {\r\n // eslint-disable-next-line no-console\r\n console.log('Error while creating and saving signing key:', message)\r\n this.setState({error: message})\r\n }\r\n }\r\n }\r\n\r\n this.setState({isLoading: false})\r\n\r\n this.props.onSave({token, secretKey, enableSignedUrls, signingKeyId, signingKeyPrivate})\r\n }\r\n\r\n render() {\r\n const {error, isLoading} = this.state\r\n\r\n return (\r\n <Box\r\n paddingRight={4}\r\n paddingLeft={4}\r\n paddingBottom={4}\r\n paddingTop={4}\r\n style={{position: 'relative'}}\r\n >\r\n <form onSubmit={this.handleOnSubmit}>\r\n <Stack space={4}>\r\n {!this.state.token && (\r\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"primary\">\r\n <Stack space={3}>\r\n <Text size={1}>\r\n To set up a new access token, go to your{' '}\r\n <a\r\n href=\"https://dashboard.mux.com/settings/access-tokens\"\r\n target=\"_blank\"\r\n rel=\"noreferrer noopener\"\r\n >\r\n account on mux.com\r\n </a>\r\n .\r\n </Text>\r\n <Text size={1}>\r\n The access token needs permissions: <strong>Mux Video </strong>\r\n (Full Access) and <strong>Mux Data</strong> (Read)\r\n <br />\r\n The credentials will be stored safely in a hidden document only available to\r\n editors.\r\n </Text>\r\n </Stack>\r\n </Card>\r\n )}\r\n <FormField\r\n changeIndicator={false}\r\n label=\"Access Token\"\r\n labelFor={this.tokenInputId}\r\n level={0}\r\n >\r\n <TextInput\r\n id={this.tokenInputId}\r\n ref={this.firstField}\r\n onChange={this.handleTokenChanged}\r\n type=\"text\"\r\n value={this.state.token || ''}\r\n />\r\n </FormField>\r\n <FormField\r\n changeIndicator={false}\r\n label=\"Secret Key\"\r\n labelFor={this.secretKeyInputId}\r\n level={0}\r\n >\r\n <TextInput\r\n id={this.secretKeyInputId}\r\n onChange={this.handleSecretKeyChanged}\r\n type=\"text\"\r\n value={this.state.secretKey || ''}\r\n />\r\n </FormField>\r\n\r\n <Stack space={4}>\r\n <Flex align=\"center\">\r\n <Checkbox\r\n id={this.enableSignedUrlsInputId}\r\n onChange={this.handleEnableSignedUrls}\r\n checked={this.state.enableSignedUrls || false}\r\n style={{display: 'block'}}\r\n />\r\n <Box flex={1} paddingLeft={3}>\r\n <Text>\r\n <label htmlFor={this.enableSignedUrlsInputId}>Enable Signed Urls</label>\r\n </Text>\r\n </Box>\r\n </Flex>\r\n {this.state.signingKeyId && this.state.enableSignedUrls ? (\r\n <Card padding={[3, 3, 3]} radius={2} shadow={1} tone=\"caution\">\r\n <Stack space={3}>\r\n <Text size={1}>The signing key ID that Sanity will use is:</Text>\r\n <Code size={1}>{this.state.signingKeyId}</Code>\r\n <Text size={1}>\r\n This key is only used for previewing content in the Sanity UI.\r\n <br />\r\n You should generate a different key to use in your application server.\r\n </Text>\r\n </Stack>\r\n </Card>\r\n ) : null}\r\n </Stack>\r\n\r\n <Inline space={2}>\r\n <Button\r\n text=\"Save\"\r\n loading={isLoading}\r\n tone=\"primary\"\r\n mode=\"default\"\r\n onClick={this.handleSaveToken}\r\n />\r\n\r\n <Button text=\"Cancel\" tone=\"primary\" mode=\"bleed\" onClick={this.handleCancel} />\r\n </Inline>\r\n\r\n {error && <p className={styles.error}>{error}</p>}\r\n </Stack>\r\n </form>\r\n </Box>\r\n )\r\n }\r\n}\r\n\r\nMuxVideoInputSetup.propTypes = propTypes\r\n\r\nMuxVideoInputSetup.defaultProps = {\r\n secrets: {\r\n token: null,\r\n secretKey: null,\r\n enableSignedUrls: false,\r\n signingKeyId: null,\r\n signingKeyPrivate: null,\r\n },\r\n}\r\n\r\nexport default MuxVideoInputSetup\r\n"],"file":"Setup.js"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
@import 'part:@sanity/base/theme/variables-style';
|
|
2
|
+
|
|
3
|
+
.root {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
justify-content: center;
|
|
7
|
+
text-align: center;
|
|
8
|
+
height: 100%;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.hasFocus {
|
|
12
|
+
composes: root;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.iconContainer {
|
|
16
|
+
font-size: 3rem;
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
padding: var(--small-padding);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.strong {
|
|
24
|
+
font-weight: 400;
|
|
25
|
+
margin: 0;
|
|
26
|
+
padding: 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.dropFile,
|
|
30
|
+
.pasteFile {
|
|
31
|
+
padding: 1rem;
|
|
32
|
+
display: none;
|
|
33
|
+
@media (--screen-medium) {
|
|
34
|
+
display: block;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.dropFile.isDraggingOver {
|
|
39
|
+
color: var(--state-success-color);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.pasteFile {
|
|
43
|
+
opacity: 0.2;
|
|
44
|
+
transition: opacity linear 0.2s;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.pasteFile.hasFocus {
|
|
48
|
+
opacity: 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.invalidPaste,
|
|
52
|
+
.invalidFile {
|
|
53
|
+
color: var(--state-danger-color);
|
|
54
|
+
animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
|
|
55
|
+
transform: translate3d(0, 0, 0);
|
|
56
|
+
backface-visibility: hidden;
|
|
57
|
+
perspective: 1000px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@keyframes shake {
|
|
61
|
+
10%,
|
|
62
|
+
90% {
|
|
63
|
+
transform: translate3d(-1px, 0, 0);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
20%,
|
|
67
|
+
80% {
|
|
68
|
+
transform: translate3d(2px, 0, 0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
30%,
|
|
72
|
+
50%,
|
|
73
|
+
70% {
|
|
74
|
+
transform: translate3d(-4px, 0, 0);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
40%,
|
|
78
|
+
60% {
|
|
79
|
+
transform: translate3d(4px, 0, 0);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _ui = require("@sanity/ui");
|
|
9
|
+
|
|
10
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _fi = require("react-icons/fi");
|
|
15
|
+
|
|
16
|
+
var _UploadPlaceholder = _interopRequireDefault(require("./UploadPlaceholder.css"));
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
21
|
+
|
|
22
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
23
|
+
|
|
24
|
+
class UploadPlaceholder extends _react.default.PureComponent {
|
|
25
|
+
render() {
|
|
26
|
+
var _this$props = this.props,
|
|
27
|
+
invalidPaste = _this$props.invalidPaste,
|
|
28
|
+
invalidFile = _this$props.invalidFile,
|
|
29
|
+
hasFocus = _this$props.hasFocus,
|
|
30
|
+
isDraggingOver = _this$props.isDraggingOver;
|
|
31
|
+
var fileClassNames = [_UploadPlaceholder.default.dropFile];
|
|
32
|
+
var pasteClassNames = [_UploadPlaceholder.default.pasteFile];
|
|
33
|
+
|
|
34
|
+
if (invalidFile) {
|
|
35
|
+
fileClassNames.push(_UploadPlaceholder.default.invalidFile);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isDraggingOver) {
|
|
39
|
+
fileClassNames.push(_UploadPlaceholder.default.isDraggingOver);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (invalidPaste) {
|
|
43
|
+
pasteClassNames.push(_UploadPlaceholder.default.invalidPaste);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (hasFocus) {
|
|
47
|
+
pasteClassNames.push(_UploadPlaceholder.default.hasFocus);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
|
|
51
|
+
justify: "center",
|
|
52
|
+
align: "center",
|
|
53
|
+
padding: 3
|
|
54
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
55
|
+
className: fileClassNames.join(' ')
|
|
56
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
57
|
+
className: _UploadPlaceholder.default.iconContainer
|
|
58
|
+
}, /*#__PURE__*/_react.default.createElement(_fi.FiUpload, {
|
|
59
|
+
size: "0.5em"
|
|
60
|
+
})), /*#__PURE__*/_react.default.createElement("p", {
|
|
61
|
+
className: _UploadPlaceholder.default.strong
|
|
62
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, "Drop file ", invalidFile))), /*#__PURE__*/_react.default.createElement("div", {
|
|
63
|
+
className: pasteClassNames.join(' ')
|
|
64
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
65
|
+
className: _UploadPlaceholder.default.iconContainer
|
|
66
|
+
}, /*#__PURE__*/_react.default.createElement(_fi.FiCopy, _extends({}, invalidPaste ? {
|
|
67
|
+
color: 'red'
|
|
68
|
+
} : {}, {
|
|
69
|
+
size: "0.5em"
|
|
70
|
+
}))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
|
|
71
|
+
className: _UploadPlaceholder.default.strong
|
|
72
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, "Paste URL"))))));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
exports.default = UploadPlaceholder;
|
|
78
|
+
|
|
79
|
+
_defineProperty(UploadPlaceholder, "propTypes", {
|
|
80
|
+
hasFocus: _propTypes.default.bool,
|
|
81
|
+
invalidPaste: _propTypes.default.bool,
|
|
82
|
+
invalidFile: _propTypes.default.bool,
|
|
83
|
+
isDraggingOver: _propTypes.default.bool
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
UploadPlaceholder.defaultProps = {
|
|
87
|
+
hasFocus: false,
|
|
88
|
+
invalidPaste: false,
|
|
89
|
+
invalidFile: false,
|
|
90
|
+
isDraggingOver: false
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=UploadPlaceholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/UploadPlaceholder.js"],"names":["UploadPlaceholder","React","PureComponent","render","props","invalidPaste","invalidFile","hasFocus","isDraggingOver","fileClassNames","styles","dropFile","pasteClassNames","pasteFile","push","join","iconContainer","strong","color","PropTypes","bool","defaultProps"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAEe,MAAMA,iBAAN,SAAgCC,eAAMC,aAAtC,CAAoD;AAOjEC,EAAAA,MAAM,GAAG;AACP,sBAA8D,KAAKC,KAAnE;AAAA,QAAOC,YAAP,eAAOA,YAAP;AAAA,QAAqBC,WAArB,eAAqBA,WAArB;AAAA,QAAkCC,QAAlC,eAAkCA,QAAlC;AAAA,QAA4CC,cAA5C,eAA4CA,cAA5C;AACA,QAAMC,cAAc,GAAG,CAACC,2BAAOC,QAAR,CAAvB;AACA,QAAMC,eAAe,GAAG,CAACF,2BAAOG,SAAR,CAAxB;;AACA,QAAIP,WAAJ,EAAiB;AACfG,MAAAA,cAAc,CAACK,IAAf,CAAoBJ,2BAAOJ,WAA3B;AACD;;AACD,QAAIE,cAAJ,EAAoB;AAClBC,MAAAA,cAAc,CAACK,IAAf,CAAoBJ,2BAAOF,cAA3B;AACD;;AACD,QAAIH,YAAJ,EAAkB;AAChBO,MAAAA,eAAe,CAACE,IAAhB,CAAqBJ,2BAAOL,YAA5B;AACD;;AACD,QAAIE,QAAJ,EAAc;AACZK,MAAAA,eAAe,CAACE,IAAhB,CAAqBJ,2BAAOH,QAA5B;AACD;;AACD,wBACE,uDACE,6BAAC,QAAD;AAAM,MAAA,OAAO,EAAC,QAAd;AAAuB,MAAA,KAAK,EAAC,QAA7B;AAAsC,MAAA,OAAO,EAAE;AAA/C,oBACE;AAAK,MAAA,SAAS,EAAEE,cAAc,CAACM,IAAf,CAAoB,GAApB;AAAhB,oBACE;AAAK,MAAA,SAAS,EAAEL,2BAAOM;AAAvB,oBACE,6BAAC,YAAD;AAAU,MAAA,IAAI,EAAC;AAAf,MADF,CADF,eAIE;AAAG,MAAA,SAAS,EAAEN,2BAAOO;AAArB,oBACE,yDAAiBX,WAAjB,CADF,CAJF,CADF,eASE;AAAK,MAAA,SAAS,EAAEM,eAAe,CAACG,IAAhB,CAAqB,GAArB;AAAhB,oBACE;AAAK,MAAA,SAAS,EAAEL,2BAAOM;AAAvB,oBACE,6BAAC,UAAD,eAAaX,YAAY,GAAG;AAACa,MAAAA,KAAK,EAAE;AAAR,KAAH,GAAoB,EAA7C;AAAkD,MAAA,IAAI,EAAC;AAAvD,OADF,CADF,eAIE,uDACE;AAAG,MAAA,SAAS,EAAER,2BAAOO;AAArB,oBACE,uDADF,CADF,CAJF,CATF,CADF,CADF;AAwBD;;AA/CgE;;;;gBAA9CjB,iB,eACA;AACjBO,EAAAA,QAAQ,EAAEY,mBAAUC,IADH;AAEjBf,EAAAA,YAAY,EAAEc,mBAAUC,IAFP;AAGjBd,EAAAA,WAAW,EAAEa,mBAAUC,IAHN;AAIjBZ,EAAAA,cAAc,EAAEW,mBAAUC;AAJT,C;;AAiDrBpB,iBAAiB,CAACqB,YAAlB,GAAiC;AAC/Bd,EAAAA,QAAQ,EAAE,KADqB;AAE/BF,EAAAA,YAAY,EAAE,KAFiB;AAG/BC,EAAAA,WAAW,EAAE,KAHkB;AAI/BE,EAAAA,cAAc,EAAE;AAJe,CAAjC","sourcesContent":["import {Flex} from '@sanity/ui'\r\nimport PropTypes from 'prop-types'\r\nimport React from 'react'\r\nimport {FiCopy, FiUpload} from 'react-icons/fi'\r\nimport styles from './UploadPlaceholder.css'\r\n\r\nexport default class UploadPlaceholder extends React.PureComponent {\r\n static propTypes = {\r\n hasFocus: PropTypes.bool,\r\n invalidPaste: PropTypes.bool,\r\n invalidFile: PropTypes.bool,\r\n isDraggingOver: PropTypes.bool,\r\n }\r\n render() {\r\n const {invalidPaste, invalidFile, hasFocus, isDraggingOver} = this.props\r\n const fileClassNames = [styles.dropFile]\r\n const pasteClassNames = [styles.pasteFile]\r\n if (invalidFile) {\r\n fileClassNames.push(styles.invalidFile)\r\n }\r\n if (isDraggingOver) {\r\n fileClassNames.push(styles.isDraggingOver)\r\n }\r\n if (invalidPaste) {\r\n pasteClassNames.push(styles.invalidPaste)\r\n }\r\n if (hasFocus) {\r\n pasteClassNames.push(styles.hasFocus)\r\n }\r\n return (\r\n <div>\r\n <Flex justify=\"center\" align=\"center\" padding={3}>\r\n <div className={fileClassNames.join(' ')}>\r\n <div className={styles.iconContainer}>\r\n <FiUpload size=\"0.5em\" />\r\n </div>\r\n <p className={styles.strong}>\r\n <span>Drop file {invalidFile}</span>\r\n </p>\r\n </div>\r\n <div className={pasteClassNames.join(' ')}>\r\n <div className={styles.iconContainer}>\r\n <FiCopy {...(invalidPaste ? {color: 'red'} : {})} size=\"0.5em\" />\r\n </div>\r\n <div>\r\n <p className={styles.strong}>\r\n <span>Paste URL</span>\r\n </p>\r\n </div>\r\n </div>\r\n </Flex>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nUploadPlaceholder.defaultProps = {\r\n hasFocus: false,\r\n invalidPaste: false,\r\n invalidFile: false,\r\n isDraggingOver: false,\r\n}\r\n"],"file":"UploadPlaceholder.js"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
@import 'part:@sanity/base/theme/variables-style';
|
|
2
|
+
|
|
3
|
+
.uploadProgress {
|
|
4
|
+
text-align: center;
|
|
5
|
+
padding: var(--medium-padding);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.progressBar {
|
|
9
|
+
margin-top: var(--large-padding);
|
|
10
|
+
margin-bottom: 2.5em;
|
|
11
|
+
text-align: left;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.errorMessage {
|
|
15
|
+
background: #fff;
|
|
16
|
+
color: var(--state-danger-color);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.hiddenTextField {
|
|
20
|
+
position: absolute;
|
|
21
|
+
border: 0;
|
|
22
|
+
color: white;
|
|
23
|
+
opacity: 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.hiddenTextField:focus {
|
|
27
|
+
outline: none;
|
|
28
|
+
}
|