@ndla/video-search 4.1.46 → 5.0.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/es/VideoSearch.js CHANGED
@@ -1,3 +1,4 @@
1
+ import _styled from "@emotion/styled/base";
1
2
  /**
2
3
  * Copyright (c) 2017-present, NDLA.
3
4
  *
@@ -6,253 +7,97 @@
6
7
  *
7
8
  */
8
9
 
9
- import PropTypes from 'prop-types';
10
- import { Component } from 'react';
11
- import BEMHelper from 'react-bem-helper';
12
- import Pager from '@ndla/pager';
13
- import { getLastPage } from './videoHelpers';
14
- import VideoLoadMoreButton from './VideoLoadMoreButton';
15
- import VideoSearchForm from './VideoSearchForm';
16
- import VideoSearchList from './VideoSearchList';
17
- import VideoTabs from './VideoTabs';
10
+ import { useCallback, useEffect, useState } from 'react';
11
+ import { ButtonV2 } from '@ndla/button';
12
+ import { colors, misc, spacing } from '@ndla/core';
13
+ import { FormControl, InputV3, Label } from '@ndla/forms';
14
+ import { Spinner } from '@ndla/icons';
15
+ import { usePrevious } from '@ndla/util';
16
+ import { VideoResultList } from './VideoResultList';
18
17
  import { jsx as _jsx } from "@emotion/react/jsx-runtime";
19
18
  import { jsxs as _jsxs } from "@emotion/react/jsx-runtime";
20
- const classes = new BEMHelper({
21
- name: 'video-search',
22
- prefix: 'c-'
23
- });
24
- class VideoSearch extends Component {
25
- constructor() {
26
- super();
27
- this.state = {
28
- queryObject: {
29
- query: '',
30
- offset: 0,
19
+ const VideoSearchWrapper = /*#__PURE__*/_styled("div", {
20
+ target: "eyp4xih1",
21
+ label: "VideoSearchWrapper"
22
+ })("display:flex;flex-direction:column;align-items:center;gap:", spacing.normal, ";border:1px solid ", colors.brand.light, ";border-radius:", misc.borderRadius, ";padding:", spacing.normal, ";>form{width:100%;}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZGVvU2VhcmNoLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEwQ3FDIiwiZmlsZSI6IlZpZGVvU2VhcmNoLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IHsgQ2hhbmdlRXZlbnQsIEZvcm1FdmVudCwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBCdXR0b25WMiB9IGZyb20gJ0BuZGxhL2J1dHRvbic7XG5pbXBvcnQgeyBjb2xvcnMsIG1pc2MsIHNwYWNpbmcgfSBmcm9tICdAbmRsYS9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBJbnB1dFYzLCBMYWJlbCB9IGZyb20gJ0BuZGxhL2Zvcm1zJztcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICdAbmRsYS9pY29ucyc7XG5pbXBvcnQgeyBCcmlnaHRjb3ZlQXBpVHlwZSB9IGZyb20gJ0BuZGxhL3R5cGVzLWVtYmVkJztcbmltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAnQG5kbGEvdXRpbCc7XG5pbXBvcnQgeyBWaWRlb1Jlc3VsdExpc3QgfSBmcm9tICcuL1ZpZGVvUmVzdWx0TGlzdCc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zbGF0aW9ucyA9IHtcbiAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgc2VhcmNoQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgbG9hZE1vcmVWaWRlb3M6IHN0cmluZztcbiAgbm9SZXN1bHRzOiBzdHJpbmc7XG4gIGlzMzYwVmlkZW86IHN0cmluZztcbiAgcHJldmlld1ZpZGVvOiBzdHJpbmc7XG4gIGFkZFZpZGVvOiBzdHJpbmc7XG59O1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBvblZpZGVvU2VsZWN0OiAodmlkZW86IEJyaWdodGNvdmVBcGlUeXBlKSA9PiB2b2lkO1xuICBzZWFyY2hWaWRlb3M6IChxdWVyeTogVmlkZW9RdWVyeVR5cGUpID0+IFByb21pc2U8QnJpZ2h0Y292ZUFwaVR5cGVbXT47XG4gIG9uRXJyb3I6IChlOiB1bmtub3duKSA9PiB2b2lkO1xuICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucztcbiAgbG9jYWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9RdWVyeVR5cGUge1xuICBxdWVyeTogc3RyaW5nO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbn1cblxuY29uc3QgVmlkZW9TZWFyY2hXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAke3NwYWNpbmcubm9ybWFsfTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHtjb2xvcnMuYnJhbmQubGlnaHR9O1xuICBib3JkZXItcmFkaXVzOiAke21pc2MuYm9yZGVyUmFkaXVzfTtcbiAgcGFkZGluZzogJHtzcGFjaW5nLm5vcm1hbH07XG4gID4gZm9ybSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEZvcm1Db250cm9sID0gc3R5bGVkKEZvcm1Db250cm9sKWBcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAke3NwYWNpbmcuc21hbGx9O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBidXR0b24ge1xuICAgIG1pbi13aWR0aDogJHtzcGFjaW5nLnh4bGFyZ2V9O1xuICAgIGhlaWdodDogJHtzcGFjaW5nLmxhcmdlfTtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFZpZGVvU2VhcmNoID0gKHsgb25WaWRlb1NlbGVjdCwgc2VhcmNoVmlkZW9zLCBvbkVycm9yLCB0cmFuc2xhdGlvbnMsIGxvY2FsZSB9OiBQcm9wcykgPT4ge1xuICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29mZnNldCwgc2V0T2Zmc2V0XSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBbdmlkZW9zLCBzZXRWaWRlb3NdID0gdXNlU3RhdGU8QnJpZ2h0Y292ZUFwaVR5cGVbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBwcmV2aW91c1F1ZXJ5ID0gdXNlUHJldmlvdXMocXVlcnkpO1xuXG4gIGNvbnN0IGZldGNoVmlkZW9zID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHF1ZXJ5OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc0FwcGVuZGluZyA9IHF1ZXJ5ID09PSBwcmV2aW91c1F1ZXJ5O1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VhcmNoVmlkZW9zKHsgcXVlcnksIG9mZnNldDogb2Zmc2V0LCBsaW1pdDogMTAgfSk7XG4gICAgICAgIHNldFZpZGVvcygocHJldikgPT4gKGlzQXBwZW5kaW5nID8gcHJldi5jb25jYXQocmVzdWx0cykgOiByZXN1bHRzKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9uRXJyb3IoZSk7XG4gICAgICB9XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgW3NlYXJjaFZpZGVvcywgcHJldmlvdXNRdWVyeSwgb25FcnJvcl0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmZXRjaFZpZGVvcygnJywgMCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb25TdWJtaXQgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBzZXRPZmZzZXQoMCk7XG4gICAgICBmZXRjaFZpZGVvcyhxdWVyeSwgb2Zmc2V0KTtcbiAgICB9LFxuICAgIFtmZXRjaFZpZGVvcywgb2Zmc2V0LCBxdWVyeV0sXG4gICk7XG5cbiAgY29uc3Qgb25TaG93TW9yZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBuZXdPZmZzZXQgPSBvZmZzZXQgKyAxMDtcbiAgICBzZXRPZmZzZXQobmV3T2Zmc2V0KTtcbiAgICBmZXRjaFZpZGVvcyhxdWVyeSwgbmV3T2Zmc2V0KTtcbiAgfSwgW2ZldGNoVmlkZW9zLCBvZmZzZXQsIHF1ZXJ5XSk7XG5cbiAgY29uc3Qgb25RdWVyeUNoYW5nZSA9IHVzZUNhbGxiYWNrKChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIHNldFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPFZpZGVvU2VhcmNoV3JhcHBlcj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXtvblN1Ym1pdH0+XG4gICAgICAgIDxTdHlsZWRGb3JtQ29udHJvbCBpZD1cInZpZGVvLXNlYXJjaC1maWVsZFwiPlxuICAgICAgICAgIDxMYWJlbCB2aXN1YWxseUhpZGRlbj57dHJhbnNsYXRpb25zLnNlYXJjaFBsYWNlaG9sZGVyfTwvTGFiZWw+XG4gICAgICAgICAgPElucHV0VjMgdHlwZT1cInNlYXJjaFwiIHZhbHVlPXtxdWVyeX0gb25DaGFuZ2U9e29uUXVlcnlDaGFuZ2V9IHBsYWNlaG9sZGVyPXt0cmFuc2xhdGlvbnMuc2VhcmNoUGxhY2Vob2xkZXJ9IC8+XG4gICAgICAgICAgPEJ1dHRvblYyIHR5cGU9XCJzdWJtaXRcIj57dHJhbnNsYXRpb25zLnNlYXJjaEJ1dHRvblRpdGxlfTwvQnV0dG9uVjI+XG4gICAgICAgIDwvU3R5bGVkRm9ybUNvbnRyb2w+XG4gICAgICA8L2Zvcm0+XG4gICAgICB7dmlkZW9zLmxlbmd0aCA9PT0gMCAmJiAhaXNMb2FkaW5nID8gKFxuICAgICAgICA8cD57dHJhbnNsYXRpb25zLm5vUmVzdWx0c308L3A+XG4gICAgICApIDogKFxuICAgICAgICA8VmlkZW9SZXN1bHRMaXN0IHZpZGVvcz17dmlkZW9zfSBsb2NhbGU9e2xvY2FsZX0gb25TZWxlY3RWaWRlbz17b25WaWRlb1NlbGVjdH0gdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9IC8+XG4gICAgICApfVxuICAgICAge2lzTG9hZGluZyA/IDxTcGlubmVyIC8+IDogPEJ1dHRvblYyIG9uQ2xpY2s9e29uU2hvd01vcmV9Pnt0cmFuc2xhdGlvbnMubG9hZE1vcmVWaWRlb3N9PC9CdXR0b25WMj59XG4gICAgPC9WaWRlb1NlYXJjaFdyYXBwZXI+XG4gICk7XG59O1xuIl19 */"));
23
+ const StyledFormControl = /*#__PURE__*/_styled(FormControl, {
24
+ target: "eyp4xih0",
25
+ label: "StyledFormControl"
26
+ })("display:flex;gap:", spacing.small, ";flex-direction:row;align-items:center;button{min-width:", spacing.xxlarge, ";height:", spacing.large, ";}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlZpZGVvU2VhcmNoLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1RDZDIiwiZmlsZSI6IlZpZGVvU2VhcmNoLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIE5ETEEuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMdjMgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cblxuaW1wb3J0IHsgQ2hhbmdlRXZlbnQsIEZvcm1FdmVudCwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBCdXR0b25WMiB9IGZyb20gJ0BuZGxhL2J1dHRvbic7XG5pbXBvcnQgeyBjb2xvcnMsIG1pc2MsIHNwYWNpbmcgfSBmcm9tICdAbmRsYS9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBJbnB1dFYzLCBMYWJlbCB9IGZyb20gJ0BuZGxhL2Zvcm1zJztcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICdAbmRsYS9pY29ucyc7XG5pbXBvcnQgeyBCcmlnaHRjb3ZlQXBpVHlwZSB9IGZyb20gJ0BuZGxhL3R5cGVzLWVtYmVkJztcbmltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAnQG5kbGEvdXRpbCc7XG5pbXBvcnQgeyBWaWRlb1Jlc3VsdExpc3QgfSBmcm9tICcuL1ZpZGVvUmVzdWx0TGlzdCc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zbGF0aW9ucyA9IHtcbiAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgc2VhcmNoQnV0dG9uVGl0bGU6IHN0cmluZztcbiAgbG9hZE1vcmVWaWRlb3M6IHN0cmluZztcbiAgbm9SZXN1bHRzOiBzdHJpbmc7XG4gIGlzMzYwVmlkZW86IHN0cmluZztcbiAgcHJldmlld1ZpZGVvOiBzdHJpbmc7XG4gIGFkZFZpZGVvOiBzdHJpbmc7XG59O1xuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBvblZpZGVvU2VsZWN0OiAodmlkZW86IEJyaWdodGNvdmVBcGlUeXBlKSA9PiB2b2lkO1xuICBzZWFyY2hWaWRlb3M6IChxdWVyeTogVmlkZW9RdWVyeVR5cGUpID0+IFByb21pc2U8QnJpZ2h0Y292ZUFwaVR5cGVbXT47XG4gIG9uRXJyb3I6IChlOiB1bmtub3duKSA9PiB2b2lkO1xuICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9ucztcbiAgbG9jYWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9RdWVyeVR5cGUge1xuICBxdWVyeTogc3RyaW5nO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbn1cblxuY29uc3QgVmlkZW9TZWFyY2hXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAke3NwYWNpbmcubm9ybWFsfTtcbiAgYm9yZGVyOiAxcHggc29saWQgJHtjb2xvcnMuYnJhbmQubGlnaHR9O1xuICBib3JkZXItcmFkaXVzOiAke21pc2MuYm9yZGVyUmFkaXVzfTtcbiAgcGFkZGluZzogJHtzcGFjaW5nLm5vcm1hbH07XG4gID4gZm9ybSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEZvcm1Db250cm9sID0gc3R5bGVkKEZvcm1Db250cm9sKWBcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiAke3NwYWNpbmcuc21hbGx9O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBidXR0b24ge1xuICAgIG1pbi13aWR0aDogJHtzcGFjaW5nLnh4bGFyZ2V9O1xuICAgIGhlaWdodDogJHtzcGFjaW5nLmxhcmdlfTtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFZpZGVvU2VhcmNoID0gKHsgb25WaWRlb1NlbGVjdCwgc2VhcmNoVmlkZW9zLCBvbkVycm9yLCB0cmFuc2xhdGlvbnMsIGxvY2FsZSB9OiBQcm9wcykgPT4ge1xuICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW29mZnNldCwgc2V0T2Zmc2V0XSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBbdmlkZW9zLCBzZXRWaWRlb3NdID0gdXNlU3RhdGU8QnJpZ2h0Y292ZUFwaVR5cGVbXT4oW10pO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBwcmV2aW91c1F1ZXJ5ID0gdXNlUHJldmlvdXMocXVlcnkpO1xuXG4gIGNvbnN0IGZldGNoVmlkZW9zID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHF1ZXJ5OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc0FwcGVuZGluZyA9IHF1ZXJ5ID09PSBwcmV2aW91c1F1ZXJ5O1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VhcmNoVmlkZW9zKHsgcXVlcnksIG9mZnNldDogb2Zmc2V0LCBsaW1pdDogMTAgfSk7XG4gICAgICAgIHNldFZpZGVvcygocHJldikgPT4gKGlzQXBwZW5kaW5nID8gcHJldi5jb25jYXQocmVzdWx0cykgOiByZXN1bHRzKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9uRXJyb3IoZSk7XG4gICAgICB9XG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgW3NlYXJjaFZpZGVvcywgcHJldmlvdXNRdWVyeSwgb25FcnJvcl0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmZXRjaFZpZGVvcygnJywgMCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb25TdWJtaXQgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBzZXRPZmZzZXQoMCk7XG4gICAgICBmZXRjaFZpZGVvcyhxdWVyeSwgb2Zmc2V0KTtcbiAgICB9LFxuICAgIFtmZXRjaFZpZGVvcywgb2Zmc2V0LCBxdWVyeV0sXG4gICk7XG5cbiAgY29uc3Qgb25TaG93TW9yZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBuZXdPZmZzZXQgPSBvZmZzZXQgKyAxMDtcbiAgICBzZXRPZmZzZXQobmV3T2Zmc2V0KTtcbiAgICBmZXRjaFZpZGVvcyhxdWVyeSwgbmV3T2Zmc2V0KTtcbiAgfSwgW2ZldGNoVmlkZW9zLCBvZmZzZXQsIHF1ZXJ5XSk7XG5cbiAgY29uc3Qgb25RdWVyeUNoYW5nZSA9IHVzZUNhbGxiYWNrKChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgIHNldFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPFZpZGVvU2VhcmNoV3JhcHBlcj5cbiAgICAgIDxmb3JtIG9uU3VibWl0PXtvblN1Ym1pdH0+XG4gICAgICAgIDxTdHlsZWRGb3JtQ29udHJvbCBpZD1cInZpZGVvLXNlYXJjaC1maWVsZFwiPlxuICAgICAgICAgIDxMYWJlbCB2aXN1YWxseUhpZGRlbj57dHJhbnNsYXRpb25zLnNlYXJjaFBsYWNlaG9sZGVyfTwvTGFiZWw+XG4gICAgICAgICAgPElucHV0VjMgdHlwZT1cInNlYXJjaFwiIHZhbHVlPXtxdWVyeX0gb25DaGFuZ2U9e29uUXVlcnlDaGFuZ2V9IHBsYWNlaG9sZGVyPXt0cmFuc2xhdGlvbnMuc2VhcmNoUGxhY2Vob2xkZXJ9IC8+XG4gICAgICAgICAgPEJ1dHRvblYyIHR5cGU9XCJzdWJtaXRcIj57dHJhbnNsYXRpb25zLnNlYXJjaEJ1dHRvblRpdGxlfTwvQnV0dG9uVjI+XG4gICAgICAgIDwvU3R5bGVkRm9ybUNvbnRyb2w+XG4gICAgICA8L2Zvcm0+XG4gICAgICB7dmlkZW9zLmxlbmd0aCA9PT0gMCAmJiAhaXNMb2FkaW5nID8gKFxuICAgICAgICA8cD57dHJhbnNsYXRpb25zLm5vUmVzdWx0c308L3A+XG4gICAgICApIDogKFxuICAgICAgICA8VmlkZW9SZXN1bHRMaXN0IHZpZGVvcz17dmlkZW9zfSBsb2NhbGU9e2xvY2FsZX0gb25TZWxlY3RWaWRlbz17b25WaWRlb1NlbGVjdH0gdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9IC8+XG4gICAgICApfVxuICAgICAge2lzTG9hZGluZyA/IDxTcGlubmVyIC8+IDogPEJ1dHRvblYyIG9uQ2xpY2s9e29uU2hvd01vcmV9Pnt0cmFuc2xhdGlvbnMubG9hZE1vcmVWaWRlb3N9PC9CdXR0b25WMj59XG4gICAgPC9WaWRlb1NlYXJjaFdyYXBwZXI+XG4gICk7XG59O1xuIl19 */"));
27
+ export const VideoSearch = _ref => {
28
+ let {
29
+ onVideoSelect,
30
+ searchVideos,
31
+ onError,
32
+ translations,
33
+ locale
34
+ } = _ref;
35
+ const [query, setQuery] = useState('');
36
+ const [offset, setOffset] = useState(0);
37
+ const [videos, setVideos] = useState([]);
38
+ const [isLoading, setIsLoading] = useState(false);
39
+ const previousQuery = usePrevious(query);
40
+ const fetchVideos = useCallback(async (query, offset) => {
41
+ setIsLoading(true);
42
+ try {
43
+ const isAppending = query === previousQuery;
44
+ const results = await searchVideos({
45
+ query,
46
+ offset: offset,
31
47
  limit: 10
32
- },
33
- videos: [],
34
- selectedType: 'brightcove',
35
- // Default
36
- selectedVideo: undefined,
37
- lastPage: 0,
38
- searching: false
39
- };
40
- this.submitVideoSearchQuery = this.submitVideoSearchQuery.bind(this);
41
- this.changeQueryPage = this.changeQueryPage.bind(this);
42
- this.onSearchTypeChange = this.onSearchTypeChange.bind(this);
43
- this.searchVideos = this.searchVideos.bind(this);
44
- this.onVideoPreview = this.onVideoPreview.bind(this);
45
- this.onSelectVideo = this.onSelectVideo.bind(this);
46
- this.loadMoreVideos = this.loadMoreVideos.bind(this);
47
- }
48
- componentDidMount() {
49
- this.searchVideos(this.state.queryObject);
50
- }
51
- onVideoPreview(video) {
52
- this.setState({
53
- selectedVideo: video
54
- });
55
- }
56
- onSelectVideo(video) {
57
- const {
58
- selectedType
59
- } = this.state;
60
- const {
61
- onVideoSelect
62
- } = this.props;
63
- this.setState({
64
- selectedVideo: undefined
65
- });
66
- onVideoSelect(video, selectedType);
67
- }
68
- onSearchTypeChange(type) {
69
- let queryObject;
70
- if (type === 'youtube') {
71
- queryObject = {
72
- query: '',
73
- offset: undefined,
74
- limit: undefined,
75
- page: 1,
76
- start: 1
77
- };
78
- } else {
79
- queryObject = {
80
- query: '',
81
- offset: 0,
82
- limit: 10,
83
- page: undefined,
84
- start: undefined
85
- };
86
- }
87
- this.setState({
88
- queryObject,
89
- selectedType: type,
90
- selectedVideo: undefined,
91
- videos: [],
92
- searching: true
93
- }, this.searchVideos(queryObject, type));
94
- }
95
- loadMoreVideos() {
96
- const {
97
- queryObject,
98
- videos,
99
- selectedType
100
- } = this.state;
101
- const {
102
- searchVideos,
103
- onError
104
- } = this.props;
105
- this.setState({
106
- searching: true
107
- });
108
- searchVideos({
109
- ...queryObject,
110
- offset: queryObject.offset + 10
111
- }, selectedType).then(result => {
112
- this.setState(prevState => ({
113
- queryObject: {
114
- ...prevState.queryObject,
115
- offset: prevState.queryObject.offset + 10
116
- },
117
- videos: videos.concat(result),
118
- searching: false
119
- }));
120
- }).catch(err => {
121
- onError(err);
122
- this.setState({
123
- searching: false
124
- });
125
- });
126
- }
127
- changeQueryPage(page) {
128
- this.setState({
129
- lastPage: 0
130
- });
131
- const {
132
- queryObject
133
- } = this.state;
134
- const nextIndex = queryObject.start + (page.page - queryObject.page) * 10;
135
- const newQueryObject = {
136
- ...queryObject,
137
- ...page,
138
- start: nextIndex
139
- };
140
- this.searchVideos(newQueryObject);
141
- }
142
- submitVideoSearchQuery(query) {
143
- const queryObject = {
144
- ...this.state.queryObject,
145
- query
146
- };
147
- this.searchVideos(queryObject);
148
- }
149
- searchVideos(queryObject) {
150
- let selectedType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.state.selectedType;
151
- const {
152
- searchVideos,
153
- onError
154
- } = this.props;
155
- searchVideos(queryObject, selectedType).then(result => {
156
- if (selectedType === this.state.selectedType) {
157
- this.setState(prevState => ({
158
- queryObject: {
159
- ...prevState.queryObject,
160
- query: queryObject.query,
161
- page: queryObject.page,
162
- start: queryObject.start,
163
- offset: 0
164
- },
165
- videos: selectedType === 'youtube' ? result.items : result,
166
- searching: false,
167
- lastPage: getLastPage(result, selectedType)
168
- }));
169
- }
170
- }).catch(err => {
171
- onError(err);
172
- this.setState({
173
- searching: false
174
48
  });
175
- });
176
- }
177
- render() {
178
- const {
179
- translations,
180
- locale,
181
- enabledSources
182
- } = this.props;
183
- const {
184
- queryObject,
185
- lastPage,
186
- videos,
187
- selectedVideo,
188
- selectedType,
189
- searching
190
- } = this.state;
191
- const {
192
- query,
193
- page
194
- } = queryObject;
195
- const paginationItem = () => {
196
- if (selectedType === 'brightcove') {
197
- return _jsx(VideoLoadMoreButton, {
198
- searching: searching,
199
- videos: videos,
200
- loadMoreVideos: this.loadMoreVideos,
201
- limit: queryObject.limit,
202
- translations: translations
203
- });
204
- }
205
- return _jsx(Pager, {
206
- page: page || 1,
207
- lastPage: lastPage,
208
- onClick: this.changeQueryPage
209
- });
210
- };
211
- const searchListTabs = enabledSources.map(source => ({
212
- title: source,
213
- id: source,
214
- content: _jsx("div", {
215
- ...classes('list'),
216
- children: selectedType === source.toLowerCase() && _jsx(VideoSearchList, {
217
- translations: translations,
218
- selectedType: source.toLowerCase(),
219
- selectedVideo: selectedVideo,
220
- videos: videos,
221
- locale: locale,
222
- onVideoPreview: this.onVideoPreview,
223
- searching: searching,
224
- onSelectVideo: this.onSelectVideo
225
- })
49
+ setVideos(prev => isAppending ? prev.concat(results) : results);
50
+ } catch (e) {
51
+ onError(e);
52
+ }
53
+ setIsLoading(false);
54
+ }, [searchVideos, previousQuery, onError]);
55
+ useEffect(() => {
56
+ fetchVideos('', 0);
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, []);
59
+ const onSubmit = useCallback(e => {
60
+ e.preventDefault();
61
+ e.stopPropagation();
62
+ setOffset(0);
63
+ fetchVideos(query, offset);
64
+ }, [fetchVideos, offset, query]);
65
+ const onShowMore = useCallback(() => {
66
+ const newOffset = offset + 10;
67
+ setOffset(newOffset);
68
+ fetchVideos(query, newOffset);
69
+ }, [fetchVideos, offset, query]);
70
+ const onQueryChange = useCallback(e => {
71
+ setQuery(e.target.value);
72
+ }, []);
73
+ return _jsxs(VideoSearchWrapper, {
74
+ children: [_jsx("form", {
75
+ onSubmit: onSubmit,
76
+ children: _jsxs(StyledFormControl, {
77
+ id: "video-search-field",
78
+ children: [_jsx(Label, {
79
+ visuallyHidden: true,
80
+ children: translations.searchPlaceholder
81
+ }), _jsx(InputV3, {
82
+ type: "search",
83
+ value: query,
84
+ onChange: onQueryChange,
85
+ placeholder: translations.searchPlaceholder
86
+ }), _jsx(ButtonV2, {
87
+ type: "submit",
88
+ children: translations.searchButtonTitle
89
+ })]
226
90
  })
227
- }));
228
- return _jsxs("div", {
229
- ...classes(),
230
- children: [_jsx(VideoSearchForm, {
231
- onSearchQuerySubmit: this.submitVideoSearchQuery,
232
- query: query,
233
- searching: searching,
234
- translations: translations
235
- }), _jsx(VideoTabs, {
236
- searchTypes: selectedType,
237
- tabs: searchListTabs,
238
- onSearchTypeChange: this.onSearchTypeChange
239
- }), paginationItem()]
240
- });
241
- }
242
- }
243
- VideoSearch.propTypes = {
244
- onVideoSelect: PropTypes.func.isRequired,
245
- searchVideos: PropTypes.func.isRequired,
246
- onError: PropTypes.func.isRequired,
247
- translations: PropTypes.shape({
248
- searchPlaceholder: PropTypes.string.isRequired,
249
- searchButtonTitle: PropTypes.string.isRequired,
250
- loadMoreVideos: PropTypes.string.isRequired
251
- }),
252
- locale: PropTypes.string.isRequired,
253
- enabledSources: PropTypes.arrayOf(PropTypes.string)
254
- };
255
- VideoSearch.defaultProps = {
256
- enabledSources: ['Brightcove']
257
- };
258
- export default VideoSearch;
91
+ }), videos.length === 0 && !isLoading ? _jsx("p", {
92
+ children: translations.noResults
93
+ }) : _jsx(VideoResultList, {
94
+ videos: videos,
95
+ locale: locale,
96
+ onSelectVideo: onVideoSelect,
97
+ translations: translations
98
+ }), isLoading ? _jsx(Spinner, {}) : _jsx(ButtonV2, {
99
+ onClick: onShowMore,
100
+ children: translations.loadMoreVideos
101
+ })]
102
+ });
103
+ };
package/es/index.js CHANGED
@@ -6,5 +6,5 @@
6
6
  *
7
7
  */
8
8
 
9
- import VideoSearch from './VideoSearch';
9
+ import { VideoSearch } from './VideoSearch';
10
10
  export default VideoSearch;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright (c) 2017-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+ import { BrightcoveApiType } from '@ndla/types-embed';
9
+ import { Translations } from './VideoSearch';
10
+ interface Props {
11
+ videos: BrightcoveApiType[];
12
+ translations: Translations;
13
+ locale: string;
14
+ onSelectVideo: (video: BrightcoveApiType) => void;
15
+ }
16
+ export declare const VideoResultList: ({ videos, translations, locale, onSelectVideo }: Props) => import("@emotion/react/jsx-runtime").JSX.Element;
17
+ interface VideoListItemProps {
18
+ video: BrightcoveApiType;
19
+ translations: Translations;
20
+ locale: string;
21
+ onSelectVideo: (video: BrightcoveApiType) => void;
22
+ }
23
+ export declare const VideoListItem: ({ video, onSelectVideo, translations, locale }: VideoListItemProps) => import("@emotion/react/jsx-runtime").JSX.Element;
24
+ export {};