{"version":3,"file":"static/js/application.async.landing~86378a44.704318b5.chunk.js","mappings":"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","sources":["../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/video-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/sparkle-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/hollow-sparkle-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/black-sparkle-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/info-sparkle-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/squareDismiss-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/spinnerBase-svg-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/asset-images/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/constants.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/filter-type.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-asset-type-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-time-description.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/convert-time-duration.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-date-added-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-import-source-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-image-sorting-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/get-asset-source-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/edit-image-utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/AI-prompt-example/sample.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/merge-task-updates.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/use-clarity-hook.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/model/utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-asset-entry-card/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-asset-entry-card/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-panel-container/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-spinner/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-action-button-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-action-button.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/theme/ads-studio-theme-provider.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/theme/with-ads-studio-styles.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-overlay-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-overlay.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-card-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-card.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-decorative-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-decorative-icon.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-decorative-label.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-decorative-label.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-deletion-button-decorator.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-deletion-button-decorator-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-image.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-image.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-selection-decorator-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-selection-decorator.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-loading-cell.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-icon-component/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-icon-component/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-drag-decorator-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-drag-decorator.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-cell-drop-decorator-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/grid-cells/tiles-grid-cell-drop-decorator.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/default-grid-config.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/tiles-grid.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/tiles-grid-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/multi-selection-grid.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/styles/section-tiles-grid-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-tile-grid/section-tiles-grid.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/text-with-highlight/styles.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/text-with-highlight/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/shared-cell-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/folders-grid-cell/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/folders-grid-cell/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/image-assets-grid-cell/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/image-assets-grid-cell/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/assets-grid-cell/grid-cell-factory.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/assets-grid-cell/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/assets-grid-cell/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/video-component/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/video-component/video.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/video-component/video-placeholder.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/video-assets-grid-cell/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/video-assets-grid-cell/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-asset-grid-cell/image-panel-grid-cell/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/panel-image-grid/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/performance-filter-bar/styles.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/performance-filter-bar/performance-editing-filter-bar.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/performance-filter-bar/view-all-filters-button.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/performance-filter-bar/performance-readonly-filter-bar.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-video-panel-content/video-playback-view.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-video-panel-content/item-placeholder-box-view.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-uploading-preview/styles.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-uploading-preview/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/file-uploading-preivew/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-video-panel-content/video-load-preview.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/add-video-panel-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/stock-image-panel-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/invest-image-panel-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/invest-video-panel-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/website-image-panel-content/domain-input-view.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/website-image-panel-content/subdomain-input-view.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/website-image-panel-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/website-image-panel-content/useWebsiteImages.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-breadcrumb/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-library-page-content/styles/empty-view-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/empty-view/library-page-empty-view.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/new-dropdown.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/image-size.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/date-utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/simple-date-range-picker/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/upload-asset-limit-error.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/image-utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/video-utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/get-error-string.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/processor-util.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/upload-asset-error.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/folder-functions.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/upload-folder-error.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/task-poller.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/folder-reducer.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/error-handling/ads-studio-error-base.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/error-handling/service-error-processors.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/use-folders.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/use-image-repo-methods.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/use-video-repo-methods.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/use-ai-generated-images.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/asset-with-folders-data-service.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/use-folder-path-tree.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/base/asset-window.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/base/assets-window-manager.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/base/assets-reducer-base.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/base/use-assets-service-base.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/use-basic-assets-services.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/use-edit-image-service.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/services/data-service-ex/use-video-task-poller.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/image-cropping-task-status-poller.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/video-task-status-poller.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/utils/with-asset-task-status-poller.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/date-added.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/search-box.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/asset-type.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/sort-by.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/asset-source.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/video-duration.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/import-source.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/video-duration-scrollbar.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/filter-toggle.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/date-added-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/context/filter-context.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/filter-bar-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/filter-toggle-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/asset-type-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/search-box-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/sort-by-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/asset-source-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/import-source-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/image-size-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/components/state/video-duration-state.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/filter-bar.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/context/filter-provider.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/filter-bar/performance-filter-components.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-path-breadcrumb/style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/folder-path-breadcrumb/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-library-page-content/styles/library-page-style.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/hidden-div-for-announce/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-library-page-content/sections-utils.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/ads-studio-library-page-content/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/confirm-dialog/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/generate-image/context/generate-image-context.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/generate-image/context/generate-image-context-provider.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/loading-indicator/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/example-image/example-prompt.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/example-image/example-image-list.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/example-image/example-image-cell.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/prompt-editor/prompt-editor.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/components/object-selection/index.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/hooks/use-upload-asset.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/hooks/use-validate-asset.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/hooks/use-customized-handler-options.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/hooks/use-upload-files.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/js-data/init-cc-js-data.js","../../../../ads-studio/packages/ads-studio-app-shared-components/src/js-data/with-cc-js-data-context-provider.js"],"sourcesContent":["export const videoIcon = \"data:image/svg+xml,%3Csvg width='14' height='12' viewBox='0 0 14 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 3C1 2.17157 1.67157 1.5 2.5 1.5H8.5C9.32843 1.5 10 2.17157 10 3V9C10 9.82843 9.32843 10.5 8.5 10.5H2.5C1.67157 10.5 1 9.82843 1 9V3ZM2.5 0.5C1.11929 0.5 0 1.61929 0 3V9C0 10.3807 1.11929 11.5 2.5 11.5H8.5C9.88071 11.5 11 10.3807 11 9V8.49943L12.7999 9.84997C13.2943 10.221 14 9.86819 14 9.25008V2.75496C14 2.13743 13.2954 1.78451 12.8009 2.15432L11 3.50093V3C11 1.61929 9.88071 0.5 8.5 0.5H2.5ZM11 4.74959L13 3.25407V8.74993L11 7.24921V4.74959Z' fill='white'/%3E%3C/svg%3E%0A\";\r\n","import React from 'react';\r\n\r\nexport const SparkeSVGIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M8.66438 15.7346C8.90871 15.9076 9.20094 16.0001 9.50032 15.999V15.995C9.7826 15.9956 10.0588 15.9133 10.2948 15.7583C10.5307 15.6033 10.7159 15.3824 10.8273 15.123L11.4403 13.259C11.5819 12.8367 11.8198 12.4532 12.1351 12.1387C12.4505 11.8242 12.8347 11.5874 13.2573 11.447L15.0353 10.869C15.3217 10.7684 15.5691 10.58 15.7422 10.3307C15.9154 10.0813 16.0055 9.78372 15.9997 9.48022C15.994 9.17671 15.8926 8.88274 15.7102 8.64015C15.5277 8.39756 15.2733 8.2187 14.9833 8.12901L13.2283 7.55901C12.8038 7.41775 12.418 7.17942 12.1018 6.86296C11.7855 6.5465 11.5473 6.16063 11.4063 5.73601L10.8283 3.95901C10.7275 3.67599 10.5411 3.43139 10.2949 3.2592C10.0486 3.08702 9.75492 2.9958 9.45449 2.99822C9.15406 3.00064 8.86184 3.09657 8.61844 3.2727C8.37504 3.44883 8.19255 3.6964 8.09632 3.98101L7.51332 5.77301C7.37273 6.18528 7.14037 6.56024 6.83376 6.86962C6.52715 7.179 6.1543 7.41472 5.74332 7.55901L3.96632 8.13001C3.75494 8.20394 3.56365 8.32601 3.40757 8.48659C3.25149 8.64716 3.1349 8.84184 3.067 9.05523C2.9991 9.26862 2.98176 9.49488 3.01636 9.71612C3.05095 9.93736 3.13652 10.1475 3.26632 10.33C3.44321 10.579 3.6941 10.7659 3.98332 10.864L5.73732 11.433C6.16295 11.5754 6.54951 11.8151 6.86632 12.133C6.95138 12.2174 7.03088 12.3073 7.10432 12.402C7.30349 12.6598 7.45735 12.9496 7.55932 13.259L8.13732 15.034C8.23579 15.3167 8.42004 15.5617 8.66438 15.7346ZM16.331 20.782C16.1405 20.6462 15.9971 20.4543 15.921 20.233L15.593 19.226C15.5292 19.0345 15.4221 18.8603 15.28 18.717C15.1375 18.5741 14.9635 18.4666 14.772 18.403L13.781 18.08C13.5506 18.0027 13.3507 17.8542 13.21 17.656C13.0727 17.4638 12.9993 17.2333 13 16.997C13.0003 16.7592 13.0748 16.5275 13.213 16.334C13.3503 16.1395 13.5456 15.9935 13.771 15.917L14.777 15.591C14.964 15.5246 15.1333 15.4163 15.272 15.2743C15.4107 15.1324 15.515 14.9605 15.577 14.772L15.901 13.78C15.9772 13.5558 16.1212 13.3608 16.3131 13.2219C16.505 13.0831 16.7352 13.0072 16.9721 13.0049C17.2089 13.0026 17.4406 13.074 17.6351 13.209C17.8297 13.3441 17.9774 13.5363 18.058 13.759L18.387 14.773C18.4514 14.9631 18.559 15.1357 18.7012 15.2773C18.8435 15.4188 19.0166 15.5255 19.207 15.589L20.199 15.912C20.4277 15.9835 20.628 16.1252 20.7717 16.317C20.9153 16.5088 20.9949 16.7409 20.9992 16.9804C21.0036 17.22 20.9324 17.4549 20.7957 17.6517C20.6591 17.8485 20.464 17.9973 20.238 18.077L19.224 18.406C19.0339 18.4708 18.8612 18.5782 18.719 18.72C18.5767 18.8628 18.4695 19.0367 18.406 19.228L18.084 20.217C18.0065 20.4473 17.8576 20.647 17.659 20.787C17.467 20.9251 17.2365 20.9992 17 20.999C16.7597 20.999 16.5256 20.923 16.331 20.782Z\" fill=\"url(#paint0_linear_1620_272407)\" />\r\n <defs>\r\n <linearGradient id=\"paint0_linear_1620_272407\" x1=\"2.99902\" y1=\"2.99817\" x2=\"20.9999\" y2=\"20.9986\" gradientUnits=\"userSpaceOnUse\">\r\n <stop stopColor=\"#3D07D5\" />\r\n <stop offset=\"0.450521\" stopColor=\"#213AD5\" />\r\n <stop offset=\"1\" stopColor=\"#0078D4\" />\r\n </linearGradient>\r\n </defs>\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const HollowSparkleSVGIcon = () => (\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"Sparkle\">\r\n <path id=\"Shape\" d=\"M8.66438 15.7345C8.90871 15.9075 9.20094 15.9999 9.50032 15.9989V15.9949C9.7826 15.9955 10.0588 15.9132 10.2948 15.7582C10.5307 15.6031 10.7159 15.3822 10.8273 15.1229L11.4403 13.2589C11.5819 12.8366 11.8198 12.4531 12.1351 12.1386C12.4505 11.8241 12.8347 11.5873 13.2573 11.4469L15.0353 10.8689C15.3217 10.7683 15.5691 10.5799 15.7422 10.3305C15.9154 10.0812 16.0055 9.7836 15.9997 9.48009C15.994 9.17659 15.8926 8.88262 15.7102 8.64003C15.5277 8.39744 15.2733 8.21858 14.9833 8.12889L13.2283 7.55889C12.8038 7.41763 12.418 7.1793 12.1018 6.86283C11.7855 6.54637 11.5473 6.1605 11.4063 5.73589L10.8283 3.95889C10.7275 3.67586 10.5411 3.43127 10.2949 3.25908C10.0486 3.0869 9.75492 2.99567 9.45449 2.99809C9.15406 3.00051 8.86184 3.09645 8.61844 3.27258C8.37504 3.44871 8.19255 3.69628 8.09632 3.98089L7.51332 5.77289C7.37273 6.18515 7.14037 6.56012 6.83376 6.8695C6.52715 7.17888 6.1543 7.4146 5.74332 7.55889L3.96632 8.12989C3.75494 8.20382 3.56365 8.32589 3.40757 8.48647C3.25149 8.64704 3.1349 8.84172 3.067 9.05511C2.9991 9.2685 2.98176 9.49475 3.01636 9.716C3.05095 9.93724 3.13652 10.1474 3.26632 10.3299C3.44321 10.5789 3.6941 10.7657 3.98332 10.8639L5.73732 11.4329C6.16295 11.5753 6.54951 11.815 6.86632 12.1329C6.95138 12.2173 7.03088 12.3072 7.10432 12.4019C7.30349 12.6597 7.45735 12.9495 7.55932 13.2589L8.13732 15.0339C8.23579 15.3166 8.42004 15.5615 8.66438 15.7345ZM8.29032 11.4849C8.17882 11.3392 8.05754 11.2012 7.92732 11.0719H7.93032C7.44744 10.5886 6.8585 10.2247 6.21032 10.0089L4.61032 9.50089L6.22132 8.97689C6.85885 8.75615 7.43708 8.39176 7.91132 7.91189C8.38349 7.42897 8.73949 6.84487 8.95232 6.20389L9.46732 4.62189L9.98332 6.20889C10.1987 6.85585 10.5623 7.44351 11.0452 7.92497C11.528 8.40643 12.1167 8.76837 12.7643 8.98189L14.3833 9.50389L12.7943 10.0189C12.1479 10.2338 11.5606 10.5965 11.079 11.0782C10.5975 11.56 10.2349 12.1474 10.0203 12.7939L9.50532 14.3759L8.99032 12.7909C8.83308 12.3189 8.59634 11.8772 8.29032 11.4849ZM16.331 20.7819C16.1405 20.6461 15.9971 20.4541 15.921 20.2329L15.593 19.2259C15.5292 19.0344 15.4221 18.8602 15.28 18.7169C15.1375 18.574 14.9635 18.4664 14.772 18.4029L13.781 18.0799C13.5506 18.0026 13.3507 17.8541 13.21 17.6559C13.0727 17.4636 12.9993 17.2331 13 16.9969C13.0003 16.7591 13.0748 16.5274 13.213 16.3339C13.3503 16.1394 13.5456 15.9934 13.771 15.9169L14.777 15.5909C14.964 15.5245 15.1333 15.4162 15.272 15.2742C15.4107 15.1322 15.515 14.9604 15.577 14.7719L15.901 13.7799C15.9772 13.5557 16.1212 13.3606 16.3131 13.2218C16.505 13.0829 16.7352 13.0071 16.9721 13.0048C17.2089 13.0025 17.4406 13.0738 17.6351 13.2089C17.8297 13.344 17.9774 13.5362 18.058 13.7589L18.387 14.7729C18.4514 14.963 18.559 15.1356 18.7012 15.2771C18.8435 15.4187 19.0166 15.5254 19.207 15.5889L20.199 15.9119C20.4277 15.9834 20.628 16.1251 20.7717 16.3169C20.9153 16.5086 20.9949 16.7408 20.9992 16.9803C21.0036 17.2199 20.9324 17.4547 20.7957 17.6516C20.6591 17.8484 20.464 17.9972 20.238 18.0769L19.224 18.4059C19.0339 18.4707 18.8612 18.5781 18.719 18.7199C18.5767 18.8627 18.4695 19.0366 18.406 19.2279L18.084 20.2169C18.0065 20.4472 17.8576 20.6469 17.659 20.7869C17.467 20.9249 17.2365 20.9991 17 20.9989C16.7597 20.9989 16.5256 20.9229 16.331 20.7819ZM15.3004 16.999C15.6934 17.1386 16.0501 17.3646 16.3442 17.6602C16.6384 17.956 16.8625 18.314 17 18.7079C17.1389 18.3158 17.3636 17.9597 17.6577 17.6656C17.9518 17.3715 18.3079 17.1468 18.7 17.0079C18.3016 16.8685 17.9396 16.6412 17.641 16.3429C17.3459 16.049 17.1207 15.6926 16.982 15.2999C16.8439 15.6898 16.6213 16.0444 16.3302 16.3383C16.0397 16.6316 15.6881 16.8572 15.3004 16.999Z\" />\r\n </g>\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const BlackSparkleSVGIcon = () => (\r\n <svg width=\"29\" height=\"29\" viewBox=\"0 0 29 29\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"Icon\">\r\n <path id=\"Shape\" d=\"M10.3246 16.6522C10.5509 16.8128 10.8217 16.8989 11.0992 16.8985C11.3777 16.8996 11.6495 16.8134 11.8764 16.652C12.1037 16.4842 12.2759 16.2525 12.3709 15.9864L12.874 14.4393C12.9962 14.0745 13.2011 13.743 13.4729 13.4707C13.7434 13.1996 14.0736 12.9955 14.4371 12.8747L16.0118 12.3629C16.2716 12.2702 16.4965 12.0996 16.6556 11.8742C16.8151 11.6489 16.9007 11.3796 16.9007 11.1036C16.9007 10.8275 16.8151 10.5582 16.6556 10.3329C16.4837 10.0931 16.2392 9.91516 15.9582 9.82539L14.4081 9.32369C14.0433 9.20319 13.7118 8.99911 13.4399 8.72772C13.168 8.45633 12.9633 8.12514 12.8421 7.76059L12.3303 6.18879C12.2385 5.92888 12.0683 5.70391 11.8431 5.54499C11.6156 5.38817 11.3458 5.3042 11.0695 5.3042C10.7932 5.3042 10.5234 5.38817 10.2959 5.54499C10.0643 5.70809 9.8906 5.94069 9.8 6.20909L9.28525 7.78959C9.16389 8.14349 8.96401 8.46533 8.70059 8.73101C8.43717 8.99668 8.11705 9.1993 7.7642 9.32369L6.1924 9.83264C5.92982 9.92544 5.70272 10.0978 5.54277 10.3258C5.38281 10.5538 5.29795 10.826 5.30002 11.1045C5.3021 11.383 5.391 11.6539 5.55434 11.8795C5.71768 12.105 5.94732 12.274 6.21125 12.3629L7.7584 12.866C8.12411 12.9885 8.45624 13.1946 8.72845 13.4678C8.80201 13.5406 8.87079 13.6181 8.93435 13.6998C9.10597 13.9212 9.23838 14.1703 9.32585 14.4364L9.83625 16.0024C9.92756 16.2645 10.0982 16.4916 10.3246 16.6522ZM17.6748 22.4839C17.872 22.6234 18.1075 22.6984 18.349 22.6985C18.588 22.6963 18.8204 22.6203 19.0146 22.481C19.2169 22.3382 19.3691 22.1352 19.4496 21.901L19.8092 20.7961C19.8863 20.5664 20.0153 20.3575 20.1862 20.1856C20.3564 20.0138 20.5652 19.885 20.7952 19.8101L21.9146 19.4447C22.1433 19.3657 22.3415 19.2171 22.4815 19.0198C22.5879 18.8705 22.6574 18.698 22.6842 18.5166C22.711 18.3352 22.6945 18.1501 22.6359 17.9763C22.5773 17.8026 22.4784 17.6452 22.3472 17.517C22.216 17.3889 22.0563 17.2937 21.8812 17.2392L20.7734 16.8782C20.5441 16.802 20.3357 16.6735 20.1646 16.5029C19.9935 16.3322 19.8644 16.1242 19.7874 15.8951L19.422 14.7728C19.3433 14.5448 19.1946 14.3474 18.9972 14.2087C18.8493 14.103 18.6785 14.0335 18.4988 14.0058C18.319 13.9782 18.1353 13.9932 17.9624 14.0496C17.7895 14.1061 17.6324 14.2024 17.5036 14.3308C17.3748 14.4592 17.278 14.616 17.221 14.7887L16.8628 15.8936C16.787 16.1222 16.66 16.3305 16.4916 16.5026C16.3255 16.6712 16.1232 16.7996 15.9 16.8782L14.7748 17.245C14.6045 17.3043 14.4503 17.4024 14.3245 17.5316C14.1987 17.6608 14.1048 17.8176 14.0502 17.9894C13.9956 18.1613 13.9818 18.3435 14.0099 18.5216C14.038 18.6997 14.1073 18.8688 14.2122 19.0155C14.3546 19.2182 14.5577 19.3706 14.7922 19.4505L15.8986 19.8086C16.1289 19.8861 16.3383 20.0156 16.5104 20.1871C16.6819 20.3585 16.8101 20.5683 16.8846 20.799L17.2514 21.9213C17.3308 22.1482 17.4788 22.3448 17.6748 22.4839Z\" fill=\"#242424\" />\r\n </g>\r\n </svg>\r\n);\r\n","import React from 'react';\r\n\r\nexport const InfoSparkleSVGIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.226 1.35305L14.8777 0.282251C14.8486 0.19972 14.7946 0.128252 14.7231 0.0776997C14.6516 0.0271473 14.5662 0 14.4786 0C14.391 0 14.3056 0.0271473 14.2341 0.0776997C14.1626 0.128252 14.1085 0.19972 14.0794 0.282251L13.7311 1.35305C13.625 1.67631 13.4454 1.97065 13.2066 2.21307C12.9677 2.45549 12.6759 2.63941 12.3541 2.75044L11.2825 3.09845C11.1999 3.12757 11.1284 3.18157 11.0778 3.25301C11.0272 3.32445 11 3.40981 11 3.49733C11 3.58484 11.0272 3.6702 11.0778 3.74164C11.1284 3.81308 11.1999 3.86708 11.2825 3.8962L12.3541 4.24421C12.6292 4.33588 12.883 4.48064 13.1014 4.66973C13.1421 4.70496 13.1815 4.74173 13.2197 4.77999C13.4202 4.98116 13.5796 5.21872 13.6897 5.47932C13.7128 5.53422 13.7338 5.59014 13.7525 5.64696L14.1008 6.71775C14.1271 6.79215 14.1736 6.85755 14.2349 6.90675C14.2416 6.91213 14.2484 6.91732 14.2555 6.92231C14.327 6.97286 14.4124 7.00001 14.5 7.00001C14.5876 7.00001 14.673 6.97286 14.7445 6.92231C14.816 6.87175 14.87 6.80029 14.8992 6.71775L15.2475 5.64696C15.3558 5.32141 15.5385 5.0256 15.7813 4.78302C16.0241 4.54044 16.3201 4.35778 16.6459 4.24956L17.7175 3.90155C17.8001 3.87244 17.8716 3.81844 17.9222 3.747C17.9728 3.67556 18 3.5902 18 3.50268C18 3.41516 17.9728 3.3298 17.9222 3.25836C17.8716 3.18692 17.8001 3.13292 17.7175 3.10381L17.6961 3.09845L16.6245 2.75044C16.2987 2.64223 16.0026 2.45957 15.7599 2.21699C15.5171 1.97441 15.3343 1.67859 15.226 1.35305Z\" fill=\"#212121\" />\r\n <path d=\"M19.0175 7.96461L19.7829 8.21319L19.7982 8.21701C19.8572 8.23781 19.9083 8.27638 19.9445 8.32741C19.9806 8.37844 20 8.43941 20 8.50192C20 8.56443 19.9806 8.62541 19.9445 8.67643C19.9083 8.72746 19.8572 8.76603 19.7982 8.78683L19.0328 9.03541C18.8001 9.11271 18.5886 9.24317 18.4152 9.41645C18.2418 9.58972 18.1113 9.80101 18.0339 10.0335L17.7851 10.7984C17.7643 10.8574 17.7257 10.9084 17.6746 10.9445C17.6236 10.9806 17.5626 11 17.5 11C17.4374 11 17.3764 10.9806 17.3254 10.9445C17.2743 10.9084 17.2357 10.8574 17.2149 10.7984L17.2141 10.796L16.9661 10.0335C16.8893 9.80031 16.7589 9.58824 16.5855 9.41428C16.412 9.24032 16.2003 9.10926 15.9672 9.03158L15.2018 8.78301C15.1428 8.76221 15.0917 8.72364 15.0555 8.67261C15.0194 8.62158 15 8.56061 15 8.4981C15 8.43558 15.0194 8.37461 15.0555 8.32358C15.0917 8.27255 15.1428 8.23398 15.2018 8.21319L15.9672 7.96461C16.1971 7.8853 16.4055 7.75392 16.5761 7.58077C16.7467 7.40762 16.875 7.19737 16.9508 6.96647L17.1996 6.20161C17.2204 6.14266 17.259 6.09161 17.31 6.05551C17.3611 6.0194 17.4221 6.00001 17.4847 6.00001C17.5473 6.00001 17.6083 6.0194 17.6593 6.05551C17.7104 6.09161 17.749 6.14266 17.7698 6.20161L18.0186 6.96647C18.0959 7.199 18.2265 7.4103 18.3999 7.58357C18.5733 7.75684 18.7848 7.88731 19.0175 7.96461Z\" fill=\"#212121\" />\r\n <path d=\"M16.7727 11.776C16.9319 11.8844 17.1132 11.956 17.3036 11.9858C17.4534 12.0092 17.6058 12.0061 17.7538 11.9771C16.8737 15.4392 13.7359 18 10 18C5.58172 18 2 14.4183 2 10C2 5.58172 5.58172 2 10 2C10.3963 2 10.7859 2.02882 11.1668 2.08448L10.9741 2.147C10.687 2.24346 10.4377 2.42828 10.2621 2.675C10.1905 2.77592 10.1327 2.88541 10.0897 3.00056C10.0598 3.00019 10.0299 3 10 3C6.13401 3 3 6.13401 3 10C3 13.866 6.13401 17 10 17C13.2523 17 15.9866 14.782 16.7727 11.776Z\" fill=\"#212121\" />\r\n <path d=\"M10.5841 9.21136C10.5841 8.88877 10.3226 8.62727 9.99999 8.62727C9.67741 8.62727 9.4159 8.88877 9.4159 9.21136V13.8841C9.4159 14.2067 9.67741 14.4682 9.99999 14.4682C10.3226 14.4682 10.5841 14.2067 10.5841 13.8841V9.21136Z\" fill=\"#212121\" />\r\n <path d=\"M10.875 6.87502C10.875 7.35827 10.4832 7.75003 10 7.75003C9.51675 7.75003 9.125 7.35827 9.125 6.87502C9.125 6.39176 9.51675 6 10 6C10.4832 6 10.875 6.39176 10.875 6.87502Z\" fill=\"#212121\" />\r\n </svg>\r\n);\r\n","import React from 'react';\r\nimport squareDismissImage from './squareDismiss.svg';\r\n\r\nexport const SquareDismissIcon = ({ i18n }) => (<img\r\n src={squareDismissImage}\r\n alt={i18n.getString(_TL_('Square Dismiss Icon'))}\r\n width=\"20\"\r\n height=\"20\"\r\n/>);\r\n","import React from 'react';\r\nimport spinnerBase from './spinnerBase.svg';\r\n\r\nexport const SpinnerIcon = ({ i18n }) => (<img\r\n src={spinnerBase}\r\n alt={i18n.getString(_TL_('spinner'))}\r\n className=\"spinner-icon\"\r\n/>);\r\n","import CreateSVGIcon from './ad-studio-create-icon.svg';\r\nimport UploadSVGIcon from './ad-studio-upload-icon.svg';\r\nimport StockSVGIcon from './ad-studio-stock-icon.svg';\r\nimport InvestSVGIcon from './ad-studio-invest-icon.svg';\r\nimport PdfSVGIcon from './ad-studio-pdf-icon.svg';\r\nimport WarningSVGIcon from './ad-studio-warning-icon.svg';\r\nimport CreateManualBrandKitSVGIcon from './ad-studio-create-manual-icon.svg';\r\nimport WebsiteSVGIcon from './ad-studio-website-icon.svg';\r\nimport ImageEmptyViewSVG from './image-page-empty-view-image.svg';\r\nimport LibraryEmptyViewSVG from './library-page-empty-view-image.svg';\r\nimport VideoEmptyViewSVG from './video-page-empty-view-image.svg';\r\nimport AIWarningIconSource from './AIWarningIcon.png';\r\nimport ChooseImageSVG from './choose-image-icon.svg';\r\nimport LogoAssetsSvg from './logo-assets.svg';\r\nimport BrandKitLogoIconSVG from './ad-studio-brandkit-logo-icon.svg';\r\n\r\nexport const EntryCardSVGIcons = {\r\n CreateSVGIcon,\r\n UploadSVGIcon,\r\n StockSVGIcon,\r\n InvestSVGIcon,\r\n PdfSVGIcon,\r\n WebsiteSVGIcon,\r\n WarningSVGIcon,\r\n CreateManualBrandKitSVGIcon,\r\n BrandKitLogoIconSVG,\r\n};\r\n\r\nexport { videoIcon } from './video-icon';\r\nexport { SparkeSVGIcon } from './sparkle-svg-icon';\r\nexport { HollowSparkleSVGIcon } from './hollow-sparkle-svg-icon';\r\nexport { BlackSparkleSVGIcon } from './black-sparkle-svg-icon';\r\nexport { InfoSparkleSVGIcon } from './info-sparkle-svg-icon';\r\nexport { SquareDismissIcon } from './squareDismiss-svg-icon';\r\nexport { SpinnerIcon } from './spinnerBase-svg-icon';\r\n\r\n\r\nexport const AIWarningIcon = AIWarningIconSource;\r\nexport const ChooseImageIcon = ChooseImageSVG;\r\nexport const LogoAssetsIcon = LogoAssetsSvg;\r\n\r\nexport const EmptyViewIcons = {\r\n ImageEmptyViewSVG,\r\n LibraryEmptyViewSVG,\r\n VideoEmptyViewSVG,\r\n};\r\n","export { allowedVideoFileExtensions as supportedVideoExtensions } from '@bingads-webui-campaign-react/upload-file-picker';\r\n\r\nexport const CSMLAdTypeUsage = {\r\n UsedIn: 'Used in',\r\n NotUsedIn: 'Not used in',\r\n};\r\n\r\nexport const CSMLAdType = {\r\n MMA: 'Multimedia ad',\r\n Audience: 'Microsoft Advertising Network',\r\n ImageExtension: 'Image extension',\r\n PMax: 'Performance max',\r\n};\r\n\r\nexport const CSMLSortIcon = {\r\n SortUp: 'SortUp',\r\n SortDown: 'SortDown',\r\n};\r\n\r\nexport const CSMLSortBy = {\r\n ImageName: 'Image name',\r\n ImageNameDesc: 'Image name (Z-A)',\r\n MostRecent: 'Most recent',\r\n MostRecentAsc: 'Most recent asc',\r\n LastCreated: 'Last created',\r\n LastCreatedAsc: 'Last created asc',\r\n TopRated: 'Top rated',\r\n\r\n AssetIdAsc: 'Asset Id Asc',\r\n AssetIdDesc: 'Asset Id Desc',\r\n\r\n ClickAsc: 'Click Asc',\r\n ClickDesc: 'Click Desc',\r\n ClickPeriodAsc: 'Period Click Asc',\r\n ClickPeriodDesc: 'Period Click Desc',\r\n ClickChangeAsc: 'Click Change Asc',\r\n ClickChangeDesc: 'Click Change Desc',\r\n ClickChangePercentAsc: 'Click Change Percent Asc',\r\n ClickChangePercentDesc: 'Click Change Percent Desc',\r\n\r\n CTRAsc: 'CTR Asc',\r\n CTRDesc: 'CTR Desc',\r\n CTRPeriodAsc: 'Period CTR Asc',\r\n CTRPeriodDesc: 'Period CTR Desc',\r\n CTRChangeAsc: 'CTR Change Asc',\r\n CTRChangeDesc: 'CTR Change Desc',\r\n CTRChangePercentAsc: 'CTR Change Percent Asc',\r\n CTRChangePercentDesc: 'CTR Change Percent Desc',\r\n\r\n ImpressionAsc: 'Impression Asc',\r\n ImpressionDesc: 'Impression Desc',\r\n ImpressionPeriodAsc: 'Period Impression Asc',\r\n ImpressionPeriodDesc: 'Period Impression Desc',\r\n ImpressionChangeAsc: 'Impression Change Asc',\r\n ImpressionChangeDesc: 'Impression Change Desc',\r\n ImpressionChangePercentAsc: 'Impression Change Percent Asc',\r\n ImpressionChangePercentDesc: 'Impression Change Percent Desc',\r\n\r\n SpendAsc: 'Spend Asc',\r\n SpendDesc: 'Spend Desc',\r\n SpendPeriodAsc: 'Period Spend Asc',\r\n SpendPeriodDesc: 'Period Spend Desc',\r\n SpendChangeAsc: 'Spend Change Asc',\r\n SpendChangeDesc: 'Spend Change Desc',\r\n SpendChangePercentAsc: 'Spend Change Percent Asc',\r\n SpendChangePercentDesc: 'Spend Change Percent Desc',\r\n};\r\n\r\nexport const CSMLVideoDuration = {\r\n min: 0,\r\n max: 120,\r\n unlimited: 121, // max + 1\r\n};\r\n\r\nexport const CSMLTimeFrame = {\r\n Anytime: 'Anytime',\r\n Today: 'Today',\r\n Last7Days: 'Last 7 days',\r\n Last30Days: 'Last 30 days',\r\n Custom: 'Custom range',\r\n};\r\n\r\nexport const CSMLImportSource = {\r\n Google: 'Google',\r\n Facebook: 'Facebook',\r\n};\r\n\r\nexport const CSMLAssetSource = {\r\n UserUploaded: 'UserUploaded',\r\n AIGenerated: 'AIGenerated',\r\n Website: 'WebsiteImported',\r\n Shutterstock: 'ShutterStock',\r\n Facebook: 'FacebookImported',\r\n Google: 'GoogleImported',\r\n BackgroundChangeGenerated: 'BackgroundChangeGenerated',\r\n AIGeneratedByRecraft: 'AIGeneratedByRecraft',\r\n};\r\n\r\nexport const ManualAddedImageSource = {\r\n Library: 'Library',\r\n ShutterStock: 'ShutterStock',\r\n};\r\n\r\nexport const AIModelSource = {\r\n Dalle: 'Dalle',\r\n Recraft: 'Recraft',\r\n};\r\n\r\nexport const DEFAULT_PAGE_SIZE = 20;\r\n\r\nexport const MIN_SIZE = [\r\n 703, // width\r\n 368, // height\r\n];\r\n\r\nexport const UPSCALE_MIN_SIZE = [ // half of MIN_SIZE\r\n 352, // width\r\n 184, // height\r\n];\r\n\r\nexport const ClarityTags = {\r\n LaunchedAdsStudio: 'LaunchedAdsStudio',\r\n LaunchedAddImageAssetsFromAdsStudio: 'LaunchedAddImageAssetsFromAdsStudio',\r\n DisplayTemplateHomePage: 'DisplayTemplateHomePage',\r\n EditDisplayTemplateImage: 'EditDisplayTemplateImage',\r\n CreateDisplayTemplate: 'CreateDisplayTemplate',\r\n BrandKitPage: 'BrandKitPage',\r\n EditBrandKitImage: 'EditBrandKitImage',\r\n EditBrandKitLogo: 'EditBrandKitLogo',\r\n};\r\n\r\nexport const CROP_BOX_MAX_SIZE = {\r\n width: 416,\r\n height: 300,\r\n};\r\n\r\nexport const CSMLAdTypeAbbr = {\r\n [CSMLAdType.MMA]: 'MultiMediaAd',\r\n [CSMLAdType.Audience]: 'MSAN',\r\n [CSMLAdType.ImageExtension]: 'ImageExtension',\r\n};\r\n\r\nexport const ROOT_FOLDER_ID = 'ROOT';\r\n\r\nexport const FolderAssetType = {\r\n Image: 'Image',\r\n Video: 'Video',\r\n All: 'All',\r\n Folder: 'Folder',\r\n};\r\n\r\nexport const RootFolderName = {\r\n [FolderAssetType.Image]: _TL_('Images'),\r\n [FolderAssetType.Video]: _TL_('Videos'),\r\n};\r\n\r\nexport const isRootFolderId = folderIdToTest => folderIdToTest === ROOT_FOLDER_ID;\r\n\r\nexport const supportedImageExtensions = ['.png', '.jpg', '.jpeg', '.gif'];\r\n\r\nexport const GridSectionName = {\r\n Folder: 'folderSection',\r\n Asset: 'assetsSection',\r\n};\r\n\r\nexport const MaxAddAssetJobInParell = 6;\r\n\r\n// export const AdsStudioAppNameODataHeader = {\r\n// key: 'x-ms-applicationname',\r\n// value: 'bingadsweb-assetlibrary',\r\n// };\r\n\r\nexport const CSMLSearchLocation = {\r\n Current: 'Current',\r\n Global: 'Global',\r\n};\r\n\r\nexport const VideoStatus = {\r\n Unverified: 'Unverified',\r\n Draft: 'Draft',\r\n Active: 'Active',\r\n Failed: 'Failed',\r\n};\r\n\r\nexport const AdsStudioPageName = {\r\n LibraryPage: 'LibraryPage',\r\n PerfPage: 'PerfPage',\r\n WebsiteImagePanelPage: 'WebsiteImagePanelPage',\r\n StockImagePanelPage: 'StockImagePanelPage',\r\n AddVideoPanelPage: 'AddVideoPanelPage',\r\n UploadFilesPanelPage: 'UploadFilesPanelPage',\r\n UploadFolderPanelPage: 'UploadFolderPanelPage',\r\n MixedImagePanelPage: 'MixedImagePanelPage',\r\n MixedVideoPanelPage: 'MixedVideoPanelPage',\r\n EditImagePage: 'EditImagePage',\r\n AssetDetailsPage: 'AssetDetailsPage',\r\n BackgroundRemovalModalPage: 'BackgroundRemovalModalPage',\r\n InvestImagePanelPage: 'InvestImagePanelPage',\r\n InvestVideoPanelPage: 'InvestVideoPanelPage',\r\n};\r\n\r\nconst UPLOAD = 'Upload';\r\nconst STOCK_IMAGES = 'StockImages';\r\nconst WEBSITE_IMAGES = 'WebsiteImages';\r\nconst AI_IMAGES = 'AiImages';\r\nconst SOCIAL_MEDIA = 'SocialMedia';\r\n\r\nexport const AddImagePivotKey = {\r\n UPLOAD,\r\n STOCK_IMAGES,\r\n WEBSITE_IMAGES,\r\n AI_IMAGES,\r\n SOCIAL_MEDIA,\r\n};\r\n\r\nexport const AdditionalQueries = {\r\n Query: 'query',\r\n FolderId: 'folderId',\r\n EditImageUrl: 'editImageUrl',\r\n InitialCurrentView: 'initialCurrentView',\r\n TemplateId: 'templateId',\r\n TemplateGroupId: 'templateGroupId',\r\n};\r\n\r\nexport const AdStudioSurveyTriggerFlag = {\r\n App: 'AdsStudioAppSurveyTrigger',\r\n};\r\n\r\nexport const RealUsedFlagSuffix = {\r\n App: 'AdsStudioApp',\r\n};\r\n","\r\nexport const FilterType = {\r\n SearchText: 'SearchText',\r\n AssetType: 'AssetType',\r\n ImageSize: 'ImageSize',\r\n VideoDuration: 'VideoDuration',\r\n DateAdded: 'DateAdded',\r\n ImportSource: 'ImportSource',\r\n AssetSource: 'AssetSource',\r\n};\r\n\r\nconst SearchTextFilter = {\r\n type: FilterType.SearchText,\r\n title: _TL_('Search by asset name or ID'),\r\n};\r\n\r\nconst AssetTypeFilter = {\r\n type: FilterType.AssetType,\r\n title: _TL_('Asset type'),\r\n};\r\n\r\nconst DateAddedFilter = {\r\n type: FilterType.DateAdded,\r\n title: _TL_('Date added'),\r\n};\r\n\r\nconst ImageSizeFilter = {\r\n type: FilterType.ImageSize,\r\n title: _TL_('Image size'),\r\n};\r\n\r\nconst ImportSourceFilter = {\r\n type: FilterType.ImportSource,\r\n title: _TL_('Import source'),\r\n};\r\n\r\nconst AssetSourceFilter = {\r\n type: FilterType.AssetSource,\r\n title: _TL_('Source'),\r\n};\r\n\r\n\r\nconst VideoDurationFilter = {\r\n type: FilterType.VideoDuration,\r\n title: _TL_('Video duration'),\r\n};\r\n\r\n\r\nexport const AllSupportedFilters = {\r\n [FilterType.SearchText]: SearchTextFilter,\r\n [FilterType.AssetType]: AssetTypeFilter,\r\n [FilterType.DateAdded]: DateAddedFilter,\r\n [FilterType.ImageSize]: ImageSizeFilter,\r\n [FilterType.ImportSource]: ImportSourceFilter,\r\n [FilterType.AssetSource]: AssetSourceFilter,\r\n [FilterType.VideoDuration]: VideoDurationFilter,\r\n};\r\n","import { FolderAssetType } from './constants';\r\n\r\nexport const getAssetTypeOptions = i18n => [\r\n {\r\n key: FolderAssetType.All,\r\n text: i18n.getString(_TL_('All')),\r\n title: i18n.getString(_TL_('All')),\r\n },\r\n {\r\n key: FolderAssetType.Image,\r\n text: i18n.getString(_TL_('Image')),\r\n title: i18n.getString(_TL_('Image')),\r\n },\r\n {\r\n key: FolderAssetType.Video,\r\n text: i18n.getString(_TL_('Video')),\r\n title: i18n.getString(_TL_('Video')),\r\n },\r\n];\r\n","import _ from 'underscore';\r\n\r\nconst MAX_DAYS = 7;\r\n\r\n// timestamp: Date\r\nexport function getTimeDescription(timestamp, i18n) {\r\n if (_.isDate(timestamp)) {\r\n const now = new Date();\r\n\r\n const diffInSec = Math.round((now - timestamp) / 1000);\r\n if (diffInSec < 0) {\r\n // in case something is wrong\r\n return null;\r\n } else if (diffInSec === 0) {\r\n return i18n.getString(_TL_('just now'));\r\n } else if (diffInSec === 1) {\r\n return i18n.getString(_TL_('1 second ago'));\r\n } else if (diffInSec < 60) {\r\n return i18n.getString(_TL_('{{seconds}} seconds ago'), { seconds: diffInSec });\r\n }\r\n\r\n const diffInMin = Math.round(diffInSec / 60);\r\n if (diffInMin === 1) {\r\n return i18n.getString(_TL_('1 minute ago'));\r\n } else if (diffInMin < 60) {\r\n return i18n.getString(_TL_('{{minutes}} minutes ago'), { minutes: diffInMin });\r\n }\r\n\r\n const diffInHour = Math.round(diffInMin / 60);\r\n if (diffInHour === 1) {\r\n return i18n.getString(_TL_('1 hour ago'));\r\n } else if (diffInHour < 24) {\r\n return i18n.getString(_TL_('{{hours}} hours ago'), { hours: diffInHour });\r\n }\r\n\r\n const diffInDay = Math.round(diffInHour / 24);\r\n if (diffInDay === 1) {\r\n return i18n.getString(_TL_('1 day ago'));\r\n } else if (diffInDay <= MAX_DAYS) {\r\n return i18n.getString(_TL_('{{days}} days ago'), { days: diffInDay });\r\n }\r\n }\r\n\r\n // no description for timestamp > 30 days ago\r\n return null;\r\n}\r\n","export const convertTimeDuration = (DurationInMS) => {\r\n const hours = Math.floor(DurationInMS / 3600000);\r\n const minutes = Math.floor((DurationInMS % 3600000) / 60000);\r\n const seconds = Math.floor((DurationInMS % 60000) / 1000);\r\n const timeArr = [];\r\n if (hours > 0) {\r\n timeArr.push(`${hours < 10 ? '0' : ''}${hours}`);\r\n }\r\n timeArr.push(`${minutes < 10 ? '0' : ''}${minutes}`);\r\n timeArr.push(`${seconds < 10 ? '0' : ''}${seconds}`);\r\n return timeArr.join(':');\r\n};\r\n","import { CivilDate } from 'tc39-proposal-temporal';\r\n// import { getCivilDateToday } from '@bingads-webui-universal/temporal-utitlities';\r\nimport { CSMLTimeFrame } from './constants';\r\n\r\nexport const getDateAddedChoiceOptions = (i18n, timeZone) => {\r\n // const yesterday = getCivilDateToday().plus({ days: -1 });\r\n const todayObj = i18n.getToday({ timeZone });\r\n const today = new CivilDate(todayObj.year, todayObj.month, todayObj.day);\r\n const last7day = today.plus({ days: -6 });\r\n const last30day = today.plus({ days: -29 });\r\n return [\r\n { key: CSMLTimeFrame.Today, text: i18n.getString(_TL_('Today')), range: { start: today, end: today } },\r\n { key: CSMLTimeFrame.Last7Days, text: i18n.getString(_TL_('Last 7 days')), range: { start: last7day, end: today } },\r\n { key: CSMLTimeFrame.Last30Days, text: i18n.getString(_TL_('Last 30 days')), range: { start: last30day, end: today } },\r\n { key: CSMLTimeFrame.Custom, text: i18n.getString(_TL_('Custom range')), range: null },\r\n ];\r\n};\r\n","import { CSMLImportSource } from './constants';\r\n\r\nexport const getImportSourceOptions = i18n => [\r\n {\r\n key: CSMLImportSource.Google,\r\n text: i18n.getString(_TL_('Google Ads')),\r\n title: i18n.getString(_TL_('Imported from Google Ads')),\r\n },\r\n {\r\n key: CSMLImportSource.Facebook,\r\n text: i18n.getString(_TL_('Meta Ads')),\r\n title: i18n.getString(_TL_('Imported from Meta Ads')),\r\n },\r\n];\r\n","import { CSMLSortBy, CSMLSortIcon } from './constants';\r\n\r\nexport const getSortingOptions = i18n => [\r\n { key: CSMLSortBy.MostRecent, text: i18n.getString(_TL_('Most recent')) },\r\n { key: CSMLSortBy.ImageName, text: i18n.getString(_TL_('Sort by name')), icon: CSMLSortIcon.SortUp },\r\n { key: CSMLSortBy.ImageNameDesc, text: i18n.getString(_TL_('Sort by name')), icon: CSMLSortIcon.SortDown },\r\n { key: CSMLSortBy.LastCreated, text: i18n.getString(_TL_('Last created')) },\r\n];\r\n\r\nexport const CSMLSortingRequestParams = {\r\n [CSMLSortBy.MostRecentAsc]: { sortBy: 'ModifiedTime', sortDirection: 'asc' },\r\n [CSMLSortBy.MostRecent]: { sortBy: 'ModifiedTime', sortDirection: 'desc' },\r\n\r\n [CSMLSortBy.ImageName]: { sortBy: 'Text', sortDirection: 'asc' },\r\n [CSMLSortBy.ImageNameDesc]: { sortBy: 'Text', sortDirection: 'desc' },\r\n [CSMLSortBy.LastCreated]: { sortBy: 'CreatedTime', sortDirection: 'desc' },\r\n [CSMLSortBy.LastCreatedAsc]: { sortBy: 'CreatedTime', sortDirection: 'asc' },\r\n\r\n [CSMLSortBy.AssetIdAsc]: { sortBy: 'AssetId', sortDirection: 'asc' },\r\n [CSMLSortBy.AssetIdDesc]: { sortBy: 'AssetId', sortDirection: 'desc' },\r\n\r\n [CSMLSortBy.ClickAsc]: { sortBy: 'PerformanceMetrics/Clicks', sortDirection: 'asc' },\r\n [CSMLSortBy.ClickDesc]: { sortBy: 'PerformanceMetrics/Clicks', sortDirection: 'desc' },\r\n [CSMLSortBy.ClickPeriodAsc]: { sortBy: 'PoPPerformanceMetrics/Clicks', sortDirection: 'asc' },\r\n [CSMLSortBy.ClickPeriodDesc]: { sortBy: 'PoPPerformanceMetrics/Clicks', sortDirection: 'desc' },\r\n [CSMLSortBy.ClickChangeAsc]: { sortBy: 'PoPPerformanceMetricsChange/Clicks', sortDirection: 'asc' },\r\n [CSMLSortBy.ClickChangeDesc]: { sortBy: 'PoPPerformanceMetricsChange/Clicks', sortDirection: 'desc' },\r\n [CSMLSortBy.ClickChangePercentAsc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Clicks', sortDirection: 'asc' },\r\n [CSMLSortBy.ClickChangePercentDesc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Clicks', sortDirection: 'desc' },\r\n\r\n [CSMLSortBy.CTRAsc]: { sortBy: 'PerformanceMetrics/CTR', sortDirection: 'asc' },\r\n [CSMLSortBy.CTRDesc]: { sortBy: 'PerformanceMetrics/CTR', sortDirection: 'desc' },\r\n [CSMLSortBy.CTRPeriodAsc]: { sortBy: 'PoPPerformanceMetrics/CTR', sortDirection: 'asc' },\r\n [CSMLSortBy.CTRPeriodDesc]: { sortBy: 'PoPPerformanceMetrics/CTR', sortDirection: 'desc' },\r\n [CSMLSortBy.CTRChangeAsc]: { sortBy: 'PoPPerformanceMetricsChange/CTR', sortDirection: 'asc' },\r\n [CSMLSortBy.CTRChangeDesc]: { sortBy: 'PoPPerformanceMetricsChange/CTR', sortDirection: 'desc' },\r\n [CSMLSortBy.CTRChangePercentAsc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/CTR', sortDirection: 'asc' },\r\n [CSMLSortBy.CTRChangePercentDesc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/CTR', sortDirection: 'desc' },\r\n\r\n [CSMLSortBy.ImpressionAsc]: { sortBy: 'PerformanceMetrics/Impressions', sortDirection: 'asc' },\r\n [CSMLSortBy.ImpressionDesc]: { sortBy: 'PerformanceMetrics/Impressions', sortDirection: 'desc' },\r\n [CSMLSortBy.ImpressionPeriodAsc]: { sortBy: 'PoPPerformanceMetrics/Impressions', sortDirection: 'asc' },\r\n [CSMLSortBy.ImpressionPeriodDesc]: { sortBy: 'PoPPerformanceMetrics/Impressions', sortDirection: 'desc' },\r\n [CSMLSortBy.ImpressionChangeAsc]: { sortBy: 'PoPPerformanceMetricsChange/Impressions', sortDirection: 'asc' },\r\n [CSMLSortBy.ImpressionChangeDesc]: { sortBy: 'PoPPerformanceMetricsChange/Impressions', sortDirection: 'desc' },\r\n [CSMLSortBy.ImpressionChangePercentAsc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Impressions', sortDirection: 'asc' },\r\n [CSMLSortBy.ImpressionChangePercentDesc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Impressions', sortDirection: 'desc' },\r\n\r\n [CSMLSortBy.SpendAsc]: { sortBy: 'PerformanceMetrics/Spend', sortDirection: 'asc' },\r\n [CSMLSortBy.SpendDesc]: { sortBy: 'PerformanceMetrics/Spend', sortDirection: 'desc' },\r\n [CSMLSortBy.SpendPeriodAsc]: { sortBy: 'PoPPerformanceMetrics/Spend', sortDirection: 'asc' },\r\n [CSMLSortBy.SpendPeriodDesc]: { sortBy: 'PoPPerformanceMetrics/Spend', sortDirection: 'desc' },\r\n [CSMLSortBy.SpendChangeAsc]: { sortBy: 'PoPPerformanceMetricsChange/Spend', sortDirection: 'asc' },\r\n [CSMLSortBy.SpendChangeDesc]: { sortBy: 'PoPPerformanceMetricsChange/Spend', sortDirection: 'desc' },\r\n [CSMLSortBy.SpendChangePercentAsc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Spend', sortDirection: 'asc' },\r\n [CSMLSortBy.SpendChangePercentDesc]: { sortBy: 'PoPPerformanceMetricsChangePercentage/Spend', sortDirection: 'desc' },\r\n};\r\n","import { CSMLAssetSource } from './constants';\r\n\r\nexport const getAssetSourceOptions = i18n => [\r\n {\r\n key: CSMLAssetSource.AIGenerated,\r\n text: i18n.getString(_TL_('Created')),\r\n title: i18n.getString(_TL_('Created with Microsoft Advertising')),\r\n },\r\n {\r\n key: CSMLAssetSource.UserUploaded,\r\n text: i18n.getString(_TL_('Upload')),\r\n title: i18n.getString(_TL_('Uploaded from computer')),\r\n },\r\n {\r\n key: CSMLAssetSource.Website,\r\n text: i18n.getString(_TL_('Website')),\r\n title: i18n.getString(_TL_('Advertiser website')),\r\n },\r\n {\r\n key: CSMLAssetSource.Shutterstock,\r\n text: i18n.getString(_TL_('Shutterstock')),\r\n title: i18n.getString(_TL_('Shutterstock')),\r\n },\r\n {\r\n key: CSMLAssetSource.Google,\r\n text: i18n.getString(_TL_('Imported')),\r\n title: i18n.getString(_TL_('Imported from Google Ads')),\r\n },\r\n {\r\n key: CSMLAssetSource.Facebook,\r\n text: i18n.getString(_TL_('Imported')),\r\n title: i18n.getString(_TL_('Imported from Meta Ads')),\r\n },\r\n];\r\n","/* eslint-disable max-len */\r\nimport _ from 'underscore';\r\nimport { constants as C } from '@bingads-webui-campaign-react/image-experience-model';\r\nimport {\r\n // UAPPlacementType as EPlacementType,\r\n UAPPlacementTypeAlias as PT,\r\n} from '@bingads-webui-campaign-react/unified-ad-preview-library-core';\r\n\r\nimport { CSMLAdTypeAbbr, CSMLAdType } from './constants';\r\n\r\n// eslint-disable-next-line prefer-destructuring\r\nconst imageAdExtSettings = C.imageAdExtSettings;\r\n\r\nexport const getPlacementConfig = () => ({\r\n // MMA\r\n [PT.MMA.LandscapeImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('Landscape image'),\r\n },\r\n [PT.MMA.WideImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '4 : 1',\r\n previewTypeString: _TL_('Wide image'),\r\n },\r\n [PT.MMA.SquareImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('Square image'),\r\n },\r\n [PT.MMA.VerticalImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 2',\r\n previewTypeString: _TL_('Vertical image'),\r\n },\r\n\r\n // MMA in MSAN (Audience Network)\r\n [PT.MSAN.WideImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.MSAN.SquareImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('MSN square image'),\r\n },\r\n [PT.MSAN.MSEdgeSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.78 : 1',\r\n previewTypeString: _TL_('Microsoft Edge single carousel'),\r\n },\r\n [PT.MSAN.MSNInArticle]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.5 : 1',\r\n previewTypeString: _TL_('MSN in-article ad'),\r\n },\r\n [PT.MSAN.MSNSmallHeadline]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.33 : 1',\r\n previewTypeString: _TL_('MSN small headline'),\r\n },\r\n\r\n // pmax\r\n [PT.PMax.AudienceSquareImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('MSN square image'),\r\n },\r\n [PT.PMax.AudienceWideImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.PMax.MMALandscapeImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('Landscape Image Multimedia Ad'),\r\n },\r\n [PT.PMax.MMAVerticalImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 2',\r\n previewTypeString: _TL_('Vertical image'),\r\n },\r\n [PT.PMax.MMAWideImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '4 : 1',\r\n previewTypeString: _TL_('Wide image'),\r\n },\r\n [PT.PMax.MSNInArticle]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.5 : 1',\r\n previewTypeString: _TL_('MSN in-article ad'),\r\n },\r\n [PT.PMax.MSNSmallHeadline]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.33 : 1',\r\n previewTypeString: _TL_('MSN small headline'),\r\n },\r\n [PT.PMax.MSEdgeSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.78 : 1',\r\n previewTypeString: _TL_('Microsoft Edge single carousel'),\r\n },\r\n [PT.PMax.MMAV2MSEdgeCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '2.01 : 1',\r\n previewTypeString: _TL_('Microsoft Edge carousel'),\r\n },\r\n [PT.PMax.MMAV2MSNSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.69 : 1',\r\n previewTypeString: _TL_('MSN carousel'),\r\n },\r\n [PT.PMax.MMAV2MSNRestoday]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.24 : 1',\r\n previewTypeString: _TL_('MSN Restoday'),\r\n },\r\n [PT.PMax.MMAV2MSNPartnerStripe]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.53 : 1',\r\n previewTypeString: _TL_('MSN partner stripe'),\r\n },\r\n [PT.PMax.MMAV2MSNRiver]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.PMax.MSEdgeMobile]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('Microsoft Edge mobile'),\r\n },\r\n\r\n // MSAN V2\r\n [PT.MSANV2.MSEdgeCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '2.01 : 1',\r\n previewTypeString: _TL_('Microsoft Edge carousel'),\r\n },\r\n [PT.MSANV2.MSANBanner]: {\r\n isRequired: false,\r\n aspectRatioUIString: '2 : 1',\r\n previewTypeString: _TL_('MSN banner'),\r\n },\r\n [PT.MSANV2.MSANRiver]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.MSANV2.MSNCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.69 : 1',\r\n previewTypeString: _TL_('MSN carousel'),\r\n },\r\n [PT.MSANV2.MSNPartnerStripe]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.53 : 1',\r\n previewTypeString: _TL_('MSN partner stripe'),\r\n },\r\n [PT.MSANV2.MSNRestoday]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.24 : 1',\r\n previewTypeString: _TL_('MSN Restoday'),\r\n },\r\n [PT.MSANV2.MSANRectangle]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.2 : 1',\r\n previewTypeString: _TL_('MSN rectangle image'),\r\n },\r\n [PT.MSANV2.MSEdgeMobile]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('Microsoft Edge mobile'),\r\n },\r\n\r\n // Image Extension\r\n [PT.ImageExt.WideImage]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.ImageExt.MSEdgeSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.78 : 1',\r\n previewTypeString: _TL_('Microsoft Edge single carousel'),\r\n },\r\n [PT.ImageExt.BingDesktopSingleImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.78 : 1',\r\n previewTypeString: _TL_('Bing desktop single-image extension'),\r\n },\r\n [PT.ImageExt.MSEdgeMediumHeadline]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.72 : 1',\r\n previewTypeString: _TL_('Microsoft Edge medium headline'),\r\n },\r\n [PT.ImageExt.MSNSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.69 : 1',\r\n previewTypeString: _TL_('MSN carousel'),\r\n },\r\n [PT.ImageExt.MSNMediumHeadline]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.55 : 1',\r\n previewTypeString: _TL_('MSN medium headline'),\r\n },\r\n [PT.ImageExt.MSNInArticle]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.5 : 1',\r\n previewTypeString: _TL_('MSN in-article ad'),\r\n },\r\n [PT.ImageExt.MSNSmallHeadline]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.33 : 1',\r\n previewTypeString: _TL_('MSN small headline'),\r\n },\r\n [PT.ImageExt.BingDesktopMultiImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.33 : 1',\r\n previewTypeString: _TL_('Bing desktop multi-image extension'),\r\n },\r\n [PT.ImageExt.BingMobileMultiImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.33 : 1',\r\n previewTypeString: _TL_('Bing mobile multi-image extension'),\r\n },\r\n [PT.ImageExt.SquareImage]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('MSN square image'),\r\n },\r\n [PT.ImageExt.MSNDoubleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '0.93 : 1',\r\n previewTypeString: _TL_('MSN double carousel'),\r\n },\r\n [PT.ImageExt.MMAV2MSNRiver]: {\r\n isRequired: true,\r\n aspectRatioUIString: '1.91 : 1',\r\n previewTypeString: _TL_('MSN feed'),\r\n },\r\n [PT.ImageExt.MMAV2MSNSingleCarousel]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1.69 : 1',\r\n previewTypeString: _TL_('MSN carousel'),\r\n },\r\n [PT.ImageExt.MSEdgeMobile]: {\r\n isRequired: false,\r\n aspectRatioUIString: '1 : 1',\r\n previewTypeString: _TL_('Microsoft Edge mobile'),\r\n },\r\n});\r\n\r\nexport const aspectRatioConfig = isMultimediaAd => ({\r\n Image191x100: {\r\n aspectRatio: 1.91,\r\n aspectRatioAsRatio: '1.91 : 1',\r\n aspectRatioString: '191X100',\r\n type: 'Image191x100',\r\n isRequired: true,\r\n },\r\n Image4x1: {\r\n aspectRatio: 4,\r\n aspectRatioAsRatio: '4 : 1',\r\n aspectRatioString: '400X100',\r\n type: 'Image4x1',\r\n isRequired: false,\r\n },\r\n Image1x1: {\r\n aspectRatio: 1,\r\n aspectRatioAsRatio: '1 : 1',\r\n aspectRatioString: '100X100',\r\n type: 'Image1x1',\r\n isRequired: isMultimediaAd,\r\n },\r\n Image1x2: {\r\n aspectRatio: 0.5,\r\n aspectRatioAsRatio: '1 : 2',\r\n aspectRatioString: '50X100',\r\n type: 'Image1x2',\r\n isRequired: false,\r\n },\r\n Image178x100: {\r\n aspectRatio: 1.78,\r\n aspectRatioAsRatio: '1.78 : 1',\r\n aspectRatioString: '178X100',\r\n type: 'Image178x100',\r\n isRequired: false,\r\n extraExtension: {\r\n BingSingleImage: {\r\n previewTypeString: imageAdExtSettings.BingSingleImage.previewTypeString,\r\n },\r\n },\r\n },\r\n Image172x100: {\r\n aspectRatio: 1.72,\r\n type: 'Image172x100',\r\n aspectRatioAsRatio: '1.72 : 1',\r\n aspectRatioString: '172X100',\r\n isRequired: false,\r\n },\r\n Image169x100: {\r\n aspectRatio: 1.69,\r\n type: 'Image169x100',\r\n aspectRatioAsRatio: '1.69 : 1',\r\n aspectRatioString: '169X100',\r\n isRequired: false,\r\n },\r\n Image150x100: {\r\n aspectRatio: 1.5,\r\n aspectRatioAsRatio: '1.5 : 1',\r\n aspectRatioString: '150X100',\r\n type: 'Image150x100',\r\n isRequired: false,\r\n },\r\n Image155x100: {\r\n aspectRatio: 1.55,\r\n type: 'Image155x100',\r\n aspectRatioAsRatio: '1.55 : 1',\r\n aspectRatioString: '155X100',\r\n isRequired: false,\r\n },\r\n Image133x100: {\r\n aspectRatio: 1.33,\r\n aspectRatioAsRatio: '1.33 : 1',\r\n aspectRatioString: '133X100',\r\n type: 'Image133x100',\r\n isRequired: false,\r\n extraExtension: {\r\n MobileMultiImage: {\r\n previewTypeString: imageAdExtSettings.MobileMultiImage.previewTypeString,\r\n },\r\n BingDesktopImage: {\r\n previewTypeString: imageAdExtSettings.BingDesktopImage.previewTypeString,\r\n },\r\n },\r\n },\r\n Image93x100: {\r\n aspectRatio: 0.93,\r\n aspectRatioAsRatio: '0.93 : 1',\r\n aspectRatioString: '93X100',\r\n type: 'Image93x100',\r\n isRequired: false,\r\n },\r\n Image201x100: {\r\n aspectRatio: 2.01,\r\n aspectRatioAsRatio: '2.01 : 1',\r\n aspectRatioString: '201X100',\r\n type: 'Image201x100',\r\n isRequired: false,\r\n },\r\n Image200x100: {\r\n aspectRatio: 2,\r\n aspectRatioAsRatio: '2 : 1',\r\n aspectRatioString: '200X100',\r\n type: 'Image200x100',\r\n isRequired: false,\r\n },\r\n Image153x100: {\r\n aspectRatio: 1.53,\r\n aspectRatioAsRatio: '1.53 : 1',\r\n aspectRatioString: '153X100',\r\n type: 'Image153x100',\r\n isRequired: false,\r\n },\r\n Image124x100: {\r\n aspectRatio: 1.24,\r\n aspectRatioAsRatio: '1.24 : 1',\r\n aspectRatioString: '124X100',\r\n type: 'Image124x100',\r\n isRequired: false,\r\n },\r\n Image120x100: {\r\n aspectRatio: 1.2,\r\n aspectRatioAsRatio: '1.2 : 1',\r\n aspectRatioString: '120X100',\r\n type: 'Image120x100',\r\n isRequired: false,\r\n },\r\n});\r\n\r\nexport const getAspectRatioConfig = (adType, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled) => {\r\n const aspectRatios = C.getAspectRatios({\r\n isMultimediaAd: adType === CSMLAdType.MMA,\r\n isMultimediaAdinMSANEnabled: CSMLAdType.Audience === adType,\r\n isCombinedMsanAndMmaAspectRatios: CSMLAdType.PMax === adType,\r\n isMMAV2Enabled: CSMLAdType.Audience === adType && isMMAV2Enabled,\r\n isPMaxAspectRatiosV2Enabled: CSMLAdType.PMax === adType && isPMaxAspectRatiosV2Enabled,\r\n });\r\n\r\n const allAspectRatioConfig = aspectRatioConfig(adType === CSMLAdType.MMA);\r\n\r\n const aspectRatiosExceptOriginal = _.omit(aspectRatios, 'OriginalImage');\r\n\r\n const subAspectRatioConfig = _.mapObject(aspectRatiosExceptOriginal, item => ({\r\n ...allAspectRatioConfig[item.type],\r\n minSize: item.minSize,\r\n previewTypeString: item.previewTypeString,\r\n placementType: `${CSMLAdTypeAbbr[adType]}${allAspectRatioConfig[item.type].aspectRatioString}`,\r\n }));\r\n\r\n return subAspectRatioConfig;\r\n};\r\n\r\nexport const getPreviewText = (isImageExtension, i18n) => {\r\n if (isImageExtension) {\r\n return {\r\n shortHeadline: i18n.getString(_TL_('Title part 1')),\r\n longHeadline: i18n.getString(_TL_('Title part 1 | Title part 2 | Title part 3')),\r\n description: i18n.getString(_TL_('Ad text 1. Ad text 2')),\r\n businessName: i18n.getString(_TL_('Business name')),\r\n url: 'https://example.com',\r\n finalUrl: 'https://example.com',\r\n };\r\n }\r\n\r\n return {\r\n shortHeadline: i18n.getString(_TL_('Short headline')),\r\n longHeadline: i18n.getString(_TL_('Long headline')),\r\n description: i18n.getString(_TL_('Ad text')),\r\n businessName: i18n.getString(_TL_('Business name')),\r\n url: 'https://example.com',\r\n finalUrl: 'https://example.com',\r\n callToAction: i18n.getString(_TL_('Shop Now')),\r\n };\r\n};\r\n\r\nexport const sizeValidForRatio = (minSize, cropSettings) => {\r\n if (cropSettings && minSize) {\r\n const { SourceWidth, SourceHeight } = cropSettings;\r\n if (SourceWidth < minSize[0] || SourceHeight < minSize[1]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const getSizeErrorRatioList = (\r\n adType,\r\n cropSettings,\r\n requiredOnly = false,\r\n isMMAV2Enabled = false,\r\n isPMaxAspectRatiosV2Enabled = false\r\n) => {\r\n let ratioList = getAspectRatioConfig(adType, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled);\r\n\r\n if (requiredOnly) {\r\n ratioList = _.filter(ratioList, config => config.isRequired);\r\n }\r\n\r\n const invalidRatioList = _.filter(ratioList, (item) => {\r\n const { minSize } = item;\r\n return !sizeValidForRatio(minSize, cropSettings);\r\n });\r\n\r\n return invalidRatioList;\r\n};\r\n\r\nexport const getAllSizeErrorRatioList = (cropSettings, requiredOnly = false, isMMAV2Enabled = false, isPMaxAspectRatiosV2Enabled = false) => {\r\n const errorListForMMA = getSizeErrorRatioList(CSMLAdType.MMA, cropSettings, requiredOnly, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled);\r\n const errorListForAudience = getSizeErrorRatioList(CSMLAdType.Audience, cropSettings, requiredOnly, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled);\r\n const errorListForExtension = getSizeErrorRatioList(CSMLAdType.ImageExtension, cropSettings, requiredOnly, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled);\r\n const errorListForPmax = getSizeErrorRatioList(CSMLAdType.Pmax, cropSettings, requiredOnly, isMMAV2Enabled, isPMaxAspectRatiosV2Enabled);\r\n\r\n return _.uniq(\r\n [...errorListForAudience, ...errorListForExtension, ...errorListForMMA, ...errorListForPmax],\r\n item => item.type\r\n );\r\n};\r\n\r\nexport const getPlacementsToExpand = (adType) => {\r\n const aspectRatios = C.getAspectRatios({\r\n isMultimediaAd: adType === CSMLAdType.MMA,\r\n isMultimediaAdinMSANEnabled: CSMLAdType.Audience === adType,\r\n isMMAV2Enabled: adType === CSMLAdType.Audience,\r\n isCombinedMsanAndMmaAspectRatios: adType === CSMLAdType.PMax,\r\n });\r\n\r\n const placementsToExpand = _.chain(aspectRatios)\r\n .reject(p => CSMLAdType.Audience === adType && p.type === 'OriginalImage')\r\n .map(({ aspectRatio, minSize }) => ({ aspectRatio, minHeight: minSize[1] }))\r\n .value();\r\n\r\n return placementsToExpand;\r\n};\r\n","import image0 from './image/Designer0.png';\r\nimport image1 from './image/Designer1.png';\r\nimport image2 from './image/Designer2.jpg';\r\nimport image3 from './image/Designer3.png';\r\nimport image4 from './image/Designer4.jpg';\r\nimport image5 from './image/Designer5.jpg';\r\nimport image6 from './image/Designer6.jpg';\r\nimport image7 from './image/Designer7.png';\r\nimport image8 from './image/Designer8.jpg';\r\nimport image9 from './image/Designer9.jpg';\r\nimport image10 from './image/Designer10.jpg';\r\nimport image11 from './image/Designer11.jpg';\r\nimport image12 from './image/Designer12.jpg';\r\nimport image13 from './image/Designer13.png';\r\nimport image14 from './image/Designer14.jpg';\r\nimport image15 from './image/Designer15.jpg';\r\nimport image16 from './image/Designer16.jpg';\r\nimport image17 from './image/Designer17.jpg';\r\nimport image18 from './image/Designer18.jpg';\r\nimport image19 from './image/Designer19.png';\r\n\r\nconst samples = [\r\n {\r\n promptText: _TL_('Modern high-tech gadgets on a sleek, minimalist desk.'),\r\n imageSrc: image0,\r\n },\r\n {\r\n promptText: _TL_('A luxury car driving through scenic mountains.'),\r\n imageSrc: image1,\r\n },\r\n {\r\n promptText: _TL_('A digital timer displayed prominently on a sleek marble surface.'),\r\n imageSrc: image2,\r\n },\r\n {\r\n promptText: _TL_('An array of high-end skincare products on a marble countertop.'),\r\n imageSrc: image3,\r\n },\r\n {\r\n promptText: _TL_('An electric bicycle displayed next to an outdoor café.'),\r\n imageSrc: image4,\r\n },\r\n {\r\n promptText: _TL_('A stylish home office setup with tech gadgets.'),\r\n imageSrc: image5,\r\n },\r\n {\r\n promptText: _TL_('A picnic setup with food and decor in a park.'),\r\n imageSrc: image6,\r\n },\r\n {\r\n promptText: _TL_('A product photo of juice bottles with no label.'),\r\n imageSrc: image7,\r\n },\r\n {\r\n promptText: _TL_('A five-star hotel room with a stunning view of the city skyline.'),\r\n imageSrc: image8,\r\n },\r\n {\r\n promptText: _TL_('An all-inclusive spa treatment setting.'),\r\n imageSrc: image9,\r\n },\r\n {\r\n promptText: _TL_('A hiking backpack and gear on an adventurous trail with breathtaking views.'),\r\n imageSrc: image10,\r\n },\r\n {\r\n promptText: _TL_('A trendy cafe table with coffee cups.'),\r\n imageSrc: image11,\r\n },\r\n {\r\n promptText: _TL_('A beautifully arranged floral bouquet on a table.'),\r\n imageSrc: image12,\r\n },\r\n {\r\n promptText: _TL_('A beautifully wrapped gift in front of a fireplace.'),\r\n imageSrc: image13,\r\n },\r\n {\r\n promptText: _TL_('An elegant dining setup for a romantic evening.'),\r\n imageSrc: image14,\r\n },\r\n {\r\n promptText: _TL_('Refreshing smoothies in elegant glassware.'),\r\n imageSrc: image15,\r\n },\r\n {\r\n promptText: _TL_('A stylish urban setting with modern decor.'),\r\n imageSrc: image16,\r\n },\r\n {\r\n promptText: _TL_('A festive living room with a beautifully decorated Christmas tree, featuring branded holiday decor items and cozy products.'),\r\n imageSrc: image17,\r\n },\r\n {\r\n promptText: _TL_('A winter market stall with festive treats.'),\r\n imageSrc: image18,\r\n },\r\n {\r\n promptText: _TL_('Beautifully wrapped gift boxes placed under a decorated holiday tree with twinkling lights.'),\r\n imageSrc: image19,\r\n },\r\n];\r\n\r\nexport const AIPromptExamples = samples;\r\n","import _ from 'underscore';\r\n\r\nexport const getUpdatedAssets = ({\r\n assets,\r\n updates = {},\r\n}) => {\r\n const {\r\n imageCroppingTasks,\r\n videoUpdated,\r\n } = updates || {};\r\n\r\n if (assets &&\r\n (!_.isEmpty(imageCroppingTasks) || !_.isEmpty(videoUpdated))\r\n ) {\r\n let updatedAssets = assets;\r\n\r\n if (!_.isEmpty(imageCroppingTasks)) {\r\n updatedAssets = updatedAssets.map((asset) => {\r\n const taskStatus = imageCroppingTasks[asset.id];\r\n if (taskStatus) {\r\n return {\r\n ...asset,\r\n updating: !taskStatus.isFinished,\r\n };\r\n }\r\n\r\n return asset;\r\n });\r\n }\r\n\r\n if (!_.isEmpty(videoUpdated)) {\r\n updatedAssets = updatedAssets.map((asset) => {\r\n const newUpdates = videoUpdated[asset.id];\r\n if (newUpdates && newUpdates.status !== asset.status) {\r\n return {\r\n ...asset,\r\n ...newUpdates,\r\n };\r\n }\r\n\r\n return asset;\r\n });\r\n }\r\n\r\n return updatedAssets;\r\n }\r\n\r\n return assets;\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport { reduce } from 'underscore';\r\n\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\n\r\nexport const useClarityTags = (customTags) => {\r\n const [haveSetClarityTags, setHaveSetClarityTags] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!haveSetClarityTags) {\r\n const tagsToSet = reduce(customTags, (tagsObj, currentTag) => ({\r\n ...tagsObj,\r\n [currentTag]: true,\r\n }), {});\r\n\r\n setClarityTag(tagsToSet);\r\n setHaveSetClarityTags(true);\r\n }\r\n }, [haveSetClarityTags, setHaveSetClarityTags, customTags]);\r\n};\r\n","import _ from 'underscore';\r\nimport queryString from 'query-string';\r\nimport { VideoStatus, AdditionalQueries } from './constants';\r\nimport { EntryCardSVGIcons } from '../../src/asset-images';\r\n\r\n// TO DO: update this when new entity type is created\r\nconst ExternalEntityType = {\r\n XandrAdvertiser: 8,\r\n};\r\n\r\nexport const checkVideosIntermediateStatus =\r\n video => video.status !== VideoStatus.Active && video.status !== VideoStatus.Failed;\r\n/* istanbul ignore next */\r\nconst getSizeLimitPerAccount = (aid, id) => {\r\n const value = localStorage.getItem(`SystemLimitData_${aid}`);\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n let valObj = null;\r\n\r\n try {\r\n valObj = JSON.parse(value);\r\n } catch (e) {\r\n return null;\r\n }\r\n\r\n const limitData = _.find(valObj.data, data => data.id === id);\r\n\r\n return limitData && limitData.val;\r\n};\r\n\r\nexport const isValidXandrAccount = (account) => {\r\n if (account && account.ExternalAccountIds && account.ExternalAccountIds.length > 0) {\r\n // TO DO switch this to new enetity type when its available\r\n const externalAccountId = _.find(account.ExternalAccountIds, item => item.Type === ExternalEntityType.XandrAdvertiser);\r\n return externalAccountId !== undefined && externalAccountId.Id !== null && externalAccountId.Id !== undefined;\r\n }\r\n // TO DO switch to false\r\n return true;\r\n};\r\n\r\nexport const getEntryCardData = ({\r\n i18n,\r\n cardKeys = [],\r\n onClickCreate = _.noop,\r\n onClickUpload = _.noop,\r\n onClickStock = _.noop,\r\n onClickInvest = _.noop,\r\n onClickWebsite = _.noop,\r\n isImagePage = false,\r\n isVideoPage = false,\r\n isXandrIntegrationEnabled = false,\r\n}) => {\r\n let uploadDescription = i18n.getString(_TL_('Upload assets from your computer'));\r\n let websiteDescription = i18n.getString(_TL_('Enter your URL and we\\'ll pull assets from it'));\r\n let websiteTitle = i18n.getString(_TL_('Add from website'));\r\n let createDescription = i18n.getString(_TL_('Create AI-generated images'));\r\n let createTitle = i18n.getString(_TL_('Create'));\r\n let investDescription = i18n.getString(_TL_('Search Invest'));\r\n if (isImagePage) {\r\n createDescription = i18n.getString(_TL_('Create AI-generated images'));\r\n uploadDescription = i18n.getString(_TL_('Upload images from your computer'));\r\n websiteDescription = i18n.getString(_TL_('Enter your URL and we\\'ll pull images from it'));\r\n investDescription = i18n.getString(_TL_('Search Invest for images'));\r\n } else if (isVideoPage) {\r\n createTitle = i18n.getString(_TL_('Create'));\r\n createDescription = i18n.getString(_TL_('Create a video using a template'));\r\n uploadDescription = i18n.getString(_TL_('Upload videos from your computer'));\r\n websiteDescription = i18n.getString(_TL_('Enter your video\\'s URL'));\r\n websiteTitle = i18n.getString(_TL_('Add from URL'));\r\n investDescription = i18n.getString(_TL_('Search Invest for videos'));\r\n }\r\n\r\n let cardData = [\r\n {\r\n title: createTitle,\r\n description: createDescription,\r\n image: EntryCardSVGIcons.CreateSVGIcon,\r\n onClick: onClickCreate,\r\n key: 'Create',\r\n },\r\n {\r\n title: i18n.getString(_TL_('Upload')),\r\n description: uploadDescription,\r\n image: EntryCardSVGIcons.UploadSVGIcon,\r\n onClick: onClickUpload,\r\n key: 'Upload',\r\n },\r\n {\r\n title: i18n.getString(_TL_('Get stock images')),\r\n description: i18n.getString(_TL_('Search Shutterstock for images')),\r\n image: EntryCardSVGIcons.StockSVGIcon,\r\n onClick: onClickStock,\r\n key: 'Stock',\r\n },\r\n {\r\n title: websiteTitle,\r\n description: websiteDescription,\r\n image: EntryCardSVGIcons.WebsiteSVGIcon,\r\n onClick: onClickWebsite,\r\n key: 'Website',\r\n },\r\n ];\r\n\r\n if (isXandrIntegrationEnabled) {\r\n cardData = [\r\n ...cardData,\r\n {\r\n title: i18n.getString(_TL_('Add from Microsoft Invest')),\r\n description: investDescription,\r\n image: EntryCardSVGIcons.InvestSVGIcon,\r\n onClick: onClickInvest,\r\n key: 'Invest',\r\n },\r\n ];\r\n }\r\n\r\n\r\n if (!cardKeys.length) {\r\n return cardData;\r\n }\r\n return cardData.filter(card => cardKeys.includes(card.key));\r\n};\r\n\r\nexport const getHomePageCardData = ({\r\n i18n,\r\n cardKeys = [],\r\n onClickUpload = _.noop,\r\n onClickStock = _.noop,\r\n onClickWebsite = _.noop,\r\n onClickInvest = _.noop,\r\n isXandrIntegrationEnabled = false,\r\n}) => {\r\n let cardData = [\r\n {\r\n title: i18n.getString(_TL_('Upload')),\r\n description: i18n.getString(_TL_('Upload assets from your computer')),\r\n image: EntryCardSVGIcons.UploadSVGIcon,\r\n onClick: onClickUpload,\r\n key: 'Upload',\r\n },\r\n {\r\n title: i18n.getString(_TL_('Add from website')),\r\n description: i18n.getString(_TL_('Enter your URL and we’ll pull assets from it')),\r\n image: EntryCardSVGIcons.WebsiteSVGIcon,\r\n onClick: onClickWebsite,\r\n key: 'Website',\r\n },\r\n {\r\n title: i18n.getString(_TL_('Get stock images')),\r\n description: i18n.getString(_TL_('Search Shutterstock for images')),\r\n image: EntryCardSVGIcons.StockSVGIcon,\r\n onClick: onClickStock,\r\n key: 'Stock',\r\n },\r\n ];\r\n\r\n if (isXandrIntegrationEnabled) {\r\n cardData = [\r\n ...cardData,\r\n {\r\n title: i18n.getString(_TL_('Add from Microsoft Invest')),\r\n description: i18n.getString(_TL_('Search Invest for images')),\r\n image: EntryCardSVGIcons.InvestSVGIcon,\r\n onClick: onClickInvest,\r\n key: 'Invest',\r\n },\r\n ];\r\n }\r\n\r\n if (!cardKeys.length) {\r\n return cardData;\r\n }\r\n return cardData.filter(card => cardKeys.includes(card.key));\r\n};\r\n\r\nexport const getImageAssetLimitPerAccount = (aid, logger) => {\r\n const assetLimit = getSizeLimitPerAccount(aid, 32);\r\n /* istanbul ignore if */\r\n if (assetLimit) {\r\n return assetLimit;\r\n }\r\n\r\n logger.logError('get image asset limit data error', { aid });\r\n return 5000;\r\n};\r\n\r\nexport const getFoldersLimitPerAccount = (aid, logger) => {\r\n const foldersLimit = getSizeLimitPerAccount(aid, 97);\r\n /* istanbul ignore if */\r\n if (foldersLimit) {\r\n return foldersLimit;\r\n }\r\n logger.logError('get folders limit data error', { aid });\r\n return 1000;\r\n};\r\n\r\nexport const getVideoAssetLimitPerAccount = (aid, logger) => {\r\n const assetLimit = getSizeLimitPerAccount(aid, 86);\r\n /* istanbul ignore if */\r\n if (assetLimit) {\r\n return assetLimit;\r\n }\r\n\r\n logger.logError('get video asset limit data error', { aid });\r\n return 1000;\r\n};\r\n\r\nexport const validate = (value) => {\r\n const reg = /<|>|:|\\*|\\?|\"|\\\\|\\/|\\|/;\r\n return !reg.test(value);\r\n};\r\n\r\nexport const getSearchQuery = ({ search = '', additionalQueries = {}, removeQueries = [] }) => {\r\n let query = queryString.parse(search);\r\n query = _.omit(query, (value, key) => _.includes(_.values(AdditionalQueries), key) || _.includes(removeQueries, key));\r\n query = {\r\n ...query,\r\n ...additionalQueries,\r\n };\r\n return `?${queryString.stringify(query)}`;\r\n};\r\n\r\nexport const AIGCHandler = (isAdsStudioAIGCMVPEnabled, isAIGCRegionRestricted, notificationApi, i18n, enabledCallback) => {\r\n if (isAdsStudioAIGCMVPEnabled && !isAIGCRegionRestricted) {\r\n enabledCallback();\r\n } else if (isAIGCRegionRestricted) {\r\n notificationApi.showWarning(i18n.getString(_TL_('This feature isn\\'t available in all markets.')));\r\n } else {\r\n notificationApi.showWarning(i18n.getString(_TL_('This feature isn\\'t available yet, but it\\'s coming soon.')));\r\n }\r\n};\r\n\r\nconst getRealUsedFlagValue = (preference, flagSuffix) => {\r\n if (preference && flagSuffix) {\r\n const realUsedFlagStr = `realUsedFlagIn${flagSuffix}`;\r\n const realUsedFlagHandlerStr = `setRealUsedFlagIn${flagSuffix}`;\r\n const realUsedFlag = preference[realUsedFlagStr];\r\n const realUsedFlagHandler = preference[realUsedFlagHandlerStr];\r\n\r\n return {\r\n realUsedFlag,\r\n realUsedFlagHandler,\r\n };\r\n }\r\n\r\n return {};\r\n};\r\n\r\nexport const handleRealUsedFlag = (preference, flagSuffix) => { // flagSuffix: AssetLibraryApp or AssetLibraryPicker\r\n const { realUsedFlag, realUsedFlagHandler } = getRealUsedFlagValue(preference, flagSuffix);\r\n\r\n const {\r\n haveUsed,\r\n } = realUsedFlag || {};\r\n\r\n if (!haveUsed && realUsedFlagHandler) {\r\n realUsedFlagHandler();\r\n }\r\n};\r\n\r\nexport const addAdStudioSurveyTriggerFlag = (preference, triggerFlag, usedFlagSuffix) => {\r\n const { realUsedFlag } = getRealUsedFlagValue(preference, usedFlagSuffix);\r\n\r\n const { haveUsed, timestamp } = realUsedFlag || {};\r\n\r\n if (haveUsed) {\r\n const currentTime = new Date().getTime();\r\n const diffDay = (currentTime - timestamp) / 1000 / 60 / 60 / 24;\r\n if (diffDay > 1 && window.survey && window.survey.surveyManager) {\r\n window.survey[triggerFlag] = true;\r\n window.survey.surveyManager.trigger({\r\n checkIfSurveyIsOpen: true,\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport const removeAdStudioSurveyTriggerFlag = (triggerFlag) => {\r\n if (window.survey) {\r\n window.survey[triggerFlag] = false;\r\n }\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nconst commonButtonStyle = {\r\n display: 'flex',\r\n ...shorthands.padding('12px'),\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n ...shorthands.gap('8px'),\r\n ...shorthands.borderRadius('8px'),\r\n backgroundColor: '#FFF',\r\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.14), 0 0 2px 0 rgba(0, 0, 0, 0.12)',\r\n ...shorthands.border('none'),\r\n ...shorthands.outline('none'),\r\n maxHeight: '150px',\r\n ...shorthands.overflow('hidden'),\r\n minWidth: '230px',\r\n};\r\n\r\nconst commonTextStyle = {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'normal',\r\n textAlign: 'left',\r\n ...shorthands.flex(1, 1, '0px'),\r\n width: '100%',\r\n ...shorthands.overflow('hidden'),\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n};\r\n\r\nconst commonIconStyle = {\r\n display: 'flex',\r\n ...shorthands.margin('4px'),\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n width: '20px',\r\n height: '20px',\r\n};\r\n\r\nexport const useAssetsEntryCardStyle = makeStyles({\r\n fillWidth: {\r\n ...shorthands.flex(1, 0, '0px'),\r\n },\r\n assetsEntryCard: {\r\n ...commonButtonStyle,\r\n '& .title': {\r\n ...commonTextStyle,\r\n color: '#242424',\r\n fontSize: '14px',\r\n lineHeight: '20px',\r\n fontWeight: 600,\r\n },\r\n '& .description': {\r\n ...commonTextStyle,\r\n color: '#616161',\r\n fontSize: '12px',\r\n lineHeight: '16px',\r\n fontWeight: '400',\r\n },\r\n '& .text': {\r\n ...shorthands.flex(1),\r\n minWidth: '110px',\r\n width: '100%',\r\n },\r\n '& .picture': {\r\n width: '52px',\r\n height: '52px',\r\n '& img': {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain',\r\n },\r\n },\r\n '& .icon': {\r\n ...commonIconStyle,\r\n },\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { mergeClasses, Button } from '@fluentui/react-components';\r\nimport { Add20Regular } from '@fluentui/react-icons';\r\nimport { useAssetsEntryCardStyle } from './style';\r\n\r\nconst AssetsEntryCard = ({\r\n id, title, description, imageSrc, onClick, isFillWidth, cardClassName,\r\n}) => {\r\n const classes = useAssetsEntryCardStyle();\r\n\r\n return (\r\n <Button\r\n id={id ? `${id}AssetEntryButton` : undefined}\r\n onClick={onClick}\r\n className={mergeClasses('entry-card', classes.assetsEntryCard, isFillWidth && classes.fillWidth, cardClassName)}\r\n >\r\n <div className=\"picture\">\r\n <img src={imageSrc} alt={title} />\r\n </div>\r\n <div className=\"text\">\r\n <div className=\"title\">\r\n {title}\r\n </div>\r\n <div className=\"description\" title={description}>\r\n {description}\r\n </div>\r\n </div>\r\n <div className=\"icon\">\r\n <Add20Regular />\r\n </div>\r\n </Button>\r\n );\r\n};\r\nAssetsEntryCard.propTypes = {\r\n id: PropTypes.string,\r\n title: PropTypes.string.isRequired,\r\n description: PropTypes.string.isRequired,\r\n imageSrc: PropTypes.string.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n isFillWidth: PropTypes.bool,\r\n cardClassName: PropTypes.string,\r\n};\r\n\r\nAssetsEntryCard.defaultProps = {\r\n id: undefined,\r\n isFillWidth: false,\r\n cardClassName: '',\r\n};\r\n\r\nexport const AddAssetEntryCard = AssetsEntryCard;\r\n","import _ from 'underscore';\r\nimport React, { Children, cloneElement, forwardRef, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Overlay, Layer } from '@bingads-webui-react/fabric-control';\r\n\r\nimport { Button, makeStyles, mergeClasses } from '@fluentui/react-components';\r\nimport {\r\n DrawerHeader,\r\n DrawerHeaderTitle,\r\n DrawerBody,\r\n DrawerFooter,\r\n DrawerOverlay,\r\n} from '@fluentui/react-drawer';\r\nimport { Dismiss24Regular } from '@fluentui/react-icons';\r\n\r\nconst TOP_BANNER_HEIGHT = 60;\r\n\r\nconst useStyles = makeStyles({\r\n addMediaPanel: {\r\n height: `calc(100vh - ${TOP_BANNER_HEIGHT}px)`,\r\n top: 'auto',\r\n bottom: '0px',\r\n },\r\n panelContent: {\r\n '-ms-overflow-style': 'none',\r\n scrollbarWidth: 'none',\r\n },\r\n overlay: {\r\n zIndex: '2',\r\n },\r\n layer: {\r\n zIndex: '1000',\r\n },\r\n});\r\n\r\nexport const AdsStudioPanelContainer = forwardRef((props, ref) => {\r\n const {\r\n onRenderFooterContent,\r\n isOpen,\r\n dismiss,\r\n headerText,\r\n children,\r\n size,\r\n className,\r\n } = props;\r\n\r\n const overlayBodyRef = useRef(null);\r\n const styles = useStyles();\r\n\r\n return (\r\n <>\r\n <DrawerOverlay\r\n ref={ref}\r\n open={isOpen}\r\n modalType=\"non-modal\"\r\n position=\"end\"\r\n size={size}\r\n tabIndex={0}\r\n className={mergeClasses(styles.addMediaPanel, 'ads-studio-panel-container-drawer-overlay', className)}\r\n >\r\n <DrawerHeader>\r\n <DrawerHeaderTitle\r\n action={\r\n <Button\r\n className=\"panel-close-button\"\r\n appearance=\"subtle\"\r\n aria-label=\"Close\"\r\n icon={<Dismiss24Regular />}\r\n onClick={dismiss}\r\n />\r\n }\r\n >\r\n {headerText}\r\n </DrawerHeaderTitle>\r\n </DrawerHeader>\r\n <DrawerBody ref={overlayBodyRef} className={mergeClasses(styles.addMediaPanel, 'ads-studio-panel-container-drawer-overlay-body')}>\r\n {Children.map(children, child =>\r\n child && cloneElement(child, {\r\n overlayBodyRef,\r\n }))}\r\n </DrawerBody>\r\n <DrawerFooter>\r\n {onRenderFooterContent}\r\n </DrawerFooter>\r\n </DrawerOverlay>\r\n {\r\n isOpen && (\r\n <Layer className={mergeClasses('panel-layer', styles.layer)}>\r\n <Overlay isDarkThemed className={styles.overlay} />\r\n </Layer>\r\n )\r\n }\r\n </>\r\n );\r\n});\r\n\r\nAdsStudioPanelContainer.propTypes = {\r\n onRenderFooterContent: PropTypes.func,\r\n isOpen: PropTypes.bool,\r\n dismiss: PropTypes.func,\r\n headerText: PropTypes.string,\r\n children: PropTypes.element,\r\n size: PropTypes.string,\r\n className: PropTypes.string,\r\n};\r\n\r\nAdsStudioPanelContainer.defaultProps = {\r\n onRenderFooterContent: _.noop,\r\n isOpen: false,\r\n dismiss: _.noop,\r\n headerText: '',\r\n children: null,\r\n size: 'large',\r\n className: '',\r\n};\r\n\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Spinner, SpinnerSize } from '@fluentui/react';\r\n\r\nexport const AdsStudioSpinner = ({\r\n useCustomSize,\r\n className,\r\n customStyle,\r\n}) => {\r\n const spinnerStyles = useMemo(() => ({\r\n circle: useCustomSize ? { width: 50, height: 50 } : null,\r\n root: customStyle || {\r\n width: '100%',\r\n height: '100%',\r\n margin: 'auto',\r\n },\r\n }), [customStyle, useCustomSize]);\r\n\r\n return (\r\n <Spinner\r\n size={SpinnerSize.large}\r\n styles={spinnerStyles}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\n\r\nAdsStudioSpinner.propTypes = {\r\n customStyle: PropTypes.shape({}),\r\n useCustomSize: PropTypes.bool,\r\n className: PropTypes.string,\r\n};\r\n\r\nAdsStudioSpinner.defaultProps = {\r\n useCustomSize: false,\r\n className: '',\r\n customStyle: null,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const useActionButtonStyles = makeStyles({\r\n actionButton: {\r\n fontSize: '13px',\r\n fontStyle: 'normal',\r\n fontWeight: 400,\r\n backgroundColor: 'rgb(255,255,255,0.2)',\r\n ...shorthands.borderRadius('999px'),\r\n ...shorthands.border('none'),\r\n ...shorthands.margin('6px'),\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { Button } from '@fluentui/react-components';\r\n\r\nimport { useActionButtonStyles } from '../styles/tiles-grid-cell-action-button-style';\r\n\r\nconst ActionButton = ({\r\n text, icon: Icon, onClick, primary, className,\r\n}) => {\r\n const classes = useActionButtonStyles();\r\n const appearance = primary ? 'primary' : 'secondary';\r\n return (\r\n <Button\r\n icon={<Icon />}\r\n onClick={onClick}\r\n className={classnames('cell-button', classes.actionButton, className)}\r\n appearance={appearance}\r\n >\r\n {text}\r\n </Button>\r\n );\r\n};\r\n\r\nActionButton.propTypes = {\r\n text: PropTypes.string.isRequired,\r\n icon: PropTypes.elementType.isRequired,\r\n onClick: PropTypes.func.isRequired,\r\n primary: PropTypes.bool,\r\n // injected\r\n className: PropTypes.string.isRequired,\r\n};\r\n\r\nActionButton.defaultProps = {\r\n primary: true,\r\n};\r\n\r\nexport const TilesGridCellActionButton = ActionButton;\r\n","import React, { useCallback, useMemo } from 'react';\r\n\r\nconst AdsStudoThemeContext = React.createContext({});\r\n\r\n// theme is a black box object which could be platform specific\r\n// and is passed down to this context provider, and then\r\n// passed to getStyles functions in withAdsStudioDefaultStyles\r\nexport const AdsStudioThemeProvider = ({ theme, componentStyles, children }) => {\r\n //\r\n // get styles for a specific components by component name\r\n // the styles could be a function (theme) => styles, or an object\r\n const getComponentStyles = useCallback((componentName) => {\r\n const { components } = theme || {};\r\n if (componentStyles && componentStyles[componentName]) {\r\n return componentStyles[componentName];\r\n }\r\n if (components && components[componentName]) {\r\n return components[componentName];\r\n }\r\n return undefined;\r\n }, [componentStyles, theme]);\r\n\r\n const contextValue = useMemo(() => ({\r\n theme,\r\n getComponentStyles,\r\n }), [getComponentStyles, theme]);\r\n\r\n return (\r\n <AdsStudoThemeContext.Provider value={contextValue}>\r\n {children}\r\n </AdsStudoThemeContext.Provider>\r\n );\r\n};\r\n\r\nexport const useAdsStudioTheme = () => React.useContext(AdsStudoThemeContext);\r\n","import _ from 'underscore';\r\nimport React, { useMemo } from 'react';\r\nimport { createUseStyles } from 'react-jss';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\n\r\nimport { useAdsStudioTheme } from './ads-studio-theme-provider';\r\n\r\nconst emptyAdsStudioTheme = { theme: {}, getComponentStyles: () => { } };\r\nconst getDisplayName = Component => Component.displayName || Component.name || 'Component';\r\n\r\nfunction useThemedStyles({ componentName, prefixClassName, getDefaultStyles }) {\r\n // get theme from ads studio themem context provider\r\n const { theme, getComponentStyles } = useAdsStudioTheme() || emptyAdsStudioTheme;\r\n\r\n // get themed styles\r\n const themedStyles = useMemo(() => {\r\n // check if there are any overriden styles for this component from theme provider\r\n let overridenStyles = {};\r\n if (getComponentStyles) {\r\n // it could be an function or an object\r\n const getOverridenStyles = getComponentStyles(componentName);\r\n overridenStyles = _.isFunction(getOverridenStyles) ? getOverridenStyles(theme || {}) : getOverridenStyles;\r\n }\r\n\r\n // default styles\r\n const defaultStyles = getDefaultStyles && getDefaultStyles(theme || {});\r\n\r\n // merge styles\r\n return { ...defaultStyles, ...overridenStyles };\r\n }, [componentName, getComponentStyles, getDefaultStyles, theme]);\r\n\r\n // create jss styles\r\n const useStyles = useMemo(\r\n () => createUseStyles(themedStyles, { name: prefixClassName || 'AS' }),\r\n [prefixClassName, themedStyles]\r\n );\r\n const classes = useStyles() || {};\r\n\r\n const styles = useMemo(() => ({ classes, themedStyles }), [classes, themedStyles]);\r\n return styles;\r\n}\r\n\r\n// use an external theme to decouple the wrapped components with a specific theme provider\r\n// eslint-disable-next-line valid-jsdoc\r\n/**\r\n * @deprecated this function is deprecated, and will be removed later\r\n */\r\nexport function withAdsStudioStyles(WrappedComponent, getDefaultStyles, options) {\r\n const {\r\n prefixClassName, // the prefix of the class names generated by react-jss\r\n useRawStyles, // also pass down the themed styles to the wrapped component, which may be used in Fluent UI components\r\n componentName, // the description name of WrappedComponent\r\n } = options || {};\r\n\r\n const finalComponentName = componentName || getDisplayName(WrappedComponent);\r\n\r\n const HOC = (props) => {\r\n const { classes, themedStyles } = useThemedStyles({ componentName: finalComponentName, prefixClassName, getDefaultStyles });\r\n return (\r\n <WrappedComponent {...props} classes={classes} themedStyles={useRawStyles ? themedStyles : undefined} />\r\n );\r\n };\r\n\r\n HOC.displayName = `withAdsStudioStyles(${finalComponentName})`;\r\n\r\n hoistNonReactStatics(HOC, WrappedComponent);\r\n\r\n return HOC;\r\n}\r\n\r\n","const positionFill = {\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n};\r\n\r\nexport const getCellOverlayStyle = () => ({\r\n cellOverlayContainer: {\r\n ...positionFill,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n background: 'linear-gradient(180deg, rgba(49, 34, 34, 0.3) 0%, rgba(49, 34, 34, 0.8) 53.12%, #312222 100%)',\r\n opacity: 0,\r\n transition: 'opacity 0.2s ease-out',\r\n borderRadius: 6,\r\n },\r\n});\r\n","\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { withAdsStudioStyles } from '../../../theme/with-ads-studio-styles';\r\nimport { getCellOverlayStyle } from '../styles/tiles-grid-cell-overlay-style';\r\n\r\nconst CellOverlay = ({ children, classes }) => (\r\n <div className={classnames('cell-overlay', classes.cellOverlayContainer)}>\r\n {children}\r\n </div>\r\n);\r\n\r\nCellOverlay.propTypes = {\r\n children: PropTypes.node,\r\n classes: PropTypes.shape({\r\n cellOverlayContainer: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nCellOverlay.defaultProps = {\r\n children: null,\r\n};\r\n\r\nexport const TilesGridCellOverlay = withAdsStudioStyles(CellOverlay, getCellOverlayStyle);\r\n","/* eslint-disable no-unused-vars */\r\nconst getCommonCellCardStyle = palette => ({\r\n position: 'relative',\r\n flexShrink: 1,\r\n flexGrow: 1,\r\n borderRadius: 6,\r\n backgroundColor: palette.neutralLight,\r\n filter: 'drop-shadow(0px 0.6px 1.8px rgba(0, 0, 0, 0.1)) drop-shadow(0px 3.2px 7.2px rgba(0, 0, 0, 0.13))',\r\n});\r\n\r\nexport const getCellCardStyle = ({ components, core: { palette = {} } = {} } = {}) => ({\r\n cellCardContainer: {\r\n ...getCommonCellCardStyle(palette),\r\n },\r\n});\r\n\r\nexport const getCellCardWithOverlayStyle = ({ components, core: { palette = {} } = {} } = {}) => {\r\n const activeStyle = {\r\n '& .cell-overlay': {\r\n opacity: 1,\r\n\r\n '& .cell-overlay-actions': {\r\n opacity: 1,\r\n transform: 'translate(0px, -10px)',\r\n },\r\n },\r\n '& .cell-decorative-label-container': {\r\n '& .label-secondary-text': {\r\n opacity: 1,\r\n transform: 'translate(10px, 0px)',\r\n },\r\n },\r\n };\r\n return {\r\n cellCardContainer: getCommonCellCardStyle(palette),\r\n\r\n cellCardContainerOverflow: {\r\n overflow: 'hidden',\r\n },\r\n\r\n cellCardWithOverlayContainer: {\r\n '& .cell-overlay-actions': {\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'row',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n height: '100%',\r\n position: 'relative',\r\n opacity: 0.2,\r\n top: 10,\r\n transition: 'opacity 0.5s 0.1s, transform 0.3s 0.1s',\r\n },\r\n\r\n '& .static-cell-overlay-items': {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n button: 0,\r\n },\r\n\r\n '&:hover, &:focus-within': activeStyle,\r\n },\r\n focused: activeStyle,\r\n };\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { TilesGridCellOverlay } from './tiles-grid-cell-overlay';\r\nimport { withAdsStudioStyles } from '../../../theme/with-ads-studio-styles';\r\nimport {\r\n getCellCardStyle,\r\n getCellCardWithOverlayStyle,\r\n} from '../styles/tiles-grid-cell-card-style';\r\n\r\nconst CellCardWithOverlay = ({\r\n children,\r\n isOverlayEnabled,\r\n isCellFocused,\r\n renderOverlayContent,\r\n renderStaticOverlayContent,\r\n onClick,\r\n customCellCardClass,\r\n classes,\r\n}) => {\r\n const onClickFunc = (event) => {\r\n if (onClick) {\r\n onClick();\r\n }\r\n if (event && event.stopPropagation) { event.stopPropagation(); }\r\n if (event && event.preventDefault) { event.preventDefault(); }\r\n };\r\n\r\n const onKeyDown = (event) => {\r\n if (event.keyCode === 13) { // Enter key\r\n onClickFunc();\r\n }\r\n };\r\n\r\n return (\r\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\r\n <div\r\n className={classnames(\r\n 'cell-content',\r\n classes.containerClass || classes.cellCardContainer,\r\n customCellCardClass || classes.cellCardContainerOverflow,\r\n classes.cellCardWithOverlayContainer,\r\n isCellFocused && classes.focused\r\n )}\r\n onClick={onClickFunc}\r\n onKeyDown={onKeyDown}\r\n >\r\n {children}\r\n {isOverlayEnabled && (\r\n <TilesGridCellOverlay>\r\n <div className=\"cell-overlay-actions\">\r\n {renderOverlayContent ? renderOverlayContent() : null}\r\n </div>\r\n { renderStaticOverlayContent ?\r\n <div className=\"static-cell-overlay-items\">\r\n {renderStaticOverlayContent()}\r\n </div>\r\n : null}\r\n </TilesGridCellOverlay>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nCellCardWithOverlay.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n renderOverlayContent: PropTypes.func,\r\n renderStaticOverlayContent: PropTypes.func,\r\n isOverlayEnabled: PropTypes.bool,\r\n isCellFocused: PropTypes.bool,\r\n onClick: PropTypes.func,\r\n customCellCardClass: PropTypes.string,\r\n classes: PropTypes.shape({\r\n containerClass: PropTypes.string,\r\n cellCardContainer: PropTypes.string,\r\n cellCardWithOverlayContainer: PropTypes.string,\r\n cellCardContainerOverflow: PropTypes.string,\r\n focused: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nCellCardWithOverlay.defaultProps = {\r\n isOverlayEnabled: true,\r\n isCellFocused: false,\r\n renderOverlayContent: null,\r\n renderStaticOverlayContent: null,\r\n customCellCardClass: undefined,\r\n onClick: undefined,\r\n};\r\n\r\nconst CellCard = ({ children, classes, customCellCardClass }) => (\r\n <div className={classnames('cell-content', classes.containerClass || classes.cellCardContainer, customCellCardClass)} >\r\n {children}\r\n </div>\r\n);\r\n\r\nCellCard.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n customCellCardClass: PropTypes.string,\r\n classes: PropTypes.shape({\r\n containerClass: PropTypes.string,\r\n cellCardContainer: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nCellCard.defaultProps = {\r\n customCellCardClass: undefined,\r\n};\r\n\r\nexport const TilesGridCellCard = withAdsStudioStyles(CellCard, getCellCardStyle);\r\nexport const TilesGridCellCardWithOverlay = withAdsStudioStyles(CellCardWithOverlay, getCellCardWithOverlayStyle);\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Icon } from '@fluentui/react';\r\n\r\nimport { withAdsStudioStyles } from '../../../theme/with-ads-studio-styles';\r\nimport { getGridDecorativeIconStyle } from '../styles/tiles-grid-cell-decorative-icon';\r\n\r\nconst CellDecorativeIcon = ({\r\n iconName,\r\n classes,\r\n i18n,\r\n}) => (\r\n <div className={classes.centerContainer}>\r\n <div className={classes.circleContainer}>\r\n <Icon className={classes.iconContent} iconName={iconName} />\r\n <span className={classes.labelName}>{i18n.getString(_TL_('Video'))}</span>\r\n </div>\r\n </div>\r\n);\r\n\r\nCellDecorativeIcon.propTypes = {\r\n iconName: PropTypes.string.isRequired,\r\n classes: PropTypes.shape({\r\n centerContainer: PropTypes.string,\r\n circleContainer: PropTypes.string,\r\n iconContent: PropTypes.string,\r\n labelName: PropTypes.string,\r\n }),\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\nCellDecorativeIcon.defaultProps = {\r\n classes: {},\r\n};\r\n\r\nexport const TilesGridCellDecorativeIcon\r\n = withAdsStudioStyles(CellDecorativeIcon, getGridDecorativeIconStyle);\r\n","/* eslint-disable no-unused-vars */\r\nexport const getGridDecorativeIconStyle = ({ components, core: { palette = {} } = {} } = {}) => ({\r\n centerContainer: {\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n },\r\n circleContainer: {\r\n width: 80,\r\n height: 41,\r\n backgroundColor: 'rgb(50,49,48, 0.6)',\r\n borderRadius: 4,\r\n boxShadow: '0px 4px 16px rgb(0 0 0 / 14%)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n iconContent: {\r\n fontSize: 20,\r\n color: palette.white,\r\n },\r\n labelName: {\r\n fontSize: 16,\r\n color: palette.white,\r\n marginLeft: 5,\r\n },\r\n});\r\n","import { makeStyles, shorthands, tokens } from '@fluentui/react-components';\r\n\r\nexport const useGridDecorativeLabelStyle = makeStyles({\r\n tilesGridCellDecorativeLabel: {\r\n color: tokens.colorNeutralForegroundInverted,\r\n fontWeight: 600,\r\n fontSize: '12px',\r\n lineHeight: '16px',\r\n\r\n '& .label-icon-and-text': {\r\n display: 'flex',\r\n ...shorthands.borderRadius('4px'),\r\n ...shorthands.padding('2px', '8px', '2px', '4px'),\r\n marginRight: '6px',\r\n // background: 'linear-gradient(158.29deg, #0078D4 16.69%, #4400D4 85.76%)',\r\n backgroundColor: tokens.colorNeutralBackgroundStatic,\r\n '& .label-icon': {\r\n marginRight: '4px',\r\n fontSize: '16px',\r\n },\r\n },\r\n\r\n '& .label-secondary-text': {\r\n position: 'relative',\r\n left: '-10px',\r\n opacity: 0,\r\n ...shorthands.transition('opacity', '0.5s', '0.1s', 'transform', '0.3s', '0.1s'),\r\n },\r\n\r\n '& .additional-icon-content': {\r\n width: '25px',\r\n height: '24px',\r\n backgroundColor: 'rgb(50,49,48, 0.6)',\r\n ...shorthands.borderRadius('4px'),\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n display: 'flex',\r\n marginRight: '8px',\r\n position: 'absolute',\r\n right: '50px',\r\n '& .additional-icon': {\r\n width: '17px',\r\n },\r\n },\r\n\r\n '& .label-additional-text': {\r\n position: 'absolute',\r\n right: '0px',\r\n '& .label-additional-content': {\r\n backgroundColor: tokens.colorNeutralBackgroundStatic,\r\n float: 'right',\r\n ...shorthands.padding('4px'),\r\n ...shorthands.borderRadius('4px'),\r\n },\r\n },\r\n },\r\n\r\n cellLabelDisplay: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { videoIcon } from '../../../asset-images';\r\nimport { useGridDecorativeLabelStyle } from '../styles/tiles-grid-cell-decorative-label';\r\n\r\nconst CellDecorativeLabel = ({\r\n text,\r\n icon: Icon,\r\n secondaryText,\r\n additionaIconName,\r\n additionalText,\r\n customClass,\r\n}) => {\r\n const classes = useGridDecorativeLabelStyle();\r\n\r\n return (\r\n <div className={classnames('cell-decorative-label-container', classes.tilesGridCellDecorativeLabel, customClass.cellLabel || classes.cellLabelDisplay)}>\r\n {\r\n (text || Icon) && (\r\n <div className={classnames('label-icon-and-text', customClass.iconTextWrapper)}>\r\n {Icon && <Icon className=\"label-icon\" />}\r\n {text && <div className=\"label-text\">{text}</div>}\r\n </div>\r\n )\r\n }\r\n {secondaryText && <div className=\"label-secondary-text\">{secondaryText}</div>}\r\n {\r\n additionaIconName && (\r\n <div className=\"additional-icon-content\">\r\n <img src={videoIcon} className=\"additional-icon\" alt=\"\" />\r\n </div>\r\n )\r\n }\r\n {\r\n additionalText && (\r\n <div className=\"label-additional-text\">\r\n <div className=\"label-additional-content\" aria-label={additionalText} role=\"presentation\">{additionalText}</div>\r\n </div>\r\n )\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nCellDecorativeLabel.propTypes = {\r\n text: PropTypes.string,\r\n icon: PropTypes.elementType,\r\n additionaIconName: PropTypes.string,\r\n secondaryText: PropTypes.string,\r\n additionalText: PropTypes.string,\r\n customClass: PropTypes.shape({\r\n cellLabel: PropTypes.string,\r\n iconTextWrapper: PropTypes.string,\r\n }),\r\n};\r\n\r\nCellDecorativeLabel.defaultProps = {\r\n text: null,\r\n icon: null,\r\n secondaryText: '',\r\n additionalText: null,\r\n additionaIconName: null,\r\n customClass: {},\r\n};\r\n\r\nexport const TilesGridCellDecorativeLabel = CellDecorativeLabel;\r\n","/* eslint-disable max-len */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { IconButton } from '@fluentui/react';\r\n\r\nimport { withAdsStudioStyles } from '../../../theme/with-ads-studio-styles';\r\nimport { getCellDeletionButtonDecoratorStyle } from '../styles/tiles-grid-cell-deletion-button-decorator-style';\r\n\r\nconst iconProps = { iconName: 'Clear' };\r\n\r\nconst CellDeletionButtonDecorator = ({\r\n item, onDelete, children, classes,\r\n}) => {\r\n const onClick = (event) => {\r\n if (onDelete) {\r\n onDelete(item);\r\n }\r\n if (event.stopPropagation) { event.stopPropagation(); }\r\n if (event.preventDefault) { event.preventDefault(); }\r\n };\r\n\r\n return (\r\n <>\r\n {children}\r\n <div className={classnames('grid-cell-deletion-button-decorator', classes.cellDeletionButtonDecorator)}>\r\n <IconButton\r\n iconProps={iconProps}\r\n onClick={onClick}\r\n ariaLabel=\"Delete image\"\r\n disabled={false}\r\n className={classnames('delete-button', classes.deleteButton)}\r\n />\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nCellDeletionButtonDecorator.propTypes = {\r\n item: PropTypes.shape({}).isRequired,\r\n onDelete: PropTypes.func,\r\n children: PropTypes.node.isRequired,\r\n classes: PropTypes.shape({\r\n cellDeletionButtonDecorator: PropTypes.string,\r\n deleteButton: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nCellDeletionButtonDecorator.defaultProps = {\r\n onDelete: undefined,\r\n};\r\n\r\nexport const TilesGridCellDeletionButtonDecorator = withAdsStudioStyles(\r\n CellDeletionButtonDecorator,\r\n getCellDeletionButtonDecoratorStyle\r\n);\r\n","/* eslint-disable no-unused-vars */\r\nexport const getCellDeletionButtonDecoratorStyle = ({ components, core: { palette = {} } = {} } = {}) => ({\r\n cellDeletionButtonDecorator: {\r\n position: 'absolute',\r\n bottom: 8,\r\n right: 10,\r\n },\r\n deleteButton: {\r\n backgroundColor: palette.themeLighter,\r\n opacity: 0.7,\r\n zIndex: 2,\r\n padding: 0,\r\n height: 24,\r\n width: 24,\r\n '&:hover': {\r\n opacity: 0.9,\r\n },\r\n '&:active': {\r\n opacity: 1,\r\n },\r\n '& .ms-Button-icon': {\r\n margin: 0,\r\n },\r\n },\r\n});\r\n","const positionFill = {\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n};\r\n\r\nexport const getTilesGridCellImageStyles = () => ({\r\n tilesGridCellImageContainer: {\r\n '& .cell-image-state': {\r\n ...positionFill,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n },\r\n imageStateOverlayClass: {\r\n position: 'absolute',\r\n width: '100%',\r\n height: '100%',\r\n top: 0,\r\n left: 0,\r\n },\r\n stateParent: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '100%',\r\n height: '100%',\r\n },\r\n reloadBtn: {\r\n zIndex: 1,\r\n },\r\n});\r\n","import React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { noop } from 'underscore';\r\nimport classnames from 'classnames';\r\n\r\nimport { Image as FluentImage, ImageFit, ImageLoadState } from '@fluentui/react';\r\nimport { ArrowClockwiseRegular } from '@fluentui/react-icons';\r\n\r\nimport { AdsStudioSpinner } from '../../ads-studio-spinner';\r\nimport { withAdsStudioStyles } from '../../../theme/with-ads-studio-styles';\r\nimport { TilesGridCellActionButton as ActionButton } from './tiles-grid-cell-action-button';\r\nimport { getTilesGridCellImageStyles } from '../styles/tiles-grid-cell-image';\r\n\r\nconst RETRY_COUNT = 3;\r\nconst RETRY_DEALY = 1000;\r\n\r\nconst CellImage = ({\r\n src,\r\n alt,\r\n showSpinner,\r\n onLoaded,\r\n onError,\r\n i18n,\r\n onClick,\r\n enableRetry,\r\n classes,\r\n customClasses,\r\n onCustomizedSpinner,\r\n imageFit,\r\n}) => {\r\n //\r\n const [imageLoadState, setImageLoadState] = useState(ImageLoadState.notLoaded);\r\n\r\n const onLoadingStateChange = useCallback((s, onLoadError) => {\r\n if (s === ImageLoadState.loaded) {\r\n onLoaded(true);\r\n } else if (s === ImageLoadState.error) {\r\n onLoadError();\r\n // don't set error state until all retrying are failed\r\n return;\r\n }\r\n setImageLoadState(s);\r\n }, [onLoaded]);\r\n\r\n // retry image loading by creating a HTML Image element\r\n const reloadImage = useCallback((onLoadError) => {\r\n const img = new Image();\r\n img.onerror = () => {\r\n onLoadingStateChange(ImageLoadState.error, onLoadError);\r\n };\r\n img.onload = () => {\r\n onLoadingStateChange(ImageLoadState.loaded);\r\n };\r\n onLoadingStateChange(ImageLoadState.notLoaded);\r\n img.src = src;\r\n }, [onLoadingStateChange, src]);\r\n\r\n const onErrorWithRetry = useCallback((retryCount = RETRY_COUNT) => {\r\n if (enableRetry && retryCount > 0) {\r\n setTimeout(() => reloadImage(() => onErrorWithRetry(retryCount - 1)), RETRY_DEALY);\r\n } else {\r\n setImageLoadState(ImageLoadState.error);\r\n if (onError) {\r\n onError();\r\n }\r\n }\r\n }, [enableRetry, onError, reloadImage]);\r\n\r\n const onReloadImage = useCallback((event) => {\r\n if (imageLoadState === ImageLoadState.error) {\r\n reloadImage(onErrorWithRetry);\r\n }\r\n if (event.stopPropagation) { event.stopPropagation(); }\r\n if (event.preventDefault) { event.preventDefault(); }\r\n }, [imageLoadState, onErrorWithRetry, reloadImage]);\r\n\r\n const onImageLoadingStateChange = useCallback((s) => {\r\n onLoadingStateChange(s, onErrorWithRetry);\r\n }, [onErrorWithRetry, onLoadingStateChange]);\r\n\r\n\r\n return (\r\n <div className={classnames('cell-image-frame', classes.tilesGridCellImageContainer, customClasses.containerClass)}>\r\n <div className={classnames('cell-image-state', classes.imageStateOverlayClass)}>\r\n <div className={classes.stateParent}>\r\n {imageLoadState === ImageLoadState.notLoaded && showSpinner && (onCustomizedSpinner ?\r\n onCustomizedSpinner() : (<AdsStudioSpinner />))\r\n }\r\n { imageLoadState === ImageLoadState.error && (\r\n <ActionButton\r\n text={i18n.getString(_TL_('Reload'))}\r\n icon={ArrowClockwiseRegular}\r\n onClick={onReloadImage}\r\n primary={false}\r\n className={classnames('reload-button', classes.reloadBtn)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n <FluentImage\r\n className={classnames('cell-main-image', customClasses.imageClass)}\r\n imageFit={imageFit}\r\n src={src}\r\n alt={alt}\r\n maximizeFrame\r\n onLoadingStateChange={onImageLoadingStateChange}\r\n onClick={onClick}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nCellImage.propTypes = {\r\n src: PropTypes.string.isRequired,\r\n alt: PropTypes.string.isRequired,\r\n showSpinner: PropTypes.bool,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n onLoaded: PropTypes.func,\r\n onError: PropTypes.func,\r\n onClick: PropTypes.func,\r\n onCustomizedSpinner: PropTypes.func,\r\n enableRetry: PropTypes.bool,\r\n classes: PropTypes.shape({\r\n tilesGridCellImageContainer: PropTypes.string,\r\n imageStateOverlayClass: PropTypes.string,\r\n stateParent: PropTypes.string,\r\n reloadBtn: PropTypes.string,\r\n }).isRequired,\r\n customClasses: PropTypes.shape({\r\n containerClass: PropTypes.string,\r\n imageClass: PropTypes.string,\r\n }),\r\n imageFit: PropTypes.number,\r\n};\r\n\r\nCellImage.defaultProps = {\r\n showSpinner: true,\r\n onLoaded: noop,\r\n onError: noop,\r\n onClick: noop,\r\n enableRetry: true,\r\n customClasses: {},\r\n onCustomizedSpinner: undefined,\r\n imageFit: ImageFit.cover,\r\n};\r\n\r\nexport const TilesGridCellImage = withAdsStudioStyles(CellImage, getTilesGridCellImageStyles);\r\n","import { makeResetStyles, shorthands, tokens } from '@fluentui/react-components';\r\n\r\nexport const useCellSectionDecoratorStyle = makeResetStyles({\r\n width: '100%',\r\n height: '100%',\r\n '& .grid-cell-selection-decorator': {\r\n width: '100%',\r\n height: '100%',\r\n ...shorthands.overflow('hidden'),\r\n },\r\n '& .selected-checkbox': {\r\n position: 'absolute',\r\n top: '6px',\r\n right: '6px',\r\n },\r\n '& .selectedState': {\r\n outlineStyle: 'solid',\r\n outlineWidth: '4px',\r\n outlineColor: tokens.colorBrandBackground,\r\n ...shorthands.borderRadius('6px'),\r\n },\r\n '& .checkbox': {\r\n backgroundColor: tokens.colorNeutralForegroundInverted,\r\n zIndex: 2,\r\n width: '20px',\r\n height: '20px',\r\n ...shorthands.borderRadius(tokens.borderRadiusSmall),\r\n '& .fui-Checkbox__indicator': {\r\n width: '20px',\r\n height: '20px',\r\n ...shorthands.margin(0),\r\n },\r\n },\r\n});\r\n","/* eslint-disable jsx-a11y/no-static-element-interactions */\r\n/* eslint-disable jsx-a11y/click-events-have-key-events */\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Checkbox, mergeClasses } from '@fluentui/react-components';\r\n\r\nimport { useCellSectionDecoratorStyle } from '../styles/tiles-grid-cell-selection-decorator-style';\r\n\r\nexport const TilesGridCellSelectionDecorator = ({\r\n item, selected, onClick, children, ariaLabel, isFocused, classes,\r\n}) => {\r\n const onClickFunc = (event) => {\r\n if (onClick) {\r\n onClick({ item, selected });\r\n }\r\n if (event.stopPropagation) { event.stopPropagation(); }\r\n if (event.preventDefault) { event.preventDefault(); }\r\n };\r\n\r\n const onKeyDown = (event) => {\r\n if (event.keyCode === 13) { // Enter key\r\n onClickFunc(event);\r\n }\r\n };\r\n\r\n const cellSelectionDecoratorWrapper = useCellSectionDecoratorStyle();\r\n\r\n return (\r\n <div className={mergeClasses(\r\n classes.cellSelectionDecoratorWrapper,\r\n cellSelectionDecoratorWrapper,\r\n 'grid-cell-selection-decorator-wrapper',\r\n selected && classes.selectedStateWrapper,\r\n selected ? 'selectedStateWrapper' : ''\r\n )}\r\n >\r\n <div\r\n className={mergeClasses(classes.cellSelectionDecorator, 'grid-cell-selection-decorator', selected && classes.selectedState, selected ? 'selectedState' : '')}\r\n onClick={onClickFunc}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={onKeyDown}\r\n >\r\n {children}\r\n </div>\r\n <div\r\n className={mergeClasses('selected-checkbox', isFocused && 'visible-checkbox')}\r\n onClick={onClickFunc}\r\n >\r\n <Checkbox\r\n checked={selected}\r\n ariaLabel={ariaLabel}\r\n className=\"checkbox\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nTilesGridCellSelectionDecorator.propTypes = {\r\n item: PropTypes.shape({}).isRequired,\r\n selected: PropTypes.bool.isRequired,\r\n onClick: PropTypes.func,\r\n children: PropTypes.node.isRequired,\r\n classes: PropTypes.shape({\r\n cellSelectionDecorator: PropTypes.string,\r\n cellSelectionDecoratorWrapper: PropTypes.string,\r\n selectedState: PropTypes.string,\r\n selectedStateWrapper: PropTypes.string,\r\n }),\r\n ariaLabel: PropTypes.string,\r\n isFocused: PropTypes.bool,\r\n};\r\n\r\nTilesGridCellSelectionDecorator.defaultProps = {\r\n onClick: undefined,\r\n ariaLabel: '',\r\n isFocused: false,\r\n classes: {},\r\n};\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const TilesGridLoadingCell = ({\r\n onLoading, containerClass, children,\r\n}) => {\r\n const gridCellContent = useRef(null);\r\n const [hasSetUpObserver, setHasSetUpObserver] = useState(false);\r\n const onLoadingCalled = useRef(false);\r\n\r\n const observer = useMemo(() => {\r\n onLoadingCalled.current = false;\r\n if (window.IntersectionObserver && onLoading) {\r\n return new IntersectionObserver((entries) => {\r\n const [entry] = entries || [];\r\n\r\n if (entry && entry.isIntersecting && onLoading && !onLoadingCalled.current) {\r\n onLoading();\r\n onLoadingCalled.current = true;\r\n\r\n if (entry && entry.target) {\r\n observer.unobserve(entry.target);\r\n }\r\n }\r\n }, {\r\n root: null,\r\n rootMargin: '0px',\r\n threshold: 0.0,\r\n });\r\n }\r\n return null;\r\n }, [onLoading]);\r\n\r\n useEffect(() => {\r\n if (observer && gridCellContent.current && !hasSetUpObserver) {\r\n observer.observe(gridCellContent.current);\r\n setHasSetUpObserver(true);\r\n }\r\n }, [observer, gridCellContent, hasSetUpObserver]);\r\n\r\n return (\r\n <div ref={gridCellContent} className={containerClass}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nTilesGridLoadingCell.propTypes = {\r\n onLoading: PropTypes.func,\r\n children: PropTypes.node,\r\n containerClass: PropTypes.string,\r\n};\r\n\r\nTilesGridLoadingCell.defaultProps = {\r\n onLoading: null,\r\n children: null,\r\n containerClass: undefined,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nconst commonStyles = {\r\n boxShadow: '0px 1.47522px 4.42567px rgba(0, 0, 0, 0.2), inset 0.295044px -0.295044px 0.590089px rgba(0, 0, 0, 0.2), inset -0.590089px 0.590089px 1.47522px rgba(255, 255, 255, 0.3)',\r\n ...shorthands.borderRadius('2px'),\r\n};\r\n\r\nexport const useFolderIconStyle = makeStyles({\r\n folderIconContainer: {\r\n position: 'relative',\r\n height: '52px',\r\n width: '68px',\r\n\r\n '& .folder-tag': {\r\n width: '50%',\r\n height: '28.36%',\r\n ...commonStyles,\r\n },\r\n\r\n '& .folder-content': {\r\n width: '100%',\r\n height: '85.84%',\r\n ...commonStyles,\r\n\r\n position: 'absolute',\r\n left: 0,\r\n bottom: 0,\r\n ...shorthands.overflow('hidden'),\r\n },\r\n },\r\n folderTag: {\r\n backgroundColor: '#1F65F1',\r\n },\r\n emptyFolderTag: {\r\n backgroundColor: '#A0A0A0',\r\n },\r\n folderContent: {\r\n backgroundColor: '#1F65F1',\r\n },\r\n emptyFolderContent: {\r\n backgroundColor: '#C4C4C4',\r\n },\r\n});\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { mergeClasses, Image } from '@fluentui/react-components';\r\n\r\nimport { useFolderIconStyle } from './style';\r\n\r\nconst FolderIconInternal = ({\r\n thumbnailImageUrl, isEmptyFolder, folderIconRootClassName,\r\n}) => {\r\n const classes = useFolderIconStyle();\r\n return (\r\n <div className={mergeClasses(classes.folderIconContainer, folderIconRootClassName)}>\r\n <div className={mergeClasses('folder-tag', isEmptyFolder ? classes.emptyFolderTag : classes.folderTag)} />\r\n <div className={mergeClasses('folder-content', isEmptyFolder ? classes.emptyFolderContent : classes.folderContent)} >\r\n { thumbnailImageUrl && <Image\r\n fit=\"cover\"\r\n src={thumbnailImageUrl}\r\n alt=\"folder icon\"\r\n />}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nFolderIconInternal.propTypes = {\r\n thumbnailImageUrl: PropTypes.string,\r\n folderIconRootClassName: PropTypes.string,\r\n isEmptyFolder: PropTypes.bool,\r\n};\r\n\r\nFolderIconInternal.defaultProps = {\r\n thumbnailImageUrl: undefined,\r\n folderIconRootClassName: '',\r\n isEmptyFolder: false,\r\n};\r\n\r\nexport const FolderIcon = FolderIconInternal;\r\n","import { makeStyles } from '@fluentui/react-components';\r\n\r\nexport const useCellSectionDecoratorStyle = makeStyles({\r\n dragPreview: {\r\n width: '100px',\r\n height: '100px',\r\n display: 'block',\r\n position: 'relative',\r\n },\r\n dragPreviewImage: {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n opacity: 0.5,\r\n },\r\n dragPreviewFolderWrapper: {\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n },\r\n dragPreviewFolder: {\r\n width: '100px',\r\n height: '76px',\r\n },\r\n dragPreviewCount: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n textAlign: 'center',\r\n verticalAlign: 'middle',\r\n width: '100px',\r\n height: '100px',\r\n lineHeight: '100px',\r\n backgroundColor: 'rgba(0,0,0,0.5)',\r\n color: 'white',\r\n fontSize: '14px',\r\n },\r\n});\r\n","import React, { useCallback, useMemo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { FolderIcon } from '../../folder-icon-component';\r\nimport { useCellSectionDecoratorStyle } from '../styles/tiles-grid-cell-drag-decorator-style';\r\n\r\nexport const TilesGridCellDragDecorator = ({\r\n draggable,\r\n children,\r\n item,\r\n dragItemsLength,\r\n onDrag,\r\n i18n,\r\n selected,\r\n}) => {\r\n const classes = useCellSectionDecoratorStyle();\r\n\r\n const dragPreviewDescription = useMemo(() => {\r\n let dragItemsLengthInner = dragItemsLength;\r\n if (!selected) {\r\n dragItemsLengthInner += 1;\r\n }\r\n if (dragItemsLengthInner > 1) {\r\n return i18n.getString(_TL_('{{dragItemsLength}} items'), { dragItemsLength: dragItemsLengthInner });\r\n }\r\n return i18n.getString(_TL_('1 item'));\r\n }, [dragItemsLength, i18n, selected]);\r\n\r\n const renderDragPreview = useCallback(() => (\r\n <div className={classes.dragPreview}>\r\n {\r\n item.url || item.thumbnailUrl ? (\r\n <img\r\n src={item.thumbnailUrl || item.url}\r\n className={classes.dragPreviewImage}\r\n alt=\"drag preview\"\r\n />\r\n ) : (\r\n <div className={classes.dragPreviewFolderWrapper}>\r\n <FolderIcon\r\n folderIconRootClassName={classes.dragPreviewFolder}\r\n isEmptyFolder={false}\r\n />\r\n </div>\r\n )\r\n }\r\n <div className={classes.dragPreviewCount}>{dragPreviewDescription}</div>\r\n </div>\r\n ), [classes, dragPreviewDescription, item.thumbnailUrl, item.url]);\r\n\r\n const onDragStart = useCallback((event) => {\r\n onDrag({ item });\r\n const container = document.createElement('div');\r\n const DragPreview = renderDragPreview;\r\n ReactDOM.render(<DragPreview />, container);\r\n const domElement = container.firstChild;\r\n document.body.appendChild(domElement);\r\n\r\n if (event && event.dataTransfer && event.dataTransfer.setDragImage) {\r\n event.dataTransfer.setDragImage(domElement, 0, 0);\r\n }\r\n }, [item, onDrag, renderDragPreview]);\r\n\r\n return (\r\n draggable ?\r\n <div\r\n className={classnames('grid-cell-drag-drop-decorator')}\r\n onDragStart={onDragStart}\r\n draggable\r\n >\r\n {children}\r\n </div> : children\r\n );\r\n};\r\n\r\nTilesGridCellDragDecorator.propTypes = {\r\n draggable: PropTypes.bool,\r\n children: PropTypes.node.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n item: PropTypes.shape({}),\r\n onDrag: PropTypes.func,\r\n dragItemsLength: PropTypes.number,\r\n selected: PropTypes.bool,\r\n};\r\n\r\nTilesGridCellDragDecorator.defaultProps = {\r\n draggable: false,\r\n item: {},\r\n onDrag: () => null,\r\n dragItemsLength: 1,\r\n selected: false,\r\n};\r\n","import { makeResetStyles, tokens } from '@fluentui/react-components';\r\n\r\nexport const useFolderGridCellDropStyle = makeResetStyles({\r\n outlineOffset: '6px',\r\n outlineStyle: 'dashed',\r\n outlineWidth: '2px',\r\n outlineColor: tokens.colorBrandBackground,\r\n});\r\n","import React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nimport { useFolderGridCellDropStyle } from '../styles/tiles-grid-cell-drop-decorator-style';\r\n\r\nexport const TilesGridCellDropDecorator = ({\r\n children,\r\n droppable,\r\n onDrop,\r\n customClassName,\r\n}) => {\r\n const [isOver, setIsOver] = useState(false);\r\n\r\n const tilesGridCellDropOver = useFolderGridCellDropStyle();\r\n\r\n const onDragOver = useCallback((event) => {\r\n event.preventDefault();\r\n setIsOver(true);\r\n }, []);\r\n\r\n const onDragLeave = useCallback(() => {\r\n setIsOver(false);\r\n }, []);\r\n\r\n const onDropHandler = useCallback((event) => {\r\n event.preventDefault();\r\n setIsOver(false);\r\n onDrop();\r\n }, [onDrop]);\r\n\r\n return (\r\n droppable ? (\r\n <div\r\n onDragOver={onDragOver}\r\n onDragLeave={onDragLeave}\r\n onDrop={onDropHandler}\r\n className={classNames('dropZone', isOver ? (customClassName || tilesGridCellDropOver) : '')}\r\n >\r\n {children}\r\n </div>\r\n ) : children\r\n );\r\n};\r\n\r\nTilesGridCellDropDecorator.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n droppable: PropTypes.bool,\r\n onDrop: PropTypes.func,\r\n customClassName: PropTypes.string,\r\n};\r\n\r\nTilesGridCellDropDecorator.defaultProps = {\r\n droppable: false,\r\n onDrop: () => null,\r\n customClassName: '',\r\n};\r\n","import { DEFAULT_PAGE_SIZE } from '../../model';\r\n\r\nconst ROW_HEIGHT = 275;\r\nconst MAX_COLUMN_WIDTH = 350;\r\nconst MIN_COLUMN_WIDTH = 250;\r\nconst DEFAULT_ASPECT_RATIO = 0.9;\r\n\r\nexport const DEFAULT_CONFIG = {\r\n // if this value is set, rowHeight vallue is ignored, and\r\n // the row height is calculated by columnWidth * aspectRatio\r\n aspectRatio: DEFAULT_ASPECT_RATIO,\r\n maxColumnWidth: MAX_COLUMN_WIDTH,\r\n minColumnWidth: MIN_COLUMN_WIDTH,\r\n rowHeight: ROW_HEIGHT,\r\n preferredCellsPerPage: DEFAULT_PAGE_SIZE,\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nimport { Grid } from '@bingads-webui-campaign-react/ads-studio-shared-components';\r\nimport { withAdsStudioStyles } from '../../theme/with-ads-studio-styles';\r\n\r\nimport { getTilesGridStyle } from './styles/tiles-grid-style';\r\nimport { DEFAULT_CONFIG } from './default-grid-config';\r\n\r\n\r\nconst TilesGridInternal = ({\r\n items,\r\n onRenderCell,\r\n config,\r\n classes,\r\n}) => {\r\n const onRenderCellImpl = useCallback((gridItem) => {\r\n const { item } = gridItem;\r\n const { _index } = item;\r\n return (\r\n <div className=\"tiles-grid-cell\">\r\n {onRenderCell({ item, index: _index })}\r\n </div>\r\n );\r\n }, [onRenderCell]);\r\n\r\n return (\r\n <div className={classNames('tiles-grid-container', classes.tilesGridContainer)}>\r\n <Grid\r\n items={items}\r\n renderItem={onRenderCellImpl}\r\n columnWidth={config.width || undefined}\r\n rowHeight={config.height || undefined}\r\n gridMode={config.gridMode || undefined}\r\n columnPadding={config.columnPadding || undefined}\r\n rowPadding={config.rowPadding || undefined}\r\n scrollContainer={config.scrollContainer}\r\n maxColumns={config.maxColumns}\r\n minItemHeight={config.minItemHeight}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nTilesGridInternal.propTypes = {\r\n items: PropTypes.arrayOf(PropTypes.shape({})),\r\n onRenderCell: PropTypes.func.isRequired,\r\n config: PropTypes.shape({\r\n aspectRatio: PropTypes.number,\r\n maxColumnWidth: PropTypes.number,\r\n minColumnWidth: PropTypes.number,\r\n rowHeight: PropTypes.number,\r\n preferredCellsPerPage: PropTypes.number,\r\n columnPadding: PropTypes.number,\r\n }),\r\n // injected styles\r\n classes: PropTypes.shape({\r\n tilesGridContainer: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nTilesGridInternal.defaultProps = {\r\n items: [],\r\n config: DEFAULT_CONFIG,\r\n};\r\n\r\nexport const TilesGrid = withAdsStudioStyles(TilesGridInternal, getTilesGridStyle);\r\n","export const getTilesGridStyle = () => ({\r\n tilesGridContainer: {\r\n // grid styles\r\n '& .tiles-grid': {\r\n overflow: 'hidden',\r\n position: 'relative',\r\n '& .ms-List-page': {\r\n overflowX: 'hidden',\r\n },\r\n },\r\n\r\n '& .tiles-grid-list-cell': {\r\n float: 'left', // make the cells shown as grid style\r\n },\r\n\r\n // cell styles\r\n '& .tiles-grid-cell': {\r\n position: 'relative',\r\n boxSizing: 'border-box',\r\n width: '100%',\r\n height: '100%',\r\n },\r\n },\r\n});\r\n","/* eslint-disable max-len */\r\nimport _ from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { TilesGrid } from './tiles-grid';\r\n\r\nfunction findItem(items, itemToFind, itemKey) {\r\n return _.find(items, item => item[itemKey] === itemToFind[itemKey]);\r\n}\r\n\r\nfunction addItem(items, itemToAdd, itemKey) {\r\n if (!findItem(items, itemToAdd, itemKey)) {\r\n return [[...items, itemToAdd], true];\r\n }\r\n return [items, false];\r\n}\r\n\r\nfunction removeItem(items, itemToRemove, itemKey) {\r\n if (findItem(items, itemToRemove, itemKey)) {\r\n return [_.filter(items, item => item[itemKey] !== itemToRemove[itemKey]), true];\r\n }\r\n return [items, false];\r\n}\r\n\r\nexport const MultiSelectionGrid = ({\r\n itemKey,\r\n onSelectionChange,\r\n onRenderCell,\r\n items,\r\n selectedItems: propSelectedItems,\r\n ...rest\r\n}) => {\r\n const selectedItems = useMemo(() => propSelectedItems || [], [propSelectedItems]);\r\n\r\n // force to re-render when selection changed\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n const allItems = useMemo(() => ([...items || []]), [items, selectedItems]);\r\n\r\n const selectItem = useCallback((item, selected) => {\r\n const action = selected ? addItem : removeItem;\r\n const [newSelectedItems, updated] = action(selectedItems, item, itemKey);\r\n if (updated) {\r\n if (onSelectionChange) {\r\n onSelectionChange({ item, selected, selectedItems: newSelectedItems });\r\n }\r\n }\r\n }, [itemKey, onSelectionChange, selectedItems]);\r\n\r\n const onRenderCellImpl = useCallback(({ item, index }) => {\r\n const selected = !!findItem(selectedItems, item, itemKey);\r\n const fnSelectItem = _.partial(selectItem, item);\r\n return onRenderCell({\r\n item, index, selected, selectItem: fnSelectItem,\r\n });\r\n }, [itemKey, onRenderCell, selectItem, selectedItems]);\r\n\r\n return <TilesGrid onRenderCell={onRenderCellImpl} items={allItems} config={rest.config} />;\r\n};\r\n\r\nMultiSelectionGrid.propTypes = {\r\n itemKey: PropTypes.string,\r\n items: PropTypes.arrayOf(PropTypes.shape({})),\r\n selectedItems: PropTypes.arrayOf(PropTypes.shape({})),\r\n onSelectionChange: PropTypes.func,\r\n onRenderCell: PropTypes.func.isRequired,\r\n};\r\n\r\nMultiSelectionGrid.defaultProps = {\r\n itemKey: 'id',\r\n items: [],\r\n selectedItems: [],\r\n onSelectionChange: undefined,\r\n};\r\n","export const getSectionTilesGridStyle = () => ({\r\n sectionTilesGridContainer: {\r\n '& .section-title': {\r\n fontSize: 12,\r\n fontWeight: 400,\r\n lineHeight: '16px',\r\n color: '#424242',\r\n marginBottom: 8,\r\n marginTop: 8,\r\n '&:first-child': {\r\n marginTop: 0,\r\n },\r\n },\r\n '& .section-loading': {\r\n margin: 'auto',\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\nimport React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\nimport { MultiSelectionGrid } from './multi-selection-grid';\r\nimport { getSectionTilesGridStyle } from './styles/section-tiles-grid-style';\r\nimport { TilesGrid } from './tiles-grid';\r\nimport { TilesGridLoadingCell } from './grid-cells';\r\nimport { withAdsStudioStyles } from '../../theme/with-ads-studio-styles';\r\n\r\nconst SectionTilesGridInternal = ({\r\n sectionData, onRenderCell, loadNextPage, multiSelectionEnabled, onSelectionChange, onRenderLoadingCell, classes, ...otherProps\r\n}) => {\r\n const wrappedSectionData = useMemo(() => sectionData.map(section => ({\r\n onRenderCell: (params) => {\r\n const { sectionName } = section || {};\r\n return onRenderCell({ ...params, sectionName });\r\n },\r\n // to support selectoin on grid\r\n onSelectionChange: onSelectionChange ?\r\n (params) => {\r\n const { sectionName } = section || {};\r\n onSelectionChange({ ...params, sectionName });\r\n } : undefined,\r\n onRenderLoadingCell: () => {\r\n const { items, totalItemCount } = section || {};\r\n if (onRenderLoadingCell) {\r\n return onRenderLoadingCell({ items, totalItemCount });\r\n }\r\n if (items.length > 0 && items.length < totalItemCount) {\r\n return <TilesGridLoadingCell onLoading={loadNextPage} key={items.length} ><div className=\"section-loading\"><AdsStudioSpinner useCustomSize /></div></TilesGridLoadingCell>;\r\n }\r\n return null;\r\n },\r\n ...section,\r\n })), [loadNextPage, onRenderCell, onRenderLoadingCell, onSelectionChange, sectionData]);\r\n\r\n // don't show section title if only one section has data\r\n const countOfSectionsWithData =\r\n _.filter(sectionData, sec => sec.totalItemCount > 0).length;\r\n\r\n const GridComponent = multiSelectionEnabled ? MultiSelectionGrid : TilesGrid;\r\n\r\n return (\r\n <div className={classnames(classes.sectionTilesGridContainer, classes.gridConainerClass)}>\r\n {wrappedSectionData.map(({\r\n sectionName,\r\n sectionTitle,\r\n sectionClassName,\r\n items,\r\n config,\r\n totalItemCount,\r\n ...rest\r\n }) => (\r\n (items && items.length >= 0) ?\r\n <div\r\n key={sectionName}\r\n className={classnames(sectionClassName, 'tiles-grid-section')}\r\n >\r\n {countOfSectionsWithData > 1 && items.length > 0 ? <div className=\"section-title\" role=\"heading\" aria-level=\"2\">{sectionTitle}</div> : null}\r\n {\r\n items.length > 0 &&\r\n <GridComponent\r\n items={items}\r\n {...rest}\r\n {...otherProps}\r\n config={config}\r\n />\r\n }\r\n {\r\n rest.onRenderLoadingCell()\r\n }\r\n </div>\r\n : null\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nSectionTilesGridInternal.propTypes = {\r\n sectionData: PropTypes.arrayOf(PropTypes.shape({\r\n sectionName: PropTypes.string,\r\n sectionTitle: PropTypes.string,\r\n sectionClassName: PropTypes.string,\r\n items: PropTypes.arrayOf(PropTypes.shape({})),\r\n selectedItems: PropTypes.arrayOf(PropTypes.shape({})), // to support multiple selection\r\n totalItemCount: PropTypes.number, // total item count, including not loaded items\r\n config: PropTypes.shape({\r\n aspectRatio: PropTypes.number,\r\n maxColumnWidth: PropTypes.number,\r\n minColumnWidth: PropTypes.number,\r\n rowHeight: PropTypes.number,\r\n preferredCellsPerPage: PropTypes.number,\r\n }),\r\n })).isRequired,\r\n onRenderCell: PropTypes.func.isRequired,\r\n loadNextPage: PropTypes.func,\r\n\r\n multiSelectionEnabled: PropTypes.bool,\r\n onSelectionChange: PropTypes.func,\r\n onRenderLoadingCell: PropTypes.func,\r\n\r\n classes: PropTypes.shape({\r\n sectionTilesGridContainer: PropTypes.string,\r\n gridConainerClass: PropTypes.string,\r\n }).isRequired,\r\n};\r\n\r\nSectionTilesGridInternal.defaultProps = {\r\n multiSelectionEnabled: false,\r\n onSelectionChange: undefined,\r\n loadNextPage: _.noop,\r\n onRenderLoadingCell: undefined,\r\n};\r\n\r\nexport const SectionTilesGrid = withAdsStudioStyles(SectionTilesGridInternal, getSectionTilesGridStyle);\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const useStyle = makeStyles({\r\n overflow: {\r\n display: 'block',\r\n ...shorthands.overflow('hidden'),\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n },\r\n});\r\n","/* eslint-disable object-curly-newline */\r\nimport _ from 'underscore';\r\nimport React from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { Tooltip, mergeClasses } from '@fluentui/react-components';\r\nimport { useStyle } from './styles';\r\n\r\nexport const splitString = (text, substr) => {\r\n //\r\n if (!text || !substr || _.isEmpty(substr)) {\r\n return [{ matched: false, text, idx: 0 }];\r\n }\r\n\r\n // case-insensitive\r\n const lowerText = text.toLowerCase();\r\n const lowerSubstr = substr.toLowerCase();\r\n\r\n let startIndex = 0;\r\n const fragments = [];\r\n\r\n while (startIndex < text.length) {\r\n const index = lowerText.indexOf(lowerSubstr, startIndex);\r\n if (index === -1) {\r\n fragments.push({ matched: false, text: text.substring(startIndex) });\r\n break;\r\n } else if (index > startIndex) {\r\n fragments.push({ matched: false, text: text.substring(startIndex, index) });\r\n fragments.push({ matched: true, text: text.substring(index, index + substr.length) });\r\n startIndex = index + substr.length;\r\n } else {\r\n fragments.push({ matched: true, text: text.substring(index, index + substr.length) });\r\n startIndex = index + substr.length;\r\n }\r\n }\r\n\r\n // add an idx field for each fragment\r\n const fragmentsWithIndex = fragments.map((f, idx) => ({ ...f, idx }));\r\n return fragmentsWithIndex;\r\n};\r\n\r\nexport const TextWithHighlightImp = ({\r\n text: txt, highlightedText, highlightedClassname, enableTooltip,\r\n}) => {\r\n const textFragments = splitString(txt, highlightedText);\r\n\r\n const content = (\r\n <span className=\"highlight-text-content\">\r\n {\r\n textFragments.map(({ matched, text, idx }) =>\r\n <span key={`f${idx}`} className={matched ? mergeClasses('highlighted-text', highlightedClassname) : 'normal-text'}>{text}</span>)\r\n }\r\n </span>\r\n );\r\n\r\n const classes = useStyle();\r\n\r\n return enableTooltip ? (\r\n <Tooltip\r\n content={<span className=\"highlight-tooltip-content\">{txt}</span>}\r\n relationship=\"inaccessible\"\r\n withArrow\r\n positioning=\"above-start\"\r\n >\r\n <div className={classes.overflow}>\r\n {content}\r\n </div>\r\n </Tooltip>\r\n ) : content;\r\n};\r\n\r\nTextWithHighlightImp.propTypes = {\r\n text: PropTypes.string,\r\n highlightedText: PropTypes.string,\r\n highlightedClassname: PropTypes.string,\r\n enableTooltip: PropTypes.bool,\r\n};\r\n\r\nTextWithHighlightImp.defaultProps = {\r\n text: '',\r\n highlightedText: undefined,\r\n highlightedClassname: 'highlighted-text',\r\n enableTooltip: false,\r\n};\r\n\r\nexport const TextWithHighlight = TextWithHighlightImp;\r\n","import { shorthands, tokens } from '@fluentui/react-components';\r\n\r\nexport const positionFill = {\r\n position: 'absolute',\r\n left: 0,\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n};\r\n\r\nexport const getSharedAssetContainerStyle = () => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexWrap: 'nowrap',\r\n boxSizing: 'border-box',\r\n\r\n // name and ID\r\n '& .cell-description': {\r\n display: 'flex',\r\n flexShrink: 0,\r\n flexGrow: 0,\r\n justifyContent: 'space-between',\r\n fontWeight: 600,\r\n fontSize: '12px',\r\n ...shorthands.margin('12px', '4px'),\r\n\r\n '& .cell-description-name': {\r\n flexShrink: 1,\r\n flexGrow: 1,\r\n ...shorthands.overflow('hidden'),\r\n marginRight: '12px',\r\n },\r\n\r\n '& .cell-description-id': {\r\n flexShrink: 0,\r\n flexGrow: 0,\r\n },\r\n\r\n '& .highlighted-text': {\r\n backgroundColor: tokens.colorPaletteYellowBackground3,\r\n },\r\n },\r\n});\r\n\r\nexport const getSharedMultiSelectingCellStyles = () => ({\r\n // only show checkbox on overlay if it is NOT in multi-selecting mode\r\n selectableCardContainerAutoHideCheckbox: {\r\n '& .cell-image-frame': {\r\n ...shorthands.overflow('hidden'),\r\n ...shorthands.borderRadius('6px'),\r\n },\r\n\r\n '& .selected-checkbox': {\r\n visibility: 'hidden',\r\n },\r\n\r\n '&:hover': {\r\n '& .selected-checkbox': {\r\n visibility: 'visible',\r\n // '& .ms-Checkbox-checkbox': {\r\n // ...shorthands.border('2px solid white !important'),\r\n // },\r\n '& .ms-Checkbox-checkmark': {\r\n color: tokens.colorNeutralForegroundInverted,\r\n },\r\n },\r\n },\r\n\r\n '& .visible-checkbox': {\r\n visibility: 'visible',\r\n // '& .ms-Checkbox-checkbox': {\r\n // border: '2px solid white !important',\r\n // },\r\n '& .ms-Checkbox-checkmark': {\r\n color: tokens.colorNeutralForegroundInverted,\r\n },\r\n },\r\n },\r\n\r\n selectableCardContainer: {\r\n '& .cell-image-frame': {\r\n ...shorthands.overflow('hidden'),\r\n ...shorthands.borderRadius('6px'),\r\n },\r\n\r\n '& .selected-checkbox': {\r\n visibility: 'visible',\r\n // '& .ms-Checkbox-checkbox': {\r\n // border: '2px solid white !important',\r\n // },\r\n '& .ms-Checkbox-checkmark': {\r\n color: tokens.colorNeutralForegroundInverted,\r\n },\r\n },\r\n },\r\n});\r\n","import { makeResetStyles, shorthands, tokens } from '@fluentui/react-components';\r\nimport { positionFill } from './../shared-cell-style';\r\n\r\n/* eslint-disable no-unused-vars */\r\nexport const iconStyles = {\r\n root: {\r\n position: 'relative',\r\n top: '3px',\r\n marginLeft: '12px',\r\n marginRight: '5px',\r\n },\r\n};\r\n\r\nexport const videoSvgIconStyles = {\r\n ...iconStyles,\r\n root: {\r\n ...iconStyles.root,\r\n top: '5px',\r\n width: '15px',\r\n opacity: 0.8,\r\n },\r\n};\r\n\r\nexport const useFolderGridCellStyle = makeResetStyles({\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n boxSizing: 'border-box',\r\n height: '86px',\r\n\r\n '& .folder-grid-cell-content': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: 1,\r\n flexShrink: 1,\r\n\r\n justifyContent: 'flex-start',\r\n alignItems: 'center',\r\n backgroundColor: '#fff',\r\n ...shorthands.padding('16px'),\r\n cursor: 'pointer',\r\n\r\n ...shorthands.borderRadius('6px'),\r\n ...positionFill,\r\n\r\n '& .folder-thumbnail': {\r\n display: 'flex',\r\n flexGrow: 0,\r\n flexShrink: 0,\r\n marginRight: '16px',\r\n },\r\n\r\n '& .folder-info': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n flexShrink: 1,\r\n justifyContent: 'space-between',\r\n height: '100%',\r\n paddingTop: '6px',\r\n\r\n ...shorthands.overflow('hidden'),\r\n whiteSpace: 'nowrap',\r\n\r\n '& .folder-name': {\r\n fontStyle: 'normal',\r\n fontWeight: 600,\r\n fontSize: '12px',\r\n lineHeight: '16px',\r\n\r\n '& .highlighted-text': {\r\n backgroundColor: tokens.colorPaletteYellowBackground3,\r\n },\r\n },\r\n\r\n '& .folder-newlabel-counting': {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n ...shorthands.padding('1px'),\r\n\r\n '& .counting-info': {\r\n display: 'block',\r\n ...shorthands.overflow('hidden'),\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n\r\n fontStyle: 'normal',\r\n fontWeight: 400,\r\n fontSize: '12px',\r\n lineHeight: '15px',\r\n textAlign: 'right',\r\n\r\n position: 'relative',\r\n top: '2px',\r\n\r\n '& .count-icon': {\r\n marginLeft: '12px',\r\n marginRight: '4px',\r\n fontSize: '14px',\r\n '&:first-child': {\r\n marginLeft: '0px',\r\n },\r\n },\r\n\r\n '& span': {\r\n verticalAlign: 'top',\r\n },\r\n },\r\n\r\n '& .empty-desc': {\r\n fontSize: '12px',\r\n },\r\n },\r\n },\r\n },\r\n\r\n '& .grid-cell-with-accessory': {\r\n paddingRight: '54px',\r\n },\r\n\r\n '& .folder-cell-accessory': {\r\n position: 'absolute',\r\n top: 0,\r\n bottom: 0,\r\n right: 0,\r\n width: '42px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n\r\n '& .folder-grid-loading-cell-content': {\r\n height: '100%',\r\n },\r\n\r\n '& .selectable-cell-card': {\r\n backgroundColor: 'white',\r\n },\r\n});\r\n","/* eslint-disable object-curly-newline */\r\nimport _ from 'underscore';\r\nimport React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { Checkbox, Tooltip } from '@fluentui/react-components';\r\nimport { FolderRegular, ImageRegular, VideoRegular } from '@fluentui/react-icons';\r\n\r\nimport {\r\n TilesGridCellCard,\r\n TilesGridCellDragDecorator,\r\n TilesGridCellDropDecorator,\r\n} from '../../ads-studio-tile-grid';\r\nimport { FolderIcon } from '../../folder-icon-component';\r\nimport { TextWithHighlight } from '../../text-with-highlight';\r\nimport { FolderAssetType } from '../../../model';\r\n\r\nimport {\r\n useFolderGridCellStyle\r\n} from './style';\r\n\r\nfunction getCountDescription({\r\n itemInfo,\r\n i18n,\r\n}) {\r\n let subFoldersCountDesc = '';\r\n let imagesCountDesc = '';\r\n let videosCountDesc = '';\r\n if (itemInfo.subfoldersCount === 1) {\r\n subFoldersCountDesc = i18n.getString(_TL_('{{count}} folder'), { count: itemInfo.subfoldersCount });\r\n } else if (!_.isUndefined(itemInfo.subfoldersCount)) {\r\n subFoldersCountDesc = i18n.getString(_TL_('{{count}} folders'), { count: itemInfo.subfoldersCount });\r\n }\r\n if (itemInfo.imageAssetsCount === 1) {\r\n imagesCountDesc = i18n.getString(_TL_('{{count}} image'), { count: itemInfo.imageAssetsCount });\r\n } else if (!_.isUndefined(itemInfo.imageAssetsCount)) {\r\n imagesCountDesc = i18n.getString(_TL_('{{count}} images'), { count: itemInfo.imageAssetsCount });\r\n }\r\n if (itemInfo.videoAssetsCount === 1) {\r\n videosCountDesc = i18n.getString(_TL_('{{count}} video'), { count: itemInfo.videoAssetsCount });\r\n } else if (!_.isUndefined(itemInfo.videoAssetsCount)) {\r\n videosCountDesc = i18n.getString(_TL_('{{count}} videos'), { count: itemInfo.videoAssetsCount });\r\n }\r\n const res = [subFoldersCountDesc, imagesCountDesc, videosCountDesc].filter(item => item !== '').join(', ');\r\n return res;\r\n}\r\n\r\nconst convertItemInfo = ({ allowedAssetType, itemInfos }) => {\r\n const result = {\r\n subfoldersCount: itemInfos.SubFoldersCount,\r\n };\r\n if (allowedAssetType === FolderAssetType.Image) {\r\n result.imageAssetsCount = itemInfos.ImageAssetsCount;\r\n } else if (allowedAssetType === FolderAssetType.Video) {\r\n result.videoAssetsCount = itemInfos.VideoAssetsCount;\r\n } else if (!allowedAssetType) {\r\n result.imageAssetsCount = itemInfos.ImageAssetsCount;\r\n result.videoAssetsCount = itemInfos.VideoAssetsCount;\r\n }\r\n\r\n return result;\r\n};\r\n\r\n// eslint-disable-next-line react/prop-types\r\nconst FolderCountInfo = ({ itemInfo, className, i18n, isEmptyFolder }) => (\r\n <Tooltip\r\n content={getCountDescription({ itemInfo, i18n })}\r\n relationship=\"label\"\r\n positioning=\"below-start\"\r\n withArrow\r\n >\r\n { !isEmptyFolder ? (\r\n <div className={classnames('folder-cell-tooltip', className)}>\r\n {!_.isUndefined(itemInfo.subfoldersCount) &&\r\n <React.Fragment>\r\n <FolderRegular className=\"count-icon\" />\r\n <span className=\"cell-subfolder-count\">{itemInfo.subfoldersCount}</span>\r\n </React.Fragment>\r\n }\r\n {!_.isUndefined(itemInfo.imageAssetsCount) &&\r\n <React.Fragment>\r\n <ImageRegular className=\"count-icon\" />\r\n <span className=\"cell-image-count\">{itemInfo.imageAssetsCount}</span>\r\n </React.Fragment>\r\n }\r\n {!_.isUndefined(itemInfo.videoAssetsCount) &&\r\n <React.Fragment>\r\n <VideoRegular className=\"count-icon\" />\r\n <span className=\"cell-video-count\">{itemInfo.videoAssetsCount}</span>\r\n </React.Fragment>\r\n }\r\n </div>\r\n ) : (\r\n <span className=\"empty-desc\">{i18n.getString(_TL_('0 items'))}</span>\r\n )}\r\n </Tooltip>\r\n);\r\n\r\nconst getFolderThumbnail = ({ assets }) => {\r\n const firstAsset = _.first(assets) || {};\r\n\r\n // MT will ensure valid assets returned first, so UI only need to check first asset.\r\n if (firstAsset.folderAssetType === FolderAssetType.Video) {\r\n return firstAsset.status === 'Active' ? firstAsset.thumbnailUrl : '';\r\n }\r\n\r\n return firstAsset.url;\r\n};\r\n\r\nconst FoldersGridCell = ({\r\n item,\r\n highlightedText,\r\n onFolderClick,\r\n i18n,\r\n selectable,\r\n selected,\r\n onSelect,\r\n allowedAssetType,\r\n\r\n renderAccessory,\r\n\r\n draggable,\r\n onDrag,\r\n selectedItemCount,\r\n droppable,\r\n onDrop,\r\n}) => {\r\n const folderGridCellContainer = useFolderGridCellStyle();\r\n const {\r\n folderName, itemCount, assets,\r\n } = item || {};\r\n\r\n const itemInfo = useMemo(() => convertItemInfo({ allowedAssetType, itemInfos: itemCount }), [allowedAssetType, itemCount]);\r\n const isEmptyFolder = !_.isUndefined(itemCount.TotalCount) && itemCount.TotalCount === 0;\r\n\r\n const thumbnailUrl = useMemo(() => getFolderThumbnail({ assets }), [assets]);\r\n\r\n const onClick = useCallback(() => {\r\n onFolderClick(item);\r\n }, [item, onFolderClick]);\r\n\r\n const onCheckboxChange = useCallback((event, checked) => {\r\n if (onSelect) {\r\n onSelect(checked);\r\n }\r\n }, [onSelect]);\r\n\r\n const hasAccessory = renderAccessory || selectable;\r\n\r\n return (\r\n <TilesGridCellDragDecorator\r\n draggable={draggable}\r\n item={item}\r\n dragItemsLength={selectedItemCount}\r\n onDrag={onDrag}\r\n i18n={i18n}\r\n selected={selected}\r\n >\r\n <TilesGridCellDropDecorator droppable={droppable} onDrop={onDrop}>\r\n <div className={classnames('tiles-grid-cell-content', folderGridCellContainer)}>\r\n <TilesGridCellCard customCellCardClass={selectable ? 'selectable-cell-card' : ''}>\r\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\r\n <div\r\n className={classnames('folder-grid-cell-content', hasAccessory && 'grid-cell-with-accessory')}\r\n onClick={onClick}\r\n data-is-focusable\r\n >\r\n <div className=\"folder-thumbnail\">\r\n <FolderIcon thumbnailImageUrl={thumbnailUrl} isEmptyFolder={isEmptyFolder} />\r\n </div>\r\n <div className=\"folder-info\">\r\n <div className=\"folder-name\">\r\n <TextWithHighlight text={folderName || ''} highlightedText={highlightedText} enableTooltip />\r\n </div>\r\n <div className=\"folder-newlabel-counting\">\r\n <FolderCountInfo\r\n itemInfo={itemInfo}\r\n className=\"counting-info\"\r\n i18n={i18n}\r\n isEmptyFolder={isEmptyFolder}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n {hasAccessory ?\r\n <div className=\"folder-cell-accessory\">\r\n {selectable &&\r\n <Checkbox onChange={onCheckboxChange} checked={selected} ariaLabel={folderName || i18n.getString(_TL_('Folder'))} />\r\n }\r\n {(renderAccessory && !selectable) && renderAccessory()}\r\n </div>\r\n : null}\r\n </TilesGridCellCard>\r\n </div>\r\n </TilesGridCellDropDecorator>\r\n </TilesGridCellDragDecorator>\r\n );\r\n};\r\n\r\nFoldersGridCell.propTypes = {\r\n item: PropTypes.shape({}).isRequired,\r\n highlightedText: PropTypes.string,\r\n onFolderClick: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n\r\n // show checkbox\r\n selectable: PropTypes.bool,\r\n selected: PropTypes.bool,\r\n onSelect: PropTypes.func,\r\n\r\n allowedAssetType: PropTypes.string,\r\n\r\n renderAccessory: PropTypes.func,\r\n};\r\n\r\nFoldersGridCell.defaultProps = {\r\n highlightedText: undefined,\r\n selectable: false,\r\n selected: false,\r\n onSelect: undefined,\r\n allowedAssetType: null,\r\n\r\n renderAccessory: undefined,\r\n};\r\n\r\nexport const AdsStudioFoldersGridCell = FoldersGridCell;\r\n","import { makeStyles, shorthands, tokens } from '@fluentui/react-components';\r\nimport {\r\n getSharedAssetContainerStyle,\r\n getSharedMultiSelectingCellStyles,\r\n} from './../shared-cell-style';\r\n\r\nexport const useImageAssetsGridCellStyle = makeStyles({\r\n imageAssetsGridCellContainer: {\r\n ...getSharedAssetContainerStyle(),\r\n\r\n // the 'Updating' label animation\r\n '& .updating-label-icon-and-text': {\r\n display: 'flex',\r\n backgroundColor: tokens.colorNeutralBackgroundStatic,\r\n\r\n '& .label-icon': {\r\n animationName: [{\r\n from: { transform: 'rotate(0deg)' },\r\n to: { transform: 'rotate(360deg)' },\r\n }],\r\n animationDuration: '1.5s',\r\n animationIterationCount: 'infinite',\r\n animationTimingFunction: 'linear',\r\n },\r\n },\r\n },\r\n\r\n imageCellLabelContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n position: 'absolute',\r\n left: '12px',\r\n bottom: '8px',\r\n zIndex: 1,\r\n\r\n '& .label-icon-and-text.created-with-ai-label': {\r\n display: 'flex',\r\n ...shorthands.padding(0),\r\n ...shorthands.margin(0),\r\n marginRight: '6px',\r\n height: '24px',\r\n backgroundColor: '#FFFFFFBB',\r\n\r\n '& .label-icon': {\r\n ...shorthands.margin(0),\r\n },\r\n },\r\n\r\n '& .label-icon-and-text.image-source-label': {\r\n ...shorthands.padding('2px', '4px'),\r\n backgroundColor: '#616161',\r\n },\r\n },\r\n\r\n // only show checkbox on overlay if it is NOT in multi-selecting mode\r\n ...getSharedMultiSelectingCellStyles(),\r\n\r\n});\r\n","/* eslint-disable react/jsx-closing-tag-location */\r\nimport _ from 'underscore';\r\nimport React, { Fragment, useCallback, useMemo, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { ArrowSync16Filled } from '@fluentui/react-icons';\r\n\r\nimport {\r\n TilesGridCellImage as CellImage,\r\n TilesGridCellDecorativeLabel as CellLabel,\r\n TilesGridCellCardWithOverlay,\r\n TilesGridCellSelectionDecorator,\r\n TilesGridCellDeletionButtonDecorator,\r\n TilesGridCellDragDecorator,\r\n} from '../../ads-studio-tile-grid';\r\nimport { TextWithHighlight } from '../../text-with-highlight';\r\nimport { CSMLAssetSource, ManualAddedImageSource } from '../../../model';\r\nimport { InfoSparkleSVGIcon } from '../../../asset-images';\r\nimport { useImageAssetsGridCellStyle } from './style';\r\n\r\nexport const AdsStudioImageAssetsGridCell = ({\r\n item,\r\n highlightedText,\r\n isOverlayEnabled,\r\n isCellFocused,\r\n renderCellContent,\r\n renderOverlayContent,\r\n i18n,\r\n selectable,\r\n selected,\r\n isMultiSelecting, // is in multi-selection mode, need to show checkbox on cells\r\n onClick,\r\n deletable,\r\n onDelete,\r\n draggable,\r\n onDrag,\r\n selectedItemCount,\r\n}) => {\r\n const [isImageLoaded, setImageLoaded] = useState(false);\r\n const classes = useImageAssetsGridCellStyle();\r\n\r\n const {\r\n name,\r\n url,\r\n id,\r\n updating,\r\n sourceType,\r\n manualAddedImageSourceType,\r\n } = item || {};\r\n\r\n const cellContent = useMemo(() => {\r\n const defaultContent = (\r\n <Fragment>\r\n <CellImage\r\n src={url}\r\n alt={name || id || ''}\r\n showSpinner={false}\r\n onLoaded={setImageLoaded}\r\n i18n={i18n}\r\n />\r\n <div className={classes.imageCellLabelContainer}>\r\n {manualAddedImageSourceType === ManualAddedImageSource.Library && (\r\n <CellLabel\r\n text={i18n.getString(_TL_('Library'))}\r\n customClass={{ iconTextWrapper: 'image-source-label' }}\r\n />\r\n )}\r\n {manualAddedImageSourceType === ManualAddedImageSource.ShutterStock && (\r\n <CellLabel\r\n text={i18n.getString(_TL_('Stock'))}\r\n customClass={{ iconTextWrapper: 'image-source-label' }}\r\n />\r\n )}\r\n {(sourceType === CSMLAssetSource.AIGenerated || sourceType === CSMLAssetSource.BackgroundChangeGenerated || sourceType === CSMLAssetSource.AIGeneratedByRecraft) && (\r\n <CellLabel\r\n icon={InfoSparkleSVGIcon}\r\n customClass={{ iconTextWrapper: 'created-with-ai-label' }}\r\n />\r\n )}\r\n {updating && (\r\n <CellLabel\r\n text={i18n.getString(_TL_('Updating'))}\r\n icon={ArrowSync16Filled}\r\n customClass={{ iconTextWrapper: 'updating-label-icon-and-text' }}\r\n />\r\n )}\r\n </div>\r\n </Fragment>\r\n );\r\n if (renderCellContent) {\r\n return renderCellContent(defaultContent);\r\n }\r\n return defaultContent;\r\n }, [classes.imageCellLabelContainer, i18n, id, manualAddedImageSourceType, name, renderCellContent, sourceType, updating, url]);\r\n\r\n const funcRenderOverlayContent = useCallback(() => {\r\n if (renderOverlayContent) {\r\n return renderOverlayContent();\r\n }\r\n return null;\r\n }, [renderOverlayContent]);\r\n\r\n const onCellClick = useCallback(() => {\r\n if (selectable) {\r\n onClick({ item, selected });\r\n }\r\n }, [item, onClick, selectable, selected]);\r\n\r\n const withSelectionDecorator = useCallback(decoratedContent => (\r\n selectable ? (\r\n <TilesGridCellSelectionDecorator item={item} selected={selected} onClick={onClick} ariaLabel={name || i18n.getString(_TL_('Image'))} isFocused={isCellFocused} >\r\n {decoratedContent}\r\n </TilesGridCellSelectionDecorator>\r\n ) : decoratedContent\r\n ), [i18n, isCellFocused, item, name, onClick, selectable, selected]);\r\n\r\n const withDeleteButtonDecorator = useCallback(decoratedContent => (\r\n deletable ? (\r\n <TilesGridCellDeletionButtonDecorator item={item} onDelete={onDelete}>\r\n {decoratedContent}\r\n </TilesGridCellDeletionButtonDecorator>\r\n ) : decoratedContent\r\n ), [deletable, item, onDelete]);\r\n\r\n return (\r\n <div className={classnames('tiles-grid-cell-content', classes.imageAssetsGridCellContainer)}>\r\n <TilesGridCellDragDecorator\r\n draggable={draggable}\r\n item={item}\r\n dragItemsLength={selectedItemCount}\r\n onDrag={onDrag}\r\n i18n={i18n}\r\n selected={selected}\r\n >\r\n <TilesGridCellCardWithOverlay\r\n isCellFocused={isCellFocused}\r\n isOverlayEnabled={isOverlayEnabled && isImageLoaded}\r\n renderOverlayContent={funcRenderOverlayContent}\r\n customCellCardClass={(isOverlayEnabled && !selected && !isMultiSelecting) ? classes.selectableCardContainerAutoHideCheckbox : classes.selectableCardContainer}\r\n onClick={onCellClick}\r\n >\r\n {_.compose(withDeleteButtonDecorator, withSelectionDecorator)(cellContent)}\r\n </TilesGridCellCardWithOverlay>\r\n </TilesGridCellDragDecorator>\r\n <div className=\"cell-description\">\r\n <div className=\"cell-description-name\">\r\n <TextWithHighlight text={name || ''} highlightedText={highlightedText} enableTooltip />\r\n </div>\r\n {id && (\r\n <div className=\"cell-description-id\">\r\n {`${i18n.getString(_TL_('ID'))} `}\r\n <TextWithHighlight text={id} highlightedText={highlightedText} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nAdsStudioImageAssetsGridCell.propTypes = {\r\n item: PropTypes.shape({\r\n id: PropTypes.string,\r\n name: PropTypes.string,\r\n url: PropTypes.string,\r\n createdTime: PropTypes.instanceOf(Date),\r\n // cropping task progress\r\n updating: PropTypes.bool,\r\n }).isRequired,\r\n highlightedText: PropTypes.string,\r\n isOverlayEnabled: PropTypes.bool,\r\n isCellFocused: PropTypes.bool,\r\n renderCellContent: PropTypes.func,\r\n renderOverlayContent: PropTypes.func,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n selectable: PropTypes.bool,\r\n selected: PropTypes.bool,\r\n onClick: () => null,\r\n isMultiSelecting: PropTypes.bool,\r\n deletable: PropTypes.bool,\r\n onDelete: PropTypes.func,\r\n draggable: PropTypes.bool,\r\n onDrag: PropTypes.func,\r\n selectedItemCount: PropTypes.number,\r\n};\r\n\r\nAdsStudioImageAssetsGridCell.defaultProps = {\r\n highlightedText: undefined,\r\n isOverlayEnabled: false,\r\n isCellFocused: false,\r\n renderCellContent: null,\r\n renderOverlayContent: null,\r\n selectable: false,\r\n selected: false,\r\n onClick: undefined,\r\n isMultiSelecting: false,\r\n deletable: false,\r\n onDelete: undefined,\r\n draggable: false,\r\n onDrag: _.noop,\r\n selectedItemCount: 1,\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { FolderAssetType } from '../../../model';\r\nimport {\r\n AdsStudioImageAssetsGridCell as DefaultImageGridCell,\r\n AdsStudioVideoAssetsGridCell as DefaultVideoGridCell,\r\n} from '..';\r\n\r\nexport const GridCellFactory = (props) => {\r\n const { item } = props;\r\n const { folderAssetType } = item || {};\r\n\r\n switch (folderAssetType) {\r\n case FolderAssetType.Image:\r\n return <DefaultImageGridCell {...props} />;\r\n case FolderAssetType.Video:\r\n return <DefaultVideoGridCell {...props} />;\r\n default:\r\n return null;\r\n }\r\n};\r\n\r\nGridCellFactory.propTypes = {\r\n item: PropTypes.shape({\r\n folderAssetType: PropTypes.string.isRequired,\r\n }),\r\n};\r\n\r\nGridCellFactory.defaultProps = {\r\n item: null,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const useStyles = makeStyles({\r\n container: {\r\n '& .cell-overlay-actions': {\r\n zIndex: 1,\r\n alignItems: 'end',\r\n justifyContent: 'end',\r\n },\r\n },\r\n actionButton: {\r\n ...shorthands.margin('6px'),\r\n marginLeft: '0px',\r\n\r\n '&:focus': {\r\n ...shorthands.border('1px', 'solid', '#FFFFFF'),\r\n },\r\n\r\n '&:hover': {\r\n backgroundColor: '#C4C4C4',\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useState, useRef, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { EditRegular, ListRegular } from '@fluentui/react-icons';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { stringifySync } from '@bingads-webui/safe-json';\r\n\r\nimport { FolderAssetType, ManualAddedImageSource } from '../../../model';\r\nimport { GridCellFactory } from './grid-cell-factory';\r\nimport { useStyles } from './style';\r\n\r\nexport const AdsStudioAssetGridCell = ({\r\n item,\r\n highlightedText,\r\n onDetailsClick,\r\n onEditClick,\r\n selectable,\r\n selected,\r\n onSelect,\r\n isMultiSelecting,\r\n i18n,\r\n logger,\r\n index,\r\n draggable,\r\n onDrag,\r\n selectedItemCount,\r\n permissions,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n const [focusIndex, setFocusIndex] = useState(-1);\r\n const focusCellButton = useRef();\r\n\r\n const onKeyDown = useCallback((event, i) => {\r\n const assetContainers = document.querySelectorAll('.asset-grid-cell-container');\r\n const firstButton = document.querySelector('.ads-studio-page button');\r\n switch (event.code) {\r\n case 'ArrowUp':\r\n case 'ArrowLeft':\r\n if (i > 0 && assetContainers[i - 1]) {\r\n assetContainers[i - 1].focus();\r\n setFocusIndex(-1);\r\n }\r\n break;\r\n case 'ArrowDown':\r\n case 'ArrowRight':\r\n if (i < assetContainers.length - 1 && assetContainers[i + 1]) {\r\n assetContainers[i + 1].focus();\r\n setFocusIndex(-1);\r\n }\r\n break;\r\n case 'Space':\r\n setFocusIndex(i);\r\n break;\r\n case 'Tab':\r\n if (focusIndex < 0 && firstButton) {\r\n firstButton.focus();\r\n } else if (assetContainers[i]) {\r\n const detailButton = assetContainers[i].querySelector('.detail-button');\r\n const editButton = assetContainers[i].querySelector('.edit-button');\r\n if (focusCellButton.current === 'edit') {\r\n if (detailButton) {\r\n detailButton.focus();\r\n focusCellButton.current = 'detail';\r\n }\r\n } else if (editButton) {\r\n if (editButton) {\r\n editButton.focus();\r\n focusCellButton.current = 'edit';\r\n }\r\n } else if (detailButton) {\r\n detailButton.focus();\r\n focusCellButton.current = 'detail';\r\n }\r\n }\r\n break;\r\n case 'Enter':\r\n if (focusCellButton.current === 'detail') {\r\n onDetailsClick(item);\r\n } else if (focusCellButton.current === 'edit') {\r\n onEditClick(item);\r\n } else {\r\n onSelect();\r\n }\r\n setFocusIndex(-1);\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }, [focusIndex, item, onDetailsClick, onEditClick, onSelect]);\r\n\r\n const renderOverlayContent = useCallback(() => {\r\n const clickDetails = (evt) => {\r\n onDetailsClick(item);\r\n if (evt) {\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n }\r\n };\r\n const onDetailsKeyDown = (evt) => {\r\n if (evt.code === 'Enter' || evt.code === 'Space') {\r\n clickDetails(evt);\r\n }\r\n };\r\n const clickEdit = (evt) => {\r\n onEditClick(item);\r\n if (evt) {\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n }\r\n };\r\n const onEditKeyDown = (evt) => {\r\n if (evt.code === 'Enter' || evt.code === 'Space') {\r\n clickEdit(evt);\r\n }\r\n };\r\n const { folderAssetType, manualAddedImageSourceType } = item || {};\r\n const isVideoCell = folderAssetType === FolderAssetType.Video;\r\n const isStockImageCell = manualAddedImageSourceType === ManualAddedImageSource.ShutterStock;\r\n const videoTemplateUIEnabled = permissions && permissions.dynamic && permissions.dynamic.VideoTemplateUI;\r\n const showEditIcon = ((videoTemplateUIEnabled && isVideoCell && item && item.id && item.metaData) || !isVideoCell);\r\n\r\n return (\r\n <React.Fragment>\r\n { showEditIcon &&\r\n <Button\r\n icon={<EditRegular />}\r\n onClick={clickEdit}\r\n onKeyDown={onEditKeyDown}\r\n className={classnames('edit-button', classes.actionButton)}\r\n title={i18n.getString(_TL_('Edit'))}\r\n aria-label={i18n.getString(_TL_('Edit asset'))}\r\n />\r\n }\r\n { !isStockImageCell &&\r\n <Button\r\n icon={<ListRegular />}\r\n onClick={clickDetails}\r\n onKeyDown={onDetailsKeyDown}\r\n className={classnames('detail-button', classes.actionButton)}\r\n title={i18n.getString(_TL_('Details'))}\r\n aria-label={i18n.getString(_TL_('Click to view asset details'))}\r\n />\r\n }\r\n </React.Fragment>\r\n );\r\n }, [classes.actionButton, i18n, item, onDetailsClick, onEditClick]);\r\n\r\n useEffect(() => {\r\n if (logger && logger.logTrace) {\r\n logger.logTrace(`Grid cell rendered item: ${stringifySync(item)}`);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\r\n <div\r\n className={classnames('asset-grid-cell-container', classes.container)}\r\n onKeyDown={(event) => { onKeyDown(event, index); }}\r\n style={{ width: '100%', height: '100%' }}\r\n data-is-focusable\r\n >\r\n <GridCellFactory\r\n item={item}\r\n highlightedText={highlightedText}\r\n i18n={i18n}\r\n isOverlayEnabled\r\n isCellFocused={focusIndex === index}\r\n renderOverlayContent={renderOverlayContent}\r\n selectable={selectable}\r\n selected={selected}\r\n onClick={onSelect}\r\n isMultiSelecting={isMultiSelecting}\r\n onClickVideo={onDetailsClick}\r\n draggable={draggable}\r\n onDrag={onDrag}\r\n selectedItemCount={selectedItemCount}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nAdsStudioAssetGridCell.propTypes = {\r\n item: PropTypes.shape({\r\n id: PropTypes.string,\r\n name: PropTypes.string,\r\n url: PropTypes.string,\r\n createdTime: PropTypes.instanceOf(Date),\r\n // cropping task progress\r\n updating: PropTypes.bool,\r\n }).isRequired,\r\n highlightedText: PropTypes.string,\r\n onDetailsClick: PropTypes.func.isRequired,\r\n onEditClick: PropTypes.func,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n selectable: PropTypes.bool,\r\n selected: PropTypes.bool,\r\n onSelect: PropTypes.func,\r\n isMultiSelecting: PropTypes.bool,\r\n index: PropTypes.number,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func,\r\n logError: PropTypes.func,\r\n }),\r\n draggable: PropTypes.bool,\r\n onDrag: PropTypes.func,\r\n selectedItemCount: PropTypes.number,\r\n};\r\n\r\nAdsStudioAssetGridCell.defaultProps = {\r\n highlightedText: undefined,\r\n index: -1,\r\n selectable: false,\r\n selected: false,\r\n onSelect: _.noop,\r\n onEditClick: _.noop,\r\n isMultiSelecting: false,\r\n logger: undefined,\r\n draggable: false,\r\n onDrag: _.noop,\r\n selectedItemCount: 1,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const useControlStyles = makeStyles({\r\n root: {\r\n position: 'relative',\r\n width: '100%',\r\n ...shorthands.overflow('hidden'),\r\n top: '-5px',\r\n backgroundColor: 'rgba(0,0,0,0.75)',\r\n\r\n '& .ms-Button svg': {\r\n width: '100%',\r\n },\r\n '& .ms-Button:focus': {\r\n ...shorthands.border('1px solid #fff'),\r\n },\r\n '& .ms-Button:hover': {\r\n backgroundColor: 'transparent',\r\n },\r\n },\r\n videoContainer: {\r\n paddingBottom: '32px',\r\n },\r\n sliderContainer: {\r\n width: '100%',\r\n },\r\n previewVideo: {\r\n width: '100%',\r\n maxHeight: '100%',\r\n },\r\n container: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n\r\n '& i': {\r\n width: '100%',\r\n cursor: 'pointer',\r\n },\r\n },\r\n});\r\n\r\nconst commonParentStyles = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'column',\r\n height: '100%',\r\n};\r\n\r\nconst iconCommonStyles = {\r\n fontSize: '36px',\r\n lineHeight: '36px',\r\n color: '#0078d4',\r\n};\r\n\r\nexport const usePlaceholderStyle = makeStyles({\r\n encoding: {\r\n ...commonParentStyles,\r\n '& .placeholder-icon': {\r\n ...iconCommonStyles,\r\n animationName: [\r\n {\r\n to: {\r\n transform: 'rotate(360deg)',\r\n },\r\n },\r\n ],\r\n animationDuration: '1.2s',\r\n animationTimingFunction: 'linear',\r\n animationIterationCount: 'infinite',\r\n },\r\n '& .add-video-content-container': {\r\n marginTop: '14px',\r\n },\r\n },\r\n unverified: {\r\n ...commonParentStyles,\r\n '& .download-icon-container': {\r\n ...shorthands.overflow('hidden'),\r\n ...shorthands.borderBottom('2px solid #0078d4'),\r\n },\r\n '& .placeholder-icon': {\r\n ...iconCommonStyles,\r\n animationName: [\r\n {\r\n from: {\r\n transform: 'translateY(-18px)',\r\n },\r\n to: {\r\n transform: 'translateY(42px)',\r\n },\r\n },\r\n ],\r\n animationDuration: '1.2s',\r\n animationTimingFunction: 'ease',\r\n animationIterationCount: 'infinite',\r\n },\r\n },\r\n failed: {\r\n ...commonParentStyles,\r\n '& .placeholder-icon': {\r\n ...iconCommonStyles,\r\n color: '#d83b01',\r\n },\r\n },\r\n});\r\n","import React from 'react';\r\n\r\nimport { VideoPureComponent } from '@bingads-webui-campaign-react/video-pure-component';\r\n\r\nimport { useControlStyles } from './style';\r\n\r\nexport const Video = (props) => {\r\n const classes = useControlStyles();\r\n\r\n return <VideoPureComponent {...props} classes={classes} />;\r\n};\r\n","import React from 'react';\r\n\r\nimport { EncodingPlaceholder, FailedPlaceholder, UnverifiedPlaceholder } from '@bingads-webui-campaign-react/video-status-placeholder-pure-component';\r\n\r\nimport { usePlaceholderStyle } from './style';\r\n\r\nexport const EncodingPlaceholderWithStyle = (props) => {\r\n const classes = usePlaceholderStyle();\r\n return <EncodingPlaceholder {...props} classes={classes} />;\r\n};\r\n\r\nexport const FailedPlaceholderWithStyle = (props) => {\r\n const classes = usePlaceholderStyle();\r\n return <FailedPlaceholder {...props} classes={classes} />;\r\n};\r\n\r\nexport const UnverifiedPlaceholderWithStyle = (props) => {\r\n const classes = usePlaceholderStyle();\r\n return <UnverifiedPlaceholder {...props} classes={classes} />;\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\nimport {\r\n getSharedAssetContainerStyle,\r\n getSharedMultiSelectingCellStyles,\r\n} from '../shared-cell-style';\r\n\r\nexport const useVideoAssetsGridCellStyle = makeStyles({\r\n VideoAssetsGridCellContainer: {\r\n ...getSharedAssetContainerStyle(),\r\n },\r\n\r\n videoCellLabelContainer: {\r\n display: 'flex',\r\n position: 'absolute',\r\n left: '12px',\r\n bottom: '8px',\r\n zIndex: 1,\r\n },\r\n\r\n videoCell: {\r\n // visibility: 'hidden',\r\n opacity: 0,\r\n position: 'absolute',\r\n top: '0px',\r\n left: '0px',\r\n // zIndex: -1,\r\n ...shorthands.borderRadius('6px'),\r\n '& .video-previewer-root': {\r\n backgroundColor: 'transparent',\r\n transform: 'translateY(-100%)',\r\n '& .time': {\r\n paddingLeft: '8px',\r\n paddingRight: '12px',\r\n color: '#fff',\r\n fontSize: '11px',\r\n lineHeight: '14px',\r\n whiteSpace: 'nowrap',\r\n },\r\n '& button[aria-label=\"Unmute\"], button[aria-label=\"Mute\"]': {\r\n marginRight: '8px',\r\n '& .ms-Icon': {\r\n lineHeight: '32px',\r\n fontSize: '32px',\r\n height: '32px',\r\n },\r\n },\r\n },\r\n '&.show-video': {\r\n // visibility: 'visible',\r\n opacity: 1,\r\n // zIndex: 2,\r\n },\r\n },\r\n placeholderCell: {\r\n width: '100%',\r\n height: '135px',\r\n },\r\n\r\n // only show checkbox on overlay if it is NOT in multi-selecting mode\r\n ...getSharedMultiSelectingCellStyles(),\r\n});\r\n","/* eslint-disable object-curly-newline */\r\nimport React, { useCallback, useMemo, useState, useRef, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\n\r\nimport { TimerRegular } from '@fluentui/react-icons';\r\nimport {\r\n TilesGridCellImage as CellImage,\r\n TilesGridCellDecorativeLabel as CellLabel,\r\n TilesGridCellCardWithOverlay,\r\n TilesGridCellSelectionDecorator,\r\n TilesGridCellDragDecorator,\r\n} from '../../ads-studio-tile-grid';\r\nimport { TextWithHighlight } from '../../text-with-highlight';\r\nimport {\r\n Video,\r\n EncodingPlaceholderWithStyle,\r\n UnverifiedPlaceholderWithStyle,\r\n FailedPlaceholderWithStyle\r\n} from '../../video-component';\r\nimport { convertTimeDuration } from '../../../model';\r\n\r\nimport { useVideoAssetsGridCellStyle } from './style';\r\n\r\nexport const AdsStudioVideoAssetsGridCell = ({\r\n item,\r\n highlightedText,\r\n isOverlayEnabled,\r\n isCellFocused,\r\n renderCellContent,\r\n renderOverlayContent,\r\n selectable,\r\n selected,\r\n isMultiSelecting,\r\n onClick,\r\n i18n,\r\n onClickVideo,\r\n draggable,\r\n onDrag,\r\n selectedItemCount,\r\n}) => {\r\n const classes = useVideoAssetsGridCellStyle();\r\n const [isVideoLoaded, setVideoLoaded] = useState(false);\r\n const [showVideo, setShowVideo] = useState(false); // control opacity of video element\r\n const [hideVideo, setHideVideo] = useState(false); // display video element or not\r\n const [thumbnailSeletable, setThumbnailSelectable] = useState(false);\r\n\r\n const { name, thumbnailUrl, id, durationInMS, status, url } = item || {};\r\n const durationDesc = useMemo(() => convertTimeDuration(durationInMS), [durationInMS]);\r\n\r\n const [cellRef, setCellRef] = useState(null);\r\n const timerRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (isVideoLoaded && cellRef && !isMultiSelecting) {\r\n cellRef.addEventListener('mouseover', () => {\r\n setShowVideo(true);\r\n timerRef.current = setTimeout(() => {\r\n setShowVideo(false);\r\n setThumbnailSelectable(true);\r\n setHideVideo(true);\r\n }, 5000);\r\n });\r\n cellRef.addEventListener('mouseout', () => {\r\n setShowVideo(false);\r\n clearTimeout(timerRef.current);\r\n setThumbnailSelectable(false);\r\n });\r\n }\r\n }, [cellRef, isMultiSelecting, isVideoLoaded]);\r\n\r\n useEffect(() => () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (selected) {\r\n setShowVideo(false);\r\n setThumbnailSelectable(true);\r\n }\r\n }, [selected]);\r\n\r\n const onClickVideoCard = useCallback(() => {\r\n clearTimeout(timerRef.current);\r\n onClickVideo();\r\n }, [onClickVideo]);\r\n\r\n const playVideoObject = useMemo(() => ({ play: showVideo }), [showVideo]);\r\n\r\n const wrapperWidth = cellRef ? cellRef.offsetWidth : 0;\r\n\r\n const cellContent = useMemo(() => {\r\n let defaultContent = null;\r\n // status order: unverified => draft => active/invalid\r\n if (status === 'Active') {\r\n defaultContent = (\r\n <div className=\"acitve-video-cell-content\">\r\n <CellImage\r\n src={thumbnailUrl}\r\n alt={name || id || ''}\r\n showSpinner={false}\r\n onLoaded={setVideoLoaded}\r\n i18n={i18n}\r\n />\r\n <div className={classes.videoCellLabelContainer}>\r\n {isVideoLoaded && durationDesc && !showVideo && (\r\n <CellLabel\r\n text={durationDesc}\r\n icon={TimerRegular}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n } else {\r\n setVideoLoaded(true);\r\n\r\n if (status === 'Unverified') {\r\n defaultContent = <div className={classnames('unverified-video-cell-content', classes.placeholderCell)}><UnverifiedPlaceholderWithStyle placeholderContent={i18n.getString(_TL_('Downloading...'))} /></div>;\r\n } else if (status === 'Draft') {\r\n defaultContent = <div className={classnames('draft-video-cell-content', classes.placeholderCell)}><EncodingPlaceholderWithStyle placeholderContent={i18n.getString(_TL_('Processing...'))} /></div>;\r\n } else if (status === 'Failed') {\r\n defaultContent = <div className={classnames('failed-video-cell-content', classes.placeholderCell)}><FailedPlaceholderWithStyle placeholderContent={i18n.getString(_TL_('Invalid video'))} /></div>;\r\n }\r\n }\r\n\r\n if (renderCellContent) {\r\n return renderCellContent(defaultContent);\r\n }\r\n return defaultContent;\r\n }, [status, renderCellContent, thumbnailUrl, name, id, i18n, classes.videoCellLabelContainer, classes.placeholderCell, isVideoLoaded, showVideo, durationDesc]);\r\n\r\n const funcRenderOverlayContent = useCallback(() => {\r\n if (renderOverlayContent) {\r\n return renderOverlayContent();\r\n }\r\n return null;\r\n }, [renderOverlayContent]);\r\n\r\n const onCellClick = useCallback(() => {\r\n if (selectable && thumbnailSeletable) {\r\n onClick({ item, selected });\r\n } else if (showVideo) {\r\n onClickVideoCard();\r\n }\r\n }, [item, onClick, onClickVideoCard, selectable, selected, showVideo, thumbnailSeletable]);\r\n\r\n useEffect(() => {\r\n if (isMultiSelecting) {\r\n setThumbnailSelectable(true);\r\n }\r\n }, [isMultiSelecting]);\r\n\r\n return (\r\n <div className={classnames('tiles-grid-cell-content', classes.VideoAssetsGridCellContainer)}>\r\n <TilesGridCellDragDecorator\r\n draggable={draggable}\r\n item={item}\r\n dragItemsLength={selectedItemCount}\r\n onDrag={onDrag}\r\n i18n={i18n}\r\n selected={selected}\r\n >\r\n <TilesGridCellCardWithOverlay\r\n isCellFocused={isCellFocused}\r\n isOverlayEnabled={isOverlayEnabled && isVideoLoaded && thumbnailSeletable}\r\n renderOverlayContent={funcRenderOverlayContent}\r\n customCellCardClass={(isOverlayEnabled && !selected && !isMultiSelecting) ? classes.selectableCardContainerAutoHideCheckbox : classes.selectableCardContainer}\r\n onClick={onCellClick}\r\n >\r\n {selectable && thumbnailSeletable ? (\r\n <TilesGridCellSelectionDecorator item={item} selected={selected} onClick={onClick} ariaLabel={name || i18n.getString(_TL_('Video'))} isFocused={isCellFocused} >\r\n {cellContent}\r\n </TilesGridCellSelectionDecorator>\r\n ) : cellContent}\r\n </TilesGridCellCardWithOverlay>\r\n {\r\n !hideVideo && !isMultiSelecting && status === 'Active' &&\r\n <div key={id} className={classnames('video-wrapper', classes.videoWrapper)} ref={x => setCellRef(x)}>\r\n <Video\r\n src={url}\r\n autoPlay={false}\r\n muteByDefault\r\n i18n={i18n}\r\n ariaLabel={i18n.getString(_TL_('Video'))}\r\n maxWidth={wrapperWidth}\r\n showTime\r\n className={classnames(classes.videoCell, isVideoLoaded && showVideo && 'show-video')}\r\n showPlay={false}\r\n customPlayObject={playVideoObject}\r\n />\r\n </div>\r\n }\r\n </TilesGridCellDragDecorator>\r\n <div className=\"cell-description\">\r\n <div className=\"cell-description-name\">\r\n <TextWithHighlight text={name || ''} highlightedText={highlightedText} enableTooltip />\r\n </div>\r\n {id && (\r\n <div className=\"cell-description-id\">\r\n {`${i18n.getString(_TL_('ID'))} `}\r\n <TextWithHighlight text={id} highlightedText={highlightedText} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nAdsStudioVideoAssetsGridCell.propTypes = {\r\n item: PropTypes.shape({\r\n id: PropTypes.string,\r\n name: PropTypes.string,\r\n url: PropTypes.string,\r\n createdTime: PropTypes.instanceOf(Date),\r\n }).isRequired,\r\n highlightedText: PropTypes.string,\r\n isOverlayEnabled: PropTypes.bool,\r\n isCellFocused: PropTypes.bool,\r\n renderCellContent: PropTypes.func,\r\n renderOverlayContent: PropTypes.func,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n selectable: PropTypes.bool,\r\n selected: PropTypes.bool,\r\n onClick: () => null,\r\n isMultiSelecting: PropTypes.bool,\r\n onClickVideo: PropTypes.func.isRequired,\r\n};\r\n\r\nAdsStudioVideoAssetsGridCell.defaultProps = {\r\n highlightedText: undefined,\r\n isOverlayEnabled: false,\r\n isCellFocused: false,\r\n renderCellContent: null,\r\n renderOverlayContent: null,\r\n selectable: false,\r\n selected: false,\r\n onClick: undefined,\r\n isMultiSelecting: false,\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, tokens, shorthands, mergeClasses } from '@fluentui/react-components';\r\nimport classNames from 'classnames';\r\nimport { CheckmarkCircleFilled } from '@fluentui/react-icons';\r\nimport {\r\n TilesGridCellImage as CellImage,\r\n} from '../../ads-studio-tile-grid';\r\n\r\nexport const useStyles = makeStyles({\r\n imageWrapper: {\r\n position: 'relative',\r\n ...shorthands.borderRadius(tokens.borderRadiusXLarge),\r\n ...shorthands.outline('2px', 'solid', '#0078d4'),\r\n },\r\n containerClass: {\r\n ...shorthands.borderRadius(tokens.borderRadiusXLarge),\r\n boxShadow: '0 0 2px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.14)',\r\n },\r\n imageClass: {\r\n ...shorthands.borderRadius(tokens.borderRadiusXLarge),\r\n },\r\n iconChecked: {\r\n top: '9px',\r\n right: '10px',\r\n position: 'absolute',\r\n color: '#0078d4',\r\n fontSize: '20px',\r\n backgroundColor: '#ffffff',\r\n ...shorthands.borderRadius(tokens.borderRadiusCircular),\r\n },\r\n});\r\n\r\nexport const ImagePanelGridCell = (props) => {\r\n const {\r\n item, i18n, onSelectImage, isSelected, isMultiple,\r\n } = props;\r\n const { url, id } = item || {};\r\n const classes = useStyles();\r\n\r\n const onClickCell = useCallback(() => {\r\n onSelectImage(id);\r\n }, [id, onSelectImage]);\r\n\r\n return (\r\n <div className={isSelected ? mergeClasses('selected-image-wrapper', classes.imageWrapper) : ''}>\r\n <CellImage\r\n src={url}\r\n alt={id || ''}\r\n showSpinner={false}\r\n i18n={i18n}\r\n onClick={onClickCell}\r\n customClasses={{ containerClass: classNames('panel-image-cell', classes.containerClass), imageClass: mergeClasses('cell-image', classes.imageClass) }}\r\n />\r\n {isSelected && isMultiple && <CheckmarkCircleFilled className={classNames('checked-icon', classes.iconChecked)} />}\r\n </div>\r\n );\r\n};\r\n\r\nImagePanelGridCell.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n item: PropTypes.shape({\r\n id: PropTypes.string,\r\n url: PropTypes.string,\r\n }).isRequired,\r\n onSelectImage: PropTypes.func.isRequired,\r\n isSelected: PropTypes.bool.isRequired,\r\n isMultiple: PropTypes.bool,\r\n};\r\n\r\nImagePanelGridCell.defaultProps = {\r\n isMultiple: true,\r\n};\r\n\r\n","import React, { useMemo, useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nimport _ from 'underscore';\r\nimport { makeStyles, } from '@fluentui/react-components';\r\nimport { ImagePanelGridCell } from '../ads-studio-asset-grid-cell';\r\nimport { SectionTilesGrid, TilesGridLoadingCell } from '../ads-studio-tile-grid';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\nimport { GridSectionName, DEFAULT_PAGE_SIZE } from '../../model/constants';\r\n\r\nconst DEFAULT_IMAGE_WIDTH = 211;\r\nconst DEFAULT_COLUMN_PADDING = 16;\r\n\r\nconst useStyles = makeStyles({\r\n contentGridWrapper: {\r\n paddingTop: '24px',\r\n },\r\n description: {\r\n marginBottom: '8px',\r\n fontSize: '14px',\r\n lineHeight: '20px',\r\n fontWeight: '600',\r\n },\r\n});\r\n\r\nexport const PanelImageGrid = ({\r\n i18n,\r\n dataService,\r\n onFailedToLoadData,\r\n onSelectImage,\r\n overlayBodyRef,\r\n imageWidth,\r\n columnPadding,\r\n isHideDescription,\r\n isMultiple = true,\r\n isLoadingMore,\r\n}) => {\r\n const {\r\n assets,\r\n totalAssetCount,\r\n loadMoreData,\r\n } = dataService;\r\n const classes = useStyles();\r\n const [selectedItemIds, setSelectedItemIds] = useState([]);\r\n\r\n const onSelectedChange = useCallback((selectedItemId) => {\r\n if (selectedItemIds.includes(selectedItemId)) {\r\n const newSelectedItems = selectedItemIds.filter(itemId => itemId !== selectedItemId);\r\n setSelectedItemIds(newSelectedItems);\r\n } else {\r\n setSelectedItemIds(isMultiple ? [...selectedItemIds, selectedItemId] : [selectedItemId]);\r\n }\r\n onSelectImage(selectedItemId);\r\n }, [isMultiple, onSelectImage, selectedItemIds]);\r\n\r\n const assetsWithAction = useMemo(() => _.map(assets, (image) => {\r\n const {\r\n id,\r\n } = image;\r\n\r\n return ({\r\n ...image,\r\n onAction: (event) => {\r\n const code = _.get(event, ['detail', 'originalEvent', 'code']);\r\n if (code === 'Enter' || code === 'Space') {\r\n onSelectedChange(id);\r\n event.preventDefault();\r\n }\r\n },\r\n });\r\n }), [assets, onSelectedChange]);\r\n\r\n const imagesGridSection = useMemo(() => ({\r\n sectionName: GridSectionName.Asset,\r\n sectionClassName: 'ads-studio-image-section',\r\n itemKey: 'id',\r\n items: assetsWithAction,\r\n totalItemCount: totalAssetCount,\r\n config: {\r\n width: imageWidth || DEFAULT_IMAGE_WIDTH,\r\n columnPadding: columnPadding || DEFAULT_COLUMN_PADDING,\r\n scrollContainer: overlayBodyRef || '.ads-studio-panel-container-drawer-overlay-body',\r\n },\r\n }), [assetsWithAction, totalAssetCount, imageWidth, columnPadding, overlayBodyRef]);\r\n\r\n const sectionGridData = useMemo(\r\n () => ([imagesGridSection]),\r\n [imagesGridSection]\r\n );\r\n\r\n const onRenderCell = useCallback(({ item }) => {\r\n const { _index, id } = item;\r\n\r\n return (\r\n <ImagePanelGridCell\r\n item={item}\r\n index={_index}\r\n i18n={i18n}\r\n isMultiple={isMultiple}\r\n onSelectImage={onSelectedChange}\r\n isSelected={selectedItemIds.includes(id)}\r\n />\r\n );\r\n }, [i18n, onSelectedChange, selectedItemIds, isMultiple]);\r\n\r\n const loadNextPage = useCallback(() => {\r\n if (assets && assets.length >= totalAssetCount) {\r\n return;\r\n }\r\n const p$res = loadMoreData({ count: DEFAULT_PAGE_SIZE });\r\n if (p$res) {\r\n p$res.catch((err) => {\r\n if (onFailedToLoadData) {\r\n onFailedToLoadData(err);\r\n }\r\n });\r\n }\r\n }, [assets, loadMoreData, onFailedToLoadData, totalAssetCount]);\r\n\r\n const onRenderLoadingCell = useCallback(({ items, totalItemCount }) => {\r\n if ((items.length < totalItemCount) && (items.length > 0)) {\r\n return (\r\n <TilesGridLoadingCell onLoading={loadNextPage} key={items.length} >\r\n {isLoadingMore && (\r\n <div className=\"section-loading\">\r\n <AdsStudioSpinner useCustomSize />\r\n </div>\r\n )}\r\n </TilesGridLoadingCell>\r\n );\r\n }\r\n return null;\r\n }, [isLoadingMore, loadNextPage]);\r\n\r\n return (\r\n <div className={classNames('panel-grid', classes.contentGridWrapper)}>\r\n {!isHideDescription && <div className={classes.description}>{i18n.getString(_TL_('Suggestions from recent searches'))}</div>}\r\n <SectionTilesGrid\r\n sectionData={sectionGridData}\r\n onRenderCell={onRenderCell}\r\n onRenderLoadingCell={onRenderLoadingCell}\r\n loadNextPage={loadNextPage}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nPanelImageGrid.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n isMultiple: PropTypes.bool,\r\n dataService: PropTypes.shape({}),\r\n // logger: PropTypes.shape({\r\n // logTrace: PropTypes.func,\r\n // }).isRequired,\r\n onFailedToLoadData: PropTypes.func,\r\n onSelectImage: PropTypes.func.isRequired,\r\n overlayBodyRef: PropTypes.shape({}),\r\n};\r\n\r\nPanelImageGrid.defaultProps = {\r\n dataService: {},\r\n onFailedToLoadData: _.noop,\r\n overlayBodyRef: null,\r\n isMultiple: true,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const usePerformanceFilterBarEditingStyle = makeStyles({\r\n filterBarEditingContainer: {\r\n position: 'relative',\r\n minHeight: '56px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n backgroundColor: '#f3f2f1',\r\n\r\n '& .filter-list-editing': {\r\n display: 'flex',\r\n ...shorthands.flex(1),\r\n flexWrap: 'wrap',\r\n alignItems: 'flex-start',\r\n paddingLeft: '12px',\r\n\r\n '& .filter-list-divider': {\r\n paddingRight: '12px',\r\n },\r\n },\r\n\r\n '& .filter-bar-button-group': {\r\n marginLeft: 'auto',\r\n display: 'flex',\r\n },\r\n\r\n '& button.add-filter-button .iconba-Add': {\r\n color: '#373737',\r\n },\r\n '& button.filter-bar-button': {\r\n ...shorthands.border('none'),\r\n backgroundColor: 'transparent',\r\n ...shorthands.padding('0px', '7px'),\r\n height: '56px',\r\n '& .iconba': {\r\n color: '#373737',\r\n },\r\n '&:hover': {\r\n backgroundColor: '#f3f2f1',\r\n },\r\n '&:focus': {\r\n backgroundColor: '#e1dfdd',\r\n '&:hover': {\r\n backgroundColor: '#d0d0d0',\r\n },\r\n },\r\n },\r\n '& .filter-bar-divider': {\r\n ...shorthands.borderLeft('1px', 'solid', '#eaeaea'),\r\n ...shorthands.margin('8px', '0px'),\r\n },\r\n '& button.filter-bar-cancel-button': {\r\n ...shorthands.padding('0px', '18px'),\r\n minWidth: 'auto',\r\n '& .iconba:before': {\r\n color: '#373737',\r\n },\r\n },\r\n },\r\n});\r\n\r\nexport const usePerformanceFilterBarReadonlyStyle = makeStyles({\r\n filterBarReadonlyContainer: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n\r\n '& .btn.btn-link': {\r\n marginLeft: '5px',\r\n color: '#17717a',\r\n ...shorthands.textDecoration('underline'),\r\n },\r\n\r\n '& .filter-list': {\r\n height: '56px',\r\n paddingLeft: '12px',\r\n display: 'block',\r\n alignItems: 'center',\r\n textOverflow: 'ellipsis',\r\n color: '#17717a',\r\n ...shorthands.overflow('hidden'),\r\n whiteSpace: 'nowrap',\r\n\r\n fontFamily: 'Segoe UI',\r\n fontSize: '14px',\r\n lineHeight: '19px',\r\n paddingTop: '14px',\r\n\r\n '& .asset-library-search': {\r\n top: '0px',\r\n },\r\n },\r\n '& .filter-list:focus-within': {\r\n textOverflow: 'inherit', // collpase text would invisiable issues when use tab to change focus, reference here: https://msasg.visualstudio.com/DefaultCollection/Bing_Ads/_workitems/edit/3702640/\r\n },\r\n },\r\n addFilterButton: {\r\n ...shorthands.flex(0, 0, 'auto'),\r\n ...shorthands.border('none'),\r\n height: '56px',\r\n fontSize: '14px',\r\n marginLeft: '4px',\r\n paddingLeft: '8px',\r\n paddingRight: '8px',\r\n backgroundColor: '#ffffff',\r\n fontWeight: '600',\r\n },\r\n});\r\n\r\nexport const useViewAllFiltersButtonStyle = makeStyles({\r\n viewAllButton: {\r\n ...shorthands.border('none'),\r\n color: 'rgb(23, 113, 122) !important',\r\n fontWeight: '400',\r\n width: 'auto',\r\n minWidth: '0px !important',\r\n ...shorthands.padding('0px !important', '8px !important'),\r\n backgroundColor: 'transparent !important',\r\n lineHeight: '56px !important',\r\n '&:hover': {\r\n ...shorthands.textDecoration('underline'),\r\n },\r\n },\r\n viewContentTitle: {\r\n paddingLeft: '8px',\r\n fontWeight: '600',\r\n fontSize: '20px',\r\n },\r\n viewAllFilterItem: {\r\n display: 'block',\r\n ...shorthands.border('none'),\r\n color: 'rgb(23, 113, 122) !important',\r\n fontWeight: '400',\r\n width: 'auto',\r\n minWidth: '0px !important',\r\n ...shorthands.padding('0px !important', '8px !important'),\r\n height: 'auto',\r\n backgroundColor: 'transparent !important',\r\n '&:hover': {\r\n ...shorthands.textDecoration('underline'),\r\n },\r\n },\r\n});\r\n","import _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport React, { Fragment } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { ArrowClockwiseRegular, DismissRegular } from '@fluentui/react-icons';\r\n\r\nimport { usePerformanceFilterBarEditingStyle } from './styles';\r\n\r\nconst EditingFilterBar = ({\r\n filters,\r\n focusedFilter,\r\n onRenderNewFilterContextMenu,\r\n onRenderFilter,\r\n onCloseClick,\r\n onResetClick,\r\n i18n,\r\n}) => {\r\n const classes = usePerformanceFilterBarEditingStyle();\r\n // if no editing filter, show new filter context menu\r\n\r\n const getDivider = (index) => {\r\n if (index === filters.length - 1) {\r\n return null;\r\n }\r\n return (<span className=\"filter-list-divider\" />);\r\n };\r\n\r\n return (\r\n <div className={classNames('filterBarEditingContainer', classes.filterBarEditingContainer)}>\r\n <div className=\"filter-list-editing\">\r\n {filters.map((filter, index) => (\r\n <Fragment key={`filter-${filter.id}`}>\r\n {onRenderFilter({\r\n filter,\r\n focused: focusedFilter && focusedFilter.id === filter.id,\r\n index,\r\n isLast: index === filters.length - 1,\r\n isFirst: index === 0,\r\n })}\r\n {getDivider(index)}\r\n </Fragment>\r\n ))}\r\n {onRenderNewFilterContextMenu()}\r\n </div>\r\n <div className=\"filter-bar-button-group\">\r\n <Button\r\n onClick={onResetClick}\r\n className=\"filter-bar-button reset-button\"\r\n aria-label={i18n.getString(_TL_('Reset filter to default state'))}\r\n icon={<ArrowClockwiseRegular />}\r\n >\r\n {i18n.getString(_TL_('Reset'))}\r\n </Button>\r\n <div className=\"filter-bar-divider\" />\r\n <Button\r\n onClick={onCloseClick}\r\n className=\"filter-bar-cancel-button filter-bar-button\"\r\n aria-label={i18n.getString(_TL_('Close filter panel'))}\r\n icon={<DismissRegular />}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nEditingFilterBar.propTypes = {\r\n filters: PropTypes.arrayOf(PropTypes.shape({})),\r\n focusedFilter: PropTypes.shape({\r\n id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n }),\r\n onRenderNewFilterContextMenu: PropTypes.func,\r\n onRenderFilter: PropTypes.func.isRequired,\r\n onCloseClick: PropTypes.func,\r\n onResetClick: PropTypes.func,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\nEditingFilterBar.defaultProps = {\r\n filters: [],\r\n focusedFilter: null,\r\n onRenderNewFilterContextMenu: () => null,\r\n onCloseClick: _.noop,\r\n onResetClick: _.noop,\r\n};\r\n\r\nexport const PerformanceEditingFilterBar\r\n = React.memo(EditingFilterBar);\r\n","import _ from 'underscore';\r\nimport React from 'react';\r\nimport classNames from 'classnames';\r\nimport { Popover, PopoverSurface, PopoverTrigger, Button, mergeClasses } from '@fluentui/react-components';\r\nimport PropTypes from 'prop-types';\r\nimport { useViewAllFiltersButtonStyle } from './styles';\r\n\r\nexport const FilterListWithPopover = ({\r\n filters, onClickFilter, i18n,\r\n}) => {\r\n const classes = useViewAllFiltersButtonStyle();\r\n\r\n return (\r\n <div className=\"view-content-popover\">\r\n <div className={classes.viewContentTitle}>{i18n.getString('Filters')}</div>\r\n {_.map(filters, filter =>\r\n (\r\n <Button\r\n key={`filter-${filter.id}`}\r\n className={classNames('filter-item', classes.viewAllFilterItem)}\r\n onClick={() => onClickFilter(filter)}\r\n >\r\n <span>{`${i18n.getString(filter.title)}: ${filter.humanizedValue}`}</span>\r\n </Button>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nFilterListWithPopover.propTypes = {\r\n filters: PropTypes.arrayOf(PropTypes.shape({\r\n humanizedValue: PropTypes.string,\r\n })).isRequired,\r\n onClickFilter: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\n\r\nconst ViewAllFiltersButtonImpl = ({\r\n filters, onClickFilter, i18n,\r\n}) => {\r\n const classes = useViewAllFiltersButtonStyle();\r\n // don't show the always visible filters on the View all popover\r\n const selectedFilters = _.filter(filters, ({ isFilterAlwaysVisible }) => !isFilterAlwaysVisible);\r\n return (_.isEmpty(selectedFilters) ? null : (\r\n <Popover withArrow positioning={{ position: 'after', align: 'start' }}>\r\n <PopoverTrigger>\r\n <Button as=\"a\" className={mergeClasses('view-all-button', classes.viewAllButton)}>{i18n.getString(_TL_('View all'))}</Button>\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface>\r\n <FilterListWithPopover i18n={i18n} onClickFilter={onClickFilter} filters={selectedFilters} />\r\n </PopoverSurface>\r\n </Popover>\r\n ));\r\n};\r\n\r\nViewAllFiltersButtonImpl.propTypes = {\r\n filters: PropTypes.arrayOf(PropTypes.shape({\r\n isFilterAlwaysVisible: PropTypes.bool,\r\n })).isRequired,\r\n onClickFilter: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\nexport const ViewAllFiltersButton = React.memo(ViewAllFiltersButtonImpl);\r\n","import _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport { Button } from '@fluentui/react-components';\r\nimport { AddRegular } from '@fluentui/react-icons';\r\nimport React, { Fragment, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { keyCode } from '@bingads-webui/keycode';\r\nimport { FilterType } from '../../model/filter-type';\r\nimport { ViewAllFiltersButton } from './view-all-filters-button';\r\nimport { usePerformanceFilterBarReadonlyStyle } from './styles';\r\n\r\nconst ReadonlyFilterBar = ({\r\n filters,\r\n onRenderFilter,\r\n onClickFilter,\r\n onClickAddFilterButton,\r\n i18n,\r\n}) => {\r\n const classes = usePerformanceFilterBarReadonlyStyle();\r\n const onKeyPress = (event, filter, index) => {\r\n if (event.which === keyCode.Enter || event.which === keyCode.Space) {\r\n onClickFilter(filter, index);\r\n }\r\n };\r\n\r\n const filterListRef = useRef();\r\n const onFilterBlur = () => {\r\n // reset scroll position to 0\r\n if (filterListRef.current) {\r\n filterListRef.current.scrollTo(0, 0);\r\n }\r\n };\r\n\r\n return (\r\n <div className={classNames('filterBarReadonlyContainer', classes.filterBarReadonlyContainer)}>\r\n <div className=\"filter-list\" ref={filterListRef} onBlur={onFilterBlur}>\r\n {filters.map((filter, index) => (\r\n filter.type === FilterType.SearchText ?\r\n onRenderFilter({\r\n filter,\r\n index,\r\n isLast: index === filters.length - 1,\r\n isFirst: index === 0,\r\n }) :\r\n <Fragment key={`filter-${filter.id}`}>\r\n <span\r\n onClick={() => onClickFilter(filter, index)}\r\n tabIndex=\"0\"\r\n role=\"button\"\r\n onKeyDown={event => onKeyPress(event, filter, index)}\r\n >\r\n {onRenderFilter({\r\n filter,\r\n index,\r\n isLast: index === filters.length - 1,\r\n isFirst: index === 0,\r\n })}\r\n </span>\r\n </Fragment>\r\n ))}\r\n </div>\r\n <ViewAllFiltersButton filters={filters} onClickFilter={onClickFilter} i18n={i18n} />\r\n <Button className={classNames('add-filter-button', classes.addFilterButton)} icon={<AddRegular />} name=\"add filter\" onClick={onClickAddFilterButton}>{i18n.getString('Add filter')}</Button>\r\n </div>\r\n );\r\n};\r\n\r\nReadonlyFilterBar.propTypes = {\r\n filters: PropTypes.arrayOf(PropTypes.shape({})),\r\n onRenderFilter: PropTypes.func.isRequired,\r\n onClickFilter: PropTypes.func,\r\n onClickAddFilterButton: PropTypes.func,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\nReadonlyFilterBar.defaultProps = {\r\n filters: [],\r\n onClickFilter: _.noop,\r\n onClickAddFilterButton: _.noop,\r\n};\r\n\r\nexport const PerformanceReadonlyFilterBar\r\n = React.memo(ReadonlyFilterBar);\r\n","/* eslint-disable jsx-a11y/media-has-caption */\r\nimport React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nconst useStyles = makeStyles({\r\n dynamicSizeContainer: {\r\n height: '100%',\r\n\r\n '& video': {\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n position: 'relative',\r\n top: '50%',\r\n transform: 'translateY(-50%)',\r\n },\r\n },\r\n videoOutlineGray: {\r\n '& video:focus': {\r\n ...shorthands.outline('2px', 'solid', 'gray'),\r\n outlineOffset: '1px',\r\n },\r\n },\r\n videoNormalContainer: {\r\n '& video::-webkit-media-controls-play-button:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-pause-button:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-volume-slider:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-timeline:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-mute-button:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-fullscreen-button:focus': {\r\n outlineOffset: '-2px',\r\n },\r\n '& video::-webkit-media-controls-panel': {\r\n backgroundImage: 'linear-gradient(0deg,rgba(255, 255, 255, 0.8), transparent) !important',\r\n filter: 'brightness(1)',\r\n boxShadow: 'none !important',\r\n },\r\n },\r\n});\r\n\r\n// since the <video> didn't support the stream play directly, so will using one link in DownloadUrl instead of the url as src.\r\nexport const VideoPlaybackView = (props) => {\r\n const {\r\n height,\r\n width,\r\n src,\r\n thumbnailUrl,\r\n hideControls,\r\n onLoadedMetadata,\r\n onErrorHanler,\r\n isOutlineGray,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const useDynamicVideoSize = !(width > 0 || height > 0);\r\n\r\n const onError = useCallback((ev) => {\r\n const errorCode = ev && ev.target && ev.target.error.code;\r\n onErrorHanler(errorCode);\r\n }, [onErrorHanler]);\r\n\r\n return (\r\n <div className={classnames(useDynamicVideoSize && classes.dynamicSizeContainer, isOutlineGray && classes.videoOutlineGray, classes.videoNormalContainer, 'video-playback-view')}>\r\n <video\r\n width={width}\r\n height={height}\r\n poster={thumbnailUrl}\r\n controls={!hideControls}\r\n onLoadedMetadata={onLoadedMetadata}\r\n onError={onError}\r\n src={src}\r\n controlsList=\"nodownload nofullscreen\"\r\n disablePictureInPicture\r\n />\r\n </div>);\r\n};\r\n\r\nVideoPlaybackView.propTypes = {\r\n isOutlineGray: PropTypes.bool,\r\n src: PropTypes.string.isRequired,\r\n thumbnailUrl: PropTypes.string,\r\n hideControls: PropTypes.bool,\r\n height: PropTypes.number,\r\n width: PropTypes.number,\r\n onErrorHanler: PropTypes.func,\r\n onLoadedMetadata: PropTypes.func,\r\n};\r\n\r\nVideoPlaybackView.defaultProps = {\r\n isOutlineGray: false,\r\n thumbnailUrl: null,\r\n hideControls: false,\r\n width: undefined,\r\n height: undefined,\r\n onErrorHanler: _.noop,\r\n onLoadedMetadata: _.noop,\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { makeStyles, Spinner, shorthands } from '@fluentui/react-components';\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n justifyContent: 'center',\r\n },\r\n mainViewContainer: {\r\n width: '100%',\r\n backgroundColor: 'rgb(0,0,0, 0.8)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexGrow: 1,\r\n },\r\n mainViewContentContainer: {\r\n height: '41px',\r\n width: '80px',\r\n backgroundColor: 'rgb(50,49,48, 0.6)',\r\n alignItems: 'center',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n },\r\n mainViewIconLabelContainer: {\r\n marginLeft: '6px',\r\n },\r\n contentIcon: {\r\n width: '25px',\r\n },\r\n\r\n footerContainer: {\r\n backgroundColor: '#2F2F2F',\r\n display: 'flex',\r\n height: '48px',\r\n ...shorthands.padding('10px'),\r\n alignItems: 'center',\r\n lineHeight: '21px',\r\n whiteSpace: 'nowrap',\r\n ...shorthands.overflow('hidden'),\r\n textOverflow: 'ellipsis',\r\n },\r\n footerInvalid: {\r\n backgroundColor: '#FFF4CE',\r\n }, // required otherwise nested classnames will not work\r\n footerContent: {\r\n // color: palette.white,\r\n display: 'flex',\r\n marginLeft: '8px',\r\n alignItems: 'center',\r\n },\r\n helpLink: {\r\n color: '#337ab7',\r\n ...shorthands.textDecoration('underline'),\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n});\r\n\r\nexport const ItemPlaceholderBoxViewFooterType = {\r\n info: 'info',\r\n warning: 'warning',\r\n};\r\n\r\nexport const ItemPlaceholderBoxView = ({\r\n className,\r\n mainViewIcon,\r\n mainViewIconLabel,\r\n footerProps,\r\n}) => {\r\n const {\r\n type,\r\n summary,\r\n tip,\r\n learnMoreLinkText,\r\n learnMoreLinkTopic,\r\n } = footerProps || {};\r\n\r\n const classes = useStyles();\r\n\r\n const renderFooter = useCallback(() => {\r\n let content;\r\n\r\n if (footerProps) {\r\n content = (\r\n <div className={classnames(\r\n classes.footerContainer,\r\n type === ItemPlaceholderBoxViewFooterType.warning && classes.footerInvalid\r\n )}\r\n >\r\n <Spinner size=\"small\" />\r\n <div className={classes.footerContent}>\r\n {\r\n summary &&\r\n <span className={classes.footContentStatus}><b className=\"summary\">{summary}</b></span>\r\n }\r\n {\r\n tip &&\r\n <React.Fragment>\r\n <span> </span>\r\n <span className=\"tip\">{tip}</span>\r\n </React.Fragment>\r\n }\r\n {\r\n learnMoreLinkText && learnMoreLinkTopic &&\r\n <React.Fragment>\r\n <span> </span>\r\n <button className={classnames(`HelpTopic ${classes.helpLink}`)} query={`help:${learnMoreLinkTopic}`}>{learnMoreLinkText}</button>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return content;\r\n }, [classes.footContentStatus, classes.footerContainer, classes.footerContent, classes.footerInvalid, classes.helpLink, footerProps, learnMoreLinkText, learnMoreLinkTopic, summary, tip, type]);\r\n\r\n return (\r\n <div className={classnames(classes.container, className)}>\r\n <div className={classes.mainViewContainer}>\r\n <div className={classes.mainViewContentContainer}>\r\n <img src={mainViewIcon} className={classes.contentIcon} alt=\"\" />\r\n <span className={classes.mainViewIconLabelContainer}>{mainViewIconLabel}</span>\r\n </div>\r\n </div>\r\n {renderFooter()}\r\n </div>\r\n );\r\n};\r\n\r\nItemPlaceholderBoxView.propTypes = {\r\n className: PropTypes.string,\r\n mainViewIcon: PropTypes.string.isRequired,\r\n mainViewIconLabel: PropTypes.string.isRequired,\r\n footerProps: PropTypes.shape({\r\n type: PropTypes.oneOf(Object.keys(ItemPlaceholderBoxViewFooterType)),\r\n renderIcon: PropTypes.func,\r\n summary: PropTypes.string,\r\n tip: PropTypes.string,\r\n learnMoreLinkText: PropTypes.string,\r\n learnMoreLinkTopic: PropTypes.string,\r\n }),\r\n};\r\n\r\nItemPlaceholderBoxView.defaultProps = {\r\n className: '',\r\n footerProps: {},\r\n};\r\n","import { baseItemBoxProgressStyles } from '@bingads-webui-campaign-react/upload-file-picker';\r\nimport { shorthands } from '@fluentui/react-components';\r\n\r\nexport const getFolderProgressPreviewStyles = {\r\n imageContent: {\r\n ...baseItemBoxProgressStyles.imageContent,\r\n height: '50px',\r\n display: 'flex',\r\n flexDirection: 'row',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n },\r\n imageName: {\r\n display: 'none',\r\n },\r\n imageContentText: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexGrow: '1',\r\n flexShrink: '1',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n marginLeft: '9px',\r\n marginRight: '22px',\r\n fontSize: '12px',\r\n ...shorthands.overflow('hidden'),\r\n },\r\n folderName: {\r\n fontWeight: '600',\r\n flexGrow: '1',\r\n flexShrink: '1',\r\n ...shorthands.overflow('hidden'),\r\n textOverflow: 'ellipsis',\r\n },\r\n folderSize: {\r\n flexGrow: '0',\r\n flexShrink: '0',\r\n fontWeight: '400',\r\n },\r\n folderIconRoot: {\r\n display: 'inline-block',\r\n height: '25.78px',\r\n width: '34px',\r\n marginLeft: '13px',\r\n flexGrow: '0',\r\n flexShrink: '0',\r\n },\r\n};\r\n","import React from 'react';\r\nimport { makeStyles, mergeClasses } from '@fluentui/react-components';\r\nimport { FolderIcon } from '../folder-icon-component';\r\n\r\nimport { getFolderProgressPreviewStyles } from './styles';\r\n\r\nconst useStyle = makeStyles(getFolderProgressPreviewStyles);\r\n\r\nexport const createFolderPreviewComponent = ({ i18n }) => ({\r\n url,\r\n alt,\r\n name,\r\n numberOfAssets,\r\n}) => {\r\n const classes = useStyle();\r\n return (\r\n <div className={mergeClasses('folder-upload-image-content', classes.imageContent)} alt={alt}>\r\n <FolderIcon thumbnailImageUrl={url} folderIconRootClassName={classes.folderIconRoot} />\r\n <div className={classes.imageContentText}>\r\n <div className={mergeClasses('folder-name', classes.folderName)}>\r\n {name}\r\n </div>\r\n <div className={classes.folderSize}>\r\n {i18n.getString(_TL_('{{numberOfAssets}} assets'), { numberOfAssets: numberOfAssets || 0 })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SimpleImagePreview } from '@bingads-webui-campaign-react/upload-file-picker';\r\n\r\nexport const FileUploadingPreview = ({\r\n className,\r\n url,\r\n isVideo,\r\n alt,\r\n}) => {\r\n if (isVideo) {\r\n // eslint-disable-next-line jsx-a11y/media-has-caption\r\n return <video className={className} src={url} />;\r\n }\r\n\r\n return <SimpleImagePreview className={className} url={url} alt={alt} />;\r\n};\r\n\r\nFileUploadingPreview.propTypes = {\r\n className: PropTypes.string,\r\n url: PropTypes.string.isRequired,\r\n isVideo: PropTypes.bool,\r\n alt: PropTypes.string,\r\n};\r\n\r\nFileUploadingPreview.defaultProps = {\r\n className: '',\r\n isVideo: false,\r\n alt: '',\r\n};\r\n","import React, { useState, useMemo, useCallback, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classnames from 'classnames';\r\nimport { makeStyles } from '@fluentui/react-components';\r\nimport { ItemPlaceholderBoxView } from './item-placeholder-box-view';\r\nimport { VideoPlaybackView } from './video-playback-view';\r\n\r\n\r\nconst videoIcon = \"data:image/svg+xml,%3Csvg width='14' height='12' viewBox='0 0 14 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 3C1 2.17157 1.67157 1.5 2.5 1.5H8.5C9.32843 1.5 10 2.17157 10 3V9C10 9.82843 9.32843 10.5 8.5 10.5H2.5C1.67157 10.5 1 9.82843 1 9V3ZM2.5 0.5C1.11929 0.5 0 1.61929 0 3V9C0 10.3807 1.11929 11.5 2.5 11.5H8.5C9.88071 11.5 11 10.3807 11 9V8.49943L12.7999 9.84997C13.2943 10.221 14 9.86819 14 9.25008V2.75496C14 2.13743 13.2954 1.78451 12.8009 2.15432L11 3.50093V3C11 1.61929 9.88071 0.5 8.5 0.5H2.5ZM11 4.74959L13 3.25407V8.74993L11 7.24921V4.74959Z' fill='white'/%3E%3C/svg%3E%0A\";\r\n\r\nconst VideoLoadState = {\r\n notLoaded: 'notLoaded',\r\n loaded: 'loaded',\r\n error: 'error',\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n container: {\r\n marginTop: '20px',\r\n },\r\n placeholderView: {\r\n height: '500px',\r\n maxWidth: '746px',\r\n width: '100%',\r\n },\r\n hidden: {\r\n visibility: 'hidden',\r\n },\r\n shown: {\r\n visibility: 'visible',\r\n },\r\n});\r\n\r\nconst PlaceHolderBoxViewFooterConfig = {\r\n text: {\r\n summary: _TL_('Your video is currently loading.'),\r\n tip: _TL_('As long as your browser supports the video\\'s URL, it\\'ll display once it finishes.'),\r\n },\r\n};\r\n\r\nexport const VideoLoadPreview = ({\r\n i18n,\r\n url,\r\n onLoadedMetadata,\r\n onErrorHandler,\r\n}) => {\r\n const classes = useStyles();\r\n const [videoLoadState, setVideoLoadState] = useState(VideoLoadState.notLoaded);\r\n const [cachedUrl, setCachedUrl] = useState(url);\r\n\r\n useEffect(() => {\r\n if (url !== cachedUrl) {\r\n setCachedUrl(url);\r\n setVideoLoadState(VideoLoadState.notLoaded);\r\n }\r\n }, [cachedUrl, url]);\r\n\r\n const footerProps = useMemo(() => {\r\n const localizedTextFields = _.mapObject(\r\n PlaceHolderBoxViewFooterConfig.text,\r\n text => i18n.getString(text)\r\n );\r\n\r\n return {\r\n ...localizedTextFields,\r\n };\r\n }, [i18n]);\r\n\r\n const onLoadedMetadataInternal = useCallback(() => {\r\n setVideoLoadState(VideoLoadState.loaded);\r\n onLoadedMetadata();\r\n }, [onLoadedMetadata]);\r\n\r\n const onErrorHandlerInternal = useCallback((error) => {\r\n setVideoLoadState(VideoLoadState.error);\r\n onErrorHandler(error);\r\n }, [onErrorHandler]);\r\n\r\n return (\r\n <div className={classnames(classes.container, 'video-load-preview')}>\r\n {\r\n videoLoadState === VideoLoadState.notLoaded &&\r\n <ItemPlaceholderBoxView\r\n className={classes.placeholderView}\r\n mainViewIcon={videoIcon}\r\n mainViewIconLabel={i18n.getString(_TL_('Video'))}\r\n footerProps={footerProps}\r\n />\r\n }\r\n <div className={classnames(classes.hidden, videoLoadState === VideoLoadState.loaded && classes.shown)}>\r\n <VideoPlaybackView\r\n onLoadedMetadata={onLoadedMetadataInternal}\r\n onErrorHanler={onErrorHandlerInternal}\r\n src={url}\r\n height={400}\r\n isOutlineGray\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nVideoLoadPreview.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n url: PropTypes.string.isRequired,\r\n onLoadedMetadata: PropTypes.func,\r\n onErrorHandler: PropTypes.func,\r\n};\r\n\r\nVideoLoadPreview.defaultProps = {\r\n onLoadedMetadata: _.noop,\r\n onErrorHandler: _.noop,\r\n};\r\n","import React, { useState, useCallback } from 'react';\r\nimport classnames from 'classnames';\r\nimport PropTypes from 'prop-types';\r\nimport _, { isEmpty } from 'underscore';\r\nimport { MessageBar } from '@fluentui/react-message-bar';\r\nimport { isValidUrl } from '@bingads-webui/url-util';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport { makeStyles, Input, shorthands } from '@fluentui/react-components';\r\nimport { VideoLoadPreview } from './video-load-preview';\r\n\r\nconst UrlInputMaxLen = 2048;\r\nconst EnterKeycode = 13;\r\n\r\nconst useStyles = makeStyles({\r\n helpLink: {\r\n color: '#337ab7',\r\n ...shorthands.textDecoration('underline'),\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n container: {\r\n marginTop: '16px',\r\n lineHeight: '20px',\r\n },\r\n addUrlInput: {\r\n marginTop: '16px',\r\n width: '300px',\r\n },\r\n placeHolderImage: {\r\n position: 'absolute',\r\n right: '380px',\r\n top: '300px',\r\n },\r\n errorMesBelowUrlInput: {\r\n marginTop: '6px',\r\n color: '#A80000',\r\n },\r\n videoPlaybackView: {\r\n marginTop: '16px',\r\n },\r\n messageContainer: {\r\n bottom: '65px',\r\n position: 'absolute',\r\n left: '0px',\r\n },\r\n});\r\n\r\nconst placeholderImage =\r\n \"data:image/svg+xml,%3Csvg width='283' height='208' viewBox='0 0 283 208' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg filter='url(%23filter0_d_725_95734)'%3E%3Cpath d='M70.5224 137.244H227.751C229.828 137.244 231.443 135.647 231.443 133.592V40.9266C231.443 38.8725 229.828 37.2748 227.751 37.2748H70.5224C68.446 37.2748 66.8311 38.8725 66.8311 40.9266V133.592C66.8311 135.647 68.5614 137.244 70.5224 137.244Z' fill='%2328C2D1'/%3E%3C/g%3E%3Cpath d='M87.7524 127.473H210.52C212.141 127.473 213.402 126.464 213.402 125.166V66.6407C213.402 65.3433 212.141 64.3342 210.52 64.3342H87.7524C86.1311 64.3342 84.8701 65.3433 84.8701 66.6407V125.166C84.8701 126.464 86.2212 127.473 87.7524 127.473Z' fill='%23EFEFEF'/%3E%3Cpath d='M231.667 40.3377L67.0303 40.2814L67.0038 55.6503L231.641 55.7066L231.667 40.3377Z' fill='%232B88D8'/%3E%3Cpath d='M219.951 46.3243L95.4434 46.2837L95.4373 49.6655L219.945 49.7061L219.951 46.3243Z' fill='%23EFEFEF'/%3E%3Cpath d='M79.4756 43.7731C79.4748 43.7731 79.4741 43.7732 79.4726 43.7733C79.4718 43.7734 79.4718 43.7734 79.471 43.7735C79.4695 43.7736 79.4688 43.7737 79.4673 43.7739C76.9794 43.7764 74.9626 45.7928 74.9606 48.2811C74.9586 50.7701 76.973 52.7894 79.4601 52.7954C79.4616 52.7952 79.4625 52.7959 79.464 52.7958C79.4647 52.7957 79.4647 52.7957 79.4655 52.7956C79.4663 52.7956 79.467 52.7955 79.4685 52.7953C81.9598 52.7971 83.9811 50.7795 83.9829 48.2881C83.9853 45.796 81.9669 43.7748 79.4756 43.7731ZM79.4662 52.1444C79.4655 52.1445 79.4639 52.1447 79.4632 52.1447C78.9887 52.1421 78.3591 51.3349 78.0565 49.9787L80.8781 49.9811C80.5724 51.337 79.9411 52.144 79.4662 52.1444ZM77.9424 49.328C77.9006 49.0019 77.8779 48.6525 77.8778 48.2825C77.8778 47.9064 77.903 47.5524 77.9457 47.2218L80.9909 47.2238C81.0339 47.5536 81.0578 47.9083 81.057 48.2845C81.0565 48.6553 81.0331 49.0038 80.9914 49.3296L77.9424 49.328ZM75.6117 48.281C75.6118 47.9133 75.6652 47.558 75.7617 47.2207L77.2916 47.2222C77.2505 47.5625 77.2285 47.917 77.2282 48.2824C77.2281 48.6425 77.2492 48.992 77.2882 49.3283L75.7553 49.3272C75.6622 48.9939 75.6111 48.6434 75.6117 48.281ZM79.4687 44.4233C79.4694 44.4233 79.4709 44.4231 79.4717 44.423C79.9445 44.4243 80.5721 45.2263 80.8761 46.574L78.0615 46.5717C78.3681 45.2256 78.9963 44.4258 79.4687 44.4233ZM81.646 47.2249L83.1843 47.2263C83.2809 47.5639 83.3333 47.9196 83.3332 48.2873C83.3326 48.6497 83.281 49.0002 83.1871 49.3326L81.6465 49.3315C81.6865 48.9959 81.7082 48.646 81.7083 48.2859C81.7086 47.9205 81.6869 47.5649 81.646 47.2249ZM82.9331 46.576L81.5426 46.5747C81.3873 45.8085 81.1297 45.1473 80.8048 44.6605C81.7346 45.0032 82.4969 45.6948 82.9331 46.576ZM78.1346 44.6624C77.8098 45.1484 77.5533 45.8078 77.3965 46.5715L76.0137 46.5703C76.4498 45.6942 77.2091 45.0057 78.1346 44.6624ZM76.0034 49.9771L77.3908 49.9779C77.5457 50.7487 77.8029 51.413 78.1289 51.9028C77.1988 51.557 76.4368 50.8616 76.0034 49.9771ZM80.7984 51.9101C81.1267 51.4207 81.3856 50.7542 81.5422 49.9813L82.938 49.9821C82.5016 50.8696 81.7347 51.5666 80.7984 51.9101Z' fill='%23EFEFEF'/%3E%3Cpath d='M141.25 87.5C139.455 87.5 138 88.9551 138 90.75V101.25C138 103.045 139.455 104.5 141.25 104.5H150.75C152.545 104.5 154 103.045 154 101.25V90.75C154 88.9551 152.545 87.5 150.75 87.5H141.25ZM159.123 102.643L155.5 99.0935V92.9989L159.112 89.3706C159.899 88.5804 161.248 89.1375 161.248 90.2525V101.75C161.248 102.858 159.914 103.418 159.123 102.643Z' fill='%232B88D8'/%3E%3Cpath d='M213.402 122.963H84.8701V127.473H213.402V122.963Z' fill='%232B88D8'/%3E%3Cg filter='url(%23filter1_d_725_95734)'%3E%3Cpath d='M42.7781 51.5561C49.8352 51.5561 55.5561 45.8352 55.5561 38.7781C55.5561 31.7209 49.8352 26 42.7781 26C35.7209 26 30 31.7209 30 38.7781C30 45.8352 35.7209 51.5561 42.7781 51.5561Z' fill='%23E1DFDD'/%3E%3C/g%3E%3Cg filter='url(%23filter2_d_725_95734)'%3E%3Cpath d='M241.89 174C247.702 174 252.413 169.289 252.413 163.477C252.413 157.665 247.702 152.954 241.89 152.954C236.079 152.954 231.367 157.665 231.367 163.477C231.367 169.289 236.079 174 241.89 174Z' fill='%23E1DFDD'/%3E%3C/g%3E%3Cg filter='url(%23filter3_d_725_95734)'%3E%3Cpath d='M229.188 166.559C234.169 166.559 238.208 162.52 238.208 157.539C238.208 152.557 234.169 148.519 229.188 148.519C224.206 148.519 220.168 152.557 220.168 157.539C220.168 162.52 224.206 166.559 229.188 166.559Z' fill='%23E1DFDD'/%3E%3C/g%3E%3Cdefs%3E%3Cfilter id='filter0_d_725_95734' x='36.8311' y='11.2748' width='224.611' height='159.97' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3E%3CfeFlood flood-opacity='0' result='BackgroundImageFix'/%3E%3CfeColorMatrix in='SourceAlpha' type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3E%3CfeOffset dy='4'/%3E%3CfeGaussianBlur stdDeviation='15'/%3E%3CfeComposite in2='hardAlpha' operator='out'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0'/%3E%3CfeBlend mode='normal' in2='BackgroundImageFix' result='effect1_dropShadow_725_95734'/%3E%3CfeBlend mode='normal' in='SourceGraphic' in2='effect1_dropShadow_725_95734' result='shape'/%3E%3C/filter%3E%3Cfilter id='filter1_d_725_95734' x='0' y='0' width='85.5557' height='85.5562' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3E%3CfeFlood flood-opacity='0' result='BackgroundImageFix'/%3E%3CfeColorMatrix in='SourceAlpha' type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3E%3CfeOffset dy='4'/%3E%3CfeGaussianBlur stdDeviation='15'/%3E%3CfeComposite in2='hardAlpha' operator='out'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0'/%3E%3CfeBlend mode='normal' in2='BackgroundImageFix' result='effect1_dropShadow_725_95734'/%3E%3CfeBlend mode='normal' in='SourceGraphic' in2='effect1_dropShadow_725_95734' result='shape'/%3E%3C/filter%3E%3Cfilter id='filter2_d_725_95734' x='201.367' y='126.954' width='81.0459' height='81.0463' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3E%3CfeFlood flood-opacity='0' result='BackgroundImageFix'/%3E%3CfeColorMatrix in='SourceAlpha' type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3E%3CfeOffset dy='4'/%3E%3CfeGaussianBlur stdDeviation='15'/%3E%3CfeComposite in2='hardAlpha' operator='out'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0'/%3E%3CfeBlend mode='normal' in2='BackgroundImageFix' result='effect1_dropShadow_725_95734'/%3E%3CfeBlend mode='normal' in='SourceGraphic' in2='effect1_dropShadow_725_95734' result='shape'/%3E%3C/filter%3E%3Cfilter id='filter3_d_725_95734' x='190.168' y='122.519' width='78.04' height='78.0397' filterUnits='userSpaceOnUse' color-interpolation-filters='sRGB'%3E%3CfeFlood flood-opacity='0' result='BackgroundImageFix'/%3E%3CfeColorMatrix in='SourceAlpha' type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0' result='hardAlpha'/%3E%3CfeOffset dy='4'/%3E%3CfeGaussianBlur stdDeviation='15'/%3E%3CfeComposite in2='hardAlpha' operator='out'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0'/%3E%3CfeBlend mode='normal' in2='BackgroundImageFix' result='effect1_dropShadow_725_95734'/%3E%3CfeBlend mode='normal' in='SourceGraphic' in2='effect1_dropShadow_725_95734' result='shape'/%3E%3C/filter%3E%3C/defs%3E%3C/svg%3E\";\r\n\r\n\r\nexport const AddVideoPanelContent = (props) => {\r\n const { i18n, onChange } = props;\r\n const classes = useStyles();\r\n const [videoLoaded, setVideoLoaded] = useState(false);\r\n const [processedUrl, setProcessedUrl] = useState('');\r\n const [messageBarText, setMessageBarText] = useState('');\r\n const [cachedUrl, setCachedUrl] = useState('');\r\n const [urlInputErrors, setUrlInputErrors] = useState([]);\r\n const [videoLoadStarted, setVideoLoadStarted] = useState(false);\r\n\r\n const handleInput = useCallback(() => {\r\n if (cachedUrl !== processedUrl) {\r\n setProcessedUrl(cachedUrl);\r\n setMessageBarText('');\r\n\r\n if (isEmpty(urlInputErrors)) {\r\n onChange([{ url: cachedUrl }]);\r\n setVideoLoadStarted(true);\r\n } else {\r\n setVideoLoadStarted(false);\r\n }\r\n }\r\n }, [cachedUrl, onChange, processedUrl, urlInputErrors]);\r\n\r\n const onUrlInputChange = useCallback((event, data) => {\r\n const { value } = data || {};\r\n setCachedUrl(value);\r\n\r\n const errors = [];\r\n\r\n if (!isValidUrl(value)) {\r\n errors.push(i18n.getString(_TL_('Please enter a valid URL.')));\r\n }\r\n\r\n if (_.size(value) > UrlInputMaxLen) {\r\n errors.push(i18n.getString(\r\n _TL_('The URL you entered is too long. Please enter a different URL. Max. URL length: {{max}} characters.'),\r\n { max: UrlInputMaxLen }\r\n ));\r\n }\r\n\r\n setUrlInputErrors(errors);\r\n }, [i18n]);\r\n\r\n const onKeyDown = useCallback((ev) => {\r\n if (ev.keyCode === EnterKeycode) {\r\n handleInput();\r\n }\r\n }, [handleInput]);\r\n\r\n const onBlur = useCallback(() => {\r\n handleInput();\r\n }, [handleInput]);\r\n\r\n const onErrorHandler = useCallback(() => {\r\n setMessageBarText(i18n.getString(_TL_('A preview of your video cannot be displayed. Please confirm that your video\\'s URL is supported or upload your video file directly into Asset library.')));\r\n }, [i18n]);\r\n\r\n const onLoadedMetadata = useCallback(() => {\r\n setVideoLoaded(true);\r\n }, []);\r\n\r\n return (\r\n <div className={classnames(`url-video-view ${classes.container}`)}>\r\n <div className=\"tip\">\r\n { videoLoaded\r\n ? <div> {i18n.getString(_TL_('We found this video from your URL'))} </div>\r\n : (\r\n <div>\r\n {i18n.getString(_TL_(\"Please enter your video's URL.\"))}\r\n <button className={classnames(`HelpTopic ${classes.helpLink}`)} query=\"help:app54863\">{i18n.getString(_TL_('Learn more about video source requirements.'))}</button>\r\n </div>\r\n )\r\n }\r\n </div>\r\n <Input\r\n className={classnames('add-url', classes.addUrlInput)}\r\n // styles={styles.placeholderTextFieldStyles}\r\n value={cachedUrl}\r\n onChange={onUrlInputChange}\r\n onKeyDown={onKeyDown}\r\n onBlur={onBlur}\r\n placeholder={i18n.getString(_TL_('Enter video URL'))}\r\n contentBefore={<SearchFilled />}\r\n />\r\n <div aria-live=\"polite\">\r\n {!_.isEmpty(urlInputErrors) &&\r\n <div className={classnames('error-msg', classes.errorMesBelowUrlInput)}>\r\n {urlInputErrors.map(err => <div key={err}>{err}</div>)}\r\n </div>\r\n }\r\n </div>\r\n\r\n { videoLoadStarted\r\n ? <VideoLoadPreview\r\n i18n={i18n}\r\n url={processedUrl}\r\n onLoadedMetadata={onLoadedMetadata}\r\n onErrorHandler={onErrorHandler}\r\n />\r\n : <img className={classes.placeHolderImage} src={placeholderImage} alt=\"\" />\r\n }\r\n\r\n { messageBarText &&\r\n <MessageBar intent=\"warning\" className={classes.messageContainer}>\r\n {messageBarText}\r\n </MessageBar>\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nAddVideoPanelContent.propTypes = {\r\n onChange: PropTypes.func.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n};\r\n","import React, { useCallback, useMemo, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { extend, map } from 'underscore';\r\nimport { makeStyles, Input, shorthands } from '@fluentui/react-components';\r\nimport { StockImageDataService } from '@bingads-webui-campaign/stock-image-data-service';\r\nimport { MessageBar } from '@fluentui/react-message-bar';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport { PanelImageGrid } from '../panel-image-grid';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\n\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nconst useStyles = makeStyles({\r\n contentWrapper: {\r\n paddingTop: '8px',\r\n },\r\n searchArea: {\r\n marginBottom: '16px',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n input: {\r\n width: '260px',\r\n marginRight: '8px',\r\n marginBottom: '8px',\r\n },\r\n messageBar: {\r\n marginBottom: '8px',\r\n backgroundColor: '#EFF6FC',\r\n },\r\n dropdown: {\r\n marginBottom: '8px',\r\n marginRight: '8px',\r\n minWidth: 'auto',\r\n },\r\n listbox: {\r\n minWidth: 'auto',\r\n },\r\n helpLink: {\r\n color: '#3073ad',\r\n ...shorthands.textDecoration('underline'),\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n});\r\n\r\nexport const StockImagePanelContent = (props) => {\r\n const {\r\n i18n, aid, cid, oDataConfig, setSelectedImages, overlayBodyRef,\r\n } = props;\r\n const classes = useStyles();\r\n const [isLoadingMore, setIsLoadingMore] = useState(false);\r\n const [isLoadingFirstPage, setIsLoadingFirstPage] = useState(false);\r\n const [images, setImages] = useState([]);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const selectedImages = useRef([]);\r\n const searchQuery = useRef('');\r\n const skip = useRef(0);\r\n const hasMore = useRef(true);\r\n const filterQueryJSON = useRef('{}');\r\n\r\n const onInputChange = useCallback((ev, data) => {\r\n const { value = '' } = data || {};\r\n searchQuery.current = value;\r\n }, []);\r\n const stockImageService = useMemo(() => new StockImageDataService({\r\n cid, aid, oDataConfig, controller: 'StockImages',\r\n }), [oDataConfig, aid, cid]);\r\n\r\n const getStockImages = useCallback(options => stockImageService.getStockImages(options), [stockImageService]);\r\n\r\n /* istanbul ignore next */\r\n const loadImages = useCallback(({ $search = searchQuery.current, $skip = skip.current, $query = JSON.parse(filterQueryJSON.current) || {} }) => {\r\n if ($search) {\r\n if ($skip === 0) {\r\n selectedImages.current = [];\r\n setSelectedImages(selectedImages.current);\r\n setIsLoadingFirstPage(true);\r\n } else {\r\n setIsLoadingMore(true);\r\n }\r\n\r\n getStockImages({\r\n customQueries: extend({\r\n appName: 'CampaignUI',\r\n $search,\r\n $skip,\r\n $top: PAGE_SIZE,\r\n language: 'en',\r\n includevertical: true,\r\n }, $query),\r\n }).then((data) => {\r\n hasMore.current = data['@odata.count'] > data.value.length + $skip;\r\n setTotalCount(data['@odata.count'] || 0);\r\n\r\n setImages(prevImages => [\r\n ...($skip > 0 ? prevImages : []),\r\n ...map(data.value, (item) => {\r\n const image = {\r\n url: item.Preview.Url,\r\n id: item.Id,\r\n };\r\n\r\n return image;\r\n }),\r\n ]);\r\n\r\n if ($skip === 0) {\r\n setIsLoadingFirstPage(false);\r\n } else {\r\n setIsLoadingMore(false);\r\n }\r\n });\r\n }\r\n }, [getStockImages, setSelectedImages]);\r\n\r\n /* istanbul ignore next */\r\n const loadNextPage = useCallback(() => {\r\n if (hasMore.current) {\r\n const newSkip = skip.current + PAGE_SIZE;\r\n skip.current = newSkip;\r\n loadImages({ $skip: newSkip });\r\n }\r\n }, [loadImages]);\r\n\r\n const dataService = useMemo(() => ({\r\n assets: images,\r\n totalAssetCount: totalCount,\r\n loadMoreData: loadNextPage,\r\n }), [images, loadNextPage, totalCount]);\r\n\r\n const onKeyDown = useCallback((ev) => {\r\n if (ev.key === 'Enter') {\r\n skip.current = 0;\r\n loadImages({\r\n $skip: 0,\r\n });\r\n }\r\n }, [loadImages]);\r\n\r\n /* istanbul ignore next */\r\n const onSelectImage = useCallback((imageId) => {\r\n const originSelectedLength = selectedImages.current.length;\r\n const newSelectedList = selectedImages.current.filter(({ id }) => id !== imageId);\r\n if (newSelectedList.length === originSelectedLength) {\r\n const selectedItem = images.find(({ id }) => id === imageId);\r\n selectedImages.current.push(selectedItem);\r\n } else {\r\n selectedImages.current = newSelectedList;\r\n }\r\n setSelectedImages([...selectedImages.current]);\r\n }, [images, setSelectedImages]);\r\n\r\n return (\r\n <div className={classNames('stock-content-container', classes.contentWrapper)}>\r\n <div className={classes.searchArea}>\r\n <Input\r\n className={classNames('stock-search-input', classes.input)}\r\n onChange={onInputChange}\r\n placeholder={i18n.getString(_TL_('Search for assets'))}\r\n contentBefore={<SearchFilled />}\r\n onKeyDown={onKeyDown}\r\n />\r\n </div>\r\n <MessageBar className={classNames('stock-watermark-bar', classes.messageBar)}>\r\n {i18n.getString(_TL_('The Shutterstock watermark appearing on the stock images below will not appear in your ad.'))}\r\n </MessageBar>\r\n <MessageBar className={classNames('stock-ms-bar', classes.messageBar)}>\r\n <span>\r\n {i18n.getString(_TL_('There may be images provided by Shutterstock that do not adhere to the Microsoft Advertising image policies.'))}\r\n <button className={classNames(`HelpTopic ${classes.helpLink}`)} query=\"help:app54718\">{i18n.getString(_TL_('Learn more'))}</button>\r\n </span>\r\n </MessageBar>\r\n { isLoadingFirstPage && !images.length && <AdsStudioSpinner useCustomSize customStyle={{ marginTop: '50px' }} /> }\r\n {!!images.length && (\r\n <PanelImageGrid\r\n i18n={i18n}\r\n isLoadingMore={isLoadingMore}\r\n onSelectImage={onSelectImage}\r\n dataService={dataService}\r\n overlayBodyRef={overlayBodyRef}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nStockImagePanelContent.prototype = {\r\n aid: PropTypes.number.isRequired,\r\n cid: PropTypes.number.isRequired,\r\n oDataConfig: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setSelectedImages: PropTypes.func.isRequired,\r\n};\r\n\r\n","import React, { useCallback, useMemo, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { extend, map } from 'underscore';\r\nimport { makeStyles, Input, shorthands } from '@fluentui/react-components';\r\nimport { InvestImageDataService } from '@bingads-webui-campaign/invest-image-data-service';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport { PanelImageGrid } from '../panel-image-grid';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\n\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nconst useStyles = makeStyles({\r\n contentWrapper: {\r\n paddingTop: '8px',\r\n },\r\n searchArea: {\r\n marginBottom: '16px',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n input: {\r\n width: '260px',\r\n marginRight: '8px',\r\n marginBottom: '8px',\r\n },\r\n messageBar: {\r\n marginBottom: '8px',\r\n backgroundColor: '#EFF6FC',\r\n },\r\n dropdown: {\r\n marginBottom: '8px',\r\n marginRight: '8px',\r\n minWidth: 'auto',\r\n },\r\n listbox: {\r\n minWidth: 'auto',\r\n },\r\n helpLink: {\r\n color: '#3073ad',\r\n ...shorthands.textDecoration('underline'),\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n});\r\n\r\nconst ASSET_TYPE_IMAGES = 1;\r\n\r\nexport const InvestImagePanelContent = (props) => {\r\n const {\r\n i18n, aid, cid, setSelectedImages, overlayBodyRef,\r\n } = props;\r\n const classes = useStyles();\r\n const [isLoadingMore, setIsLoadingMore] = useState(false);\r\n const [isLoadingFirstPage, setIsLoadingFirstPage] = useState(false);\r\n const [images, setImages] = useState([]);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const selectedImages = useRef([]);\r\n const searchQuery = useRef('');\r\n const skip = useRef(0);\r\n const hasMore = useRef(true);\r\n\r\n const onInputChange = useCallback((ev, data) => {\r\n const { value = '' } = data || {};\r\n searchQuery.current = value;\r\n }, []);\r\n const investImageService = useMemo(() => new InvestImageDataService({ cid, aid }), [aid, cid]);\r\n\r\n const getInvestImages = useCallback(options => investImageService.getInvestAssets(options), [investImageService]);\r\n\r\n /* istanbul ignore next */\r\n const loadImages = useCallback(({ creativeId = searchQuery.current, $skip = skip.current, $query = {} }) => {\r\n if (creativeId) {\r\n if ($skip === 0) {\r\n selectedImages.current = [];\r\n setSelectedImages(selectedImages.current);\r\n setIsLoadingFirstPage(true);\r\n } else {\r\n setIsLoadingMore(true);\r\n }\r\n\r\n const queryParams = {\r\n appName: 'CampaignUI',\r\n assetTypeId: ASSET_TYPE_IMAGES,\r\n $skip,\r\n $top: PAGE_SIZE,\r\n };\r\n if (creativeId) {\r\n queryParams.creativeId = creativeId;\r\n }\r\n getInvestImages({\r\n customQueries: extend(queryParams, $query),\r\n }).then((data) => {\r\n hasMore.current = data['@odata.count'] > data.value.length + $skip;\r\n setTotalCount(data['@odata.count'] || 0);\r\n\r\n setImages(prevImages => [\r\n ...($skip > 0 ? prevImages : []),\r\n ...map(data.value, (item) => {\r\n const image = {\r\n url: item.Url,\r\n id: item.XandrAssetId,\r\n };\r\n\r\n return image;\r\n }),\r\n ]);\r\n\r\n if ($skip === 0) {\r\n setIsLoadingFirstPage(false);\r\n } else {\r\n setIsLoadingMore(false);\r\n }\r\n });\r\n }\r\n }, [getInvestImages, setSelectedImages]);\r\n\r\n /* istanbul ignore next */\r\n const loadNextPage = useCallback(() => {\r\n if (hasMore.current) {\r\n const newSkip = skip.current + PAGE_SIZE;\r\n skip.current = newSkip;\r\n loadImages({ $skip: newSkip });\r\n }\r\n }, [loadImages]);\r\n\r\n const dataService = useMemo(() => ({\r\n assets: images,\r\n totalAssetCount: totalCount,\r\n loadMoreData: loadNextPage,\r\n }), [images, loadNextPage, totalCount]);\r\n\r\n const onKeyDown = useCallback((ev) => {\r\n if (ev.key === 'Enter') {\r\n skip.current = 0;\r\n loadImages({\r\n $skip: 0,\r\n });\r\n }\r\n }, [loadImages]);\r\n\r\n /* istanbul ignore next */\r\n const onSelectImage = useCallback((imageId) => {\r\n const originSelectedLength = selectedImages.current.length;\r\n const newSelectedList = selectedImages.current.filter(({ id }) => id !== imageId);\r\n if (newSelectedList.length === originSelectedLength) {\r\n const selectedItem = images.find(({ id }) => id === imageId);\r\n selectedImages.current.push(selectedItem);\r\n } else {\r\n selectedImages.current = newSelectedList;\r\n }\r\n setSelectedImages([...selectedImages.current]);\r\n }, [images, setSelectedImages]);\r\n\r\n return (\r\n <div className={classNames('invest-content-container', classes.contentWrapper)}>\r\n <div className={classes.searchArea}>\r\n <Input\r\n className={classNames('invest-search-input', classes.input)}\r\n onChange={onInputChange}\r\n placeholder={i18n.getString(_TL_('Search by Invest creative Id'))}\r\n contentBefore={<SearchFilled />}\r\n onKeyDown={onKeyDown}\r\n />\r\n </div>\r\n { isLoadingFirstPage && !images.length && <AdsStudioSpinner useCustomSize customStyle={{ marginTop: '50px' }} /> }\r\n {!!images.length && (\r\n <PanelImageGrid\r\n i18n={i18n}\r\n isLoadingMore={isLoadingMore}\r\n onSelectImage={onSelectImage}\r\n dataService={dataService}\r\n overlayBodyRef={overlayBodyRef}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nInvestImagePanelContent.prototype = {\r\n aid: PropTypes.number.isRequired,\r\n cid: PropTypes.number.isRequired,\r\n oDataConfig: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setSelectedImages: PropTypes.func.isRequired,\r\n};\r\n\r\n","/* eslint-disable jsx-a11y/media-has-caption */\r\nimport React, { useCallback, useMemo, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { extend, map } from 'underscore';\r\nimport { makeStyles, Input, shorthands } from '@fluentui/react-components';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport { InvestImageDataService } from '@bingads-webui-campaign/invest-image-data-service';\r\nimport { GridSectionName } from '../../model/constants';\r\nimport { SectionTilesGrid, TilesGridLoadingCell } from '../ads-studio-tile-grid';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nconst useStyles = makeStyles({\r\n contentWrapper: {\r\n paddingTop: '8px',\r\n },\r\n searchArea: {\r\n marginBottom: '16px',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n input: {\r\n width: '260px',\r\n marginRight: '8px',\r\n marginBottom: '8px',\r\n },\r\n listbox: {\r\n minWidth: 'auto',\r\n },\r\n helpLink: {\r\n color: '#3073ad',\r\n ...shorthands.textDecoration('underline'),\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n videoNameWrapper: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n width: '100%',\r\n marginTop: 5,\r\n marginBottom: 5,\r\n },\r\n videoName: {\r\n position: 'relative',\r\n left: 0,\r\n bottom: 0,\r\n width: 'auto',\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n },\r\n});\r\n\r\nconst emptyButtonStyle = {\r\n padding: '2px',\r\n margin: '0px',\r\n background: 'none',\r\n color: 'unset',\r\n cursor: 'pointer',\r\n borderImage: 'unset',\r\n borderColor: 'unset',\r\n borderStyle: 'none',\r\n};\r\n\r\nconst ASSET_TYPE_VIDEOS = 2;\r\n\r\nexport const InvestVideoPanelContent = (props) => {\r\n const {\r\n i18n, aid, cid, setSelectedVideos,\r\n } = props;\r\n const classes = useStyles();\r\n const [isLoadingMore, setIsLoadingMore] = useState(false);\r\n const [isLoadingFirstPage, setIsLoadingFirstPage] = useState(false);\r\n const [videos, setVideos] = useState([]);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const selectedVideos = useRef([]);\r\n const searchQuery = useRef('');\r\n const skip = useRef(0);\r\n const hasMore = useRef(true);\r\n\r\n const onInputChange = useCallback((ev, data) => {\r\n const { value = '' } = data || {};\r\n searchQuery.current = value;\r\n }, []);\r\n const investImageService = useMemo(() => new InvestImageDataService({ cid, aid }), [aid, cid]);\r\n\r\n const getInvestVideos = useCallback(options => investImageService.getInvestAssets(options), [investImageService]);\r\n\r\n /* istanbul ignore next */\r\n const loadVideos = useCallback(({ creativeId = searchQuery.current, $skip = skip.current, $query = {} }) => {\r\n if (creativeId) {\r\n if ($skip === 0) {\r\n selectedVideos.current = [];\r\n setSelectedVideos(selectedVideos.current);\r\n setIsLoadingFirstPage(true);\r\n } else {\r\n setIsLoadingMore(true);\r\n }\r\n\r\n const queryParams = {\r\n appName: 'CampaignUI',\r\n assetTypeId: ASSET_TYPE_VIDEOS,\r\n $skip,\r\n $top: PAGE_SIZE,\r\n };\r\n if (creativeId) {\r\n queryParams.creativeId = creativeId;\r\n }\r\n getInvestVideos({\r\n customQueries: extend(queryParams, $query),\r\n }).then((data) => {\r\n hasMore.current = data['@odata.count'] > data.value.length + $skip;\r\n setTotalCount(data['@odata.count'] || 0);\r\n setVideos(prevVideos => [\r\n ...($skip > 0 ? prevVideos : []),\r\n ...map(data.value, (item) => {\r\n const video = {\r\n url: item.Url,\r\n id: item.XandrAssetId,\r\n name: item.Description,\r\n description: item.Description,\r\n };\r\n return video;\r\n }),\r\n ]);\r\n\r\n if ($skip === 0) {\r\n setIsLoadingFirstPage(false);\r\n } else {\r\n setIsLoadingMore(false);\r\n }\r\n });\r\n }\r\n }, [getInvestVideos, setSelectedVideos]);\r\n\r\n /* istanbul ignore next */\r\n const loadNextPage = useCallback(() => {\r\n if (hasMore.current) {\r\n const newSkip = skip.current + PAGE_SIZE;\r\n skip.current = newSkip;\r\n loadVideos({ $skip: newSkip });\r\n }\r\n }, [loadVideos]);\r\n\r\n const onKeyDown = useCallback((ev) => {\r\n if (ev.key === 'Enter') {\r\n skip.current = 0;\r\n loadVideos({\r\n $skip: 0,\r\n });\r\n }\r\n }, [loadVideos]);\r\n\r\n /* istanbul ignore next */\r\n const onSelectVideo = useCallback((videoId) => {\r\n const originSelectedLength = selectedVideos.current.length;\r\n const newSelectedList = selectedVideos.current.filter(({ id }) => id !== videoId);\r\n if (newSelectedList.length === originSelectedLength) {\r\n const selectedItem = videos.find(({ id }) => id === videoId);\r\n selectedVideos.current.push(selectedItem);\r\n } else {\r\n selectedVideos.current = newSelectedList;\r\n }\r\n setSelectedVideos([...selectedVideos.current]);\r\n }, [videos, setSelectedVideos]);\r\n\r\n const videosGridSection = useMemo(() => ({\r\n sectionName: GridSectionName.Asset,\r\n sectionClassName: 'ads-studio-invest-video-section',\r\n itemKey: 'id',\r\n items: videos,\r\n totalItemCount: totalCount,\r\n config: {\r\n scrollContainer: '[role=\"main\"]',\r\n minItemHeight: 42,\r\n },\r\n }), [videos, totalCount]);\r\n\r\n const sectionGridData = useMemo(\r\n () => ([videosGridSection]),\r\n [videosGridSection]\r\n );\r\n\r\n const onRenderLoadingCell = useCallback(({ items, totalItemCount }) => {\r\n if ((items.length < totalItemCount) && (items.length > 0)) {\r\n return (\r\n <TilesGridLoadingCell onLoading={loadNextPage} key={items.length} >\r\n {isLoadingMore && (\r\n <div className=\"section-loading\">\r\n <AdsStudioSpinner useCustomSize />\r\n </div>\r\n )}\r\n </TilesGridLoadingCell>\r\n );\r\n }\r\n return null;\r\n }, [isLoadingMore, loadNextPage]);\r\n\r\n const onRenderCell = useCallback(({ item }) => {\r\n const { id, name } = item;\r\n\r\n return (\r\n <div>\r\n <button\r\n onClick={() => onSelectVideo(id)}\r\n id={item.id}\r\n style={emptyButtonStyle}\r\n >\r\n <video autoPlay={false} loop style={{ width: '100%', height: '100%' }}>\r\n <source src={item.url} />\r\n </video>\r\n </button>\r\n <div className={classes.videoNameWrapper}>\r\n <span className={classes.videoName} title={name}>\r\n {name}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n }, [classes.videoName, classes.videoNameWrapper, onSelectVideo]);\r\n\r\n return (\r\n <div className={classNames('invest-video-content-container', classes.contentWrapper)}>\r\n <div className={classes.searchArea}>\r\n <Input\r\n className={classNames('invest-video-search-input', classes.input)}\r\n onChange={onInputChange}\r\n placeholder={i18n.getString(_TL_('Search by Invest Creative ID'))}\r\n contentBefore={<SearchFilled />}\r\n onKeyDown={onKeyDown}\r\n />\r\n </div>\r\n { isLoadingFirstPage && !videos.length && <AdsStudioSpinner useCustomSize customStyle={{ marginTop: '50px' }} /> }\r\n {!!videos.length && (\r\n <SectionTilesGrid\r\n sectionData={sectionGridData}\r\n onRenderCell={onRenderCell}\r\n onRenderLoadingCell={onRenderLoadingCell}\r\n loadNextPage={loadNextPage}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nInvestVideoPanelContent.prototype = {\r\n aid: PropTypes.number.isRequired,\r\n cid: PropTypes.number.isRequired,\r\n oDataConfig: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setSelectedVideos: PropTypes.func.isRequired,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func,\r\n }).isRequired,\r\n};\r\n","import React, { useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport {\r\n Input,\r\n makeStyles,\r\n Select,\r\n shorthands,\r\n useId,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\n\r\nconst urlPrefixOptions = [\r\n { key: 'https://', text: 'https://' },\r\n { key: 'http://', text: 'http://' },\r\n];\r\n\r\nconst useStyles = makeStyles({\r\n domainInputWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n columnGap: '8px',\r\n },\r\n prefixSelect: {\r\n width: '101px',\r\n minWidth: 'auto',\r\n },\r\n domainInput: {\r\n ...shorthands.flex(1),\r\n },\r\n suggestionErrorInvalid: {\r\n marginTop: '16px',\r\n color: 'red',\r\n },\r\n});\r\n\r\nexport const DomainInputView = (props) => {\r\n const {\r\n i18n,\r\n errorMessage,\r\n onDomainChange,\r\n isDomainInvalid,\r\n errorMessageClassName,\r\n domainInputWrapperClassName,\r\n } = props;\r\n const [urlPrefix, setUrlPrefix] = useState('https://');\r\n const classes = useStyles();\r\n const selectId = useId();\r\n\r\n const onSelectChange = useCallback((evt, data) => {\r\n const { value } = data;\r\n setUrlPrefix(value);\r\n }, []);\r\n\r\n const onBlurUrl = useCallback(\r\n (ev) => {\r\n const newUrl = ev && ev.target && ev.target.value;\r\n const prefix = urlPrefixOptions.find(({ key }) => key === urlPrefix).text;\r\n const newDomain = `${prefix}${newUrl}`;\r\n onDomainChange(newDomain);\r\n },\r\n [onDomainChange, urlPrefix]\r\n );\r\n\r\n const onKeyDown = useCallback(\r\n (ev) => {\r\n if (ev.key === 'Enter') {\r\n onBlurUrl(ev);\r\n }\r\n },\r\n [onBlurUrl]\r\n );\r\n return (\r\n <>\r\n <div\r\n className={mergeClasses(\r\n classes.domainInputWrapper,\r\n domainInputWrapperClassName\r\n )}\r\n >\r\n <Select\r\n id={selectId}\r\n aria-label={i18n.getString(_TL_('domain'))}\r\n className={mergeClasses('prefix-select', classes.prefixSelect)}\r\n onChange={onSelectChange}\r\n >\r\n {urlPrefixOptions.map(option => (\r\n <option key={option.key}>{option.text}</option>\r\n ))}\r\n </Select>\r\n <Input\r\n className={mergeClasses('domain-input', classes.domainInput)}\r\n placeholder={i18n.getString(_TL_('Enter your website URL'))}\r\n contentBefore={<SearchFilled />}\r\n onBlur={onBlurUrl}\r\n onKeyDown={onKeyDown}\r\n />\r\n </div>\r\n <div aria-live=\"polite\">\r\n {isDomainInvalid && (\r\n <div\r\n className={mergeClasses(\r\n 'invalid-error',\r\n classes.suggestionErrorInvalid,\r\n errorMessageClassName\r\n )}\r\n >\r\n {errorMessage ||\r\n i18n.getString(_TL_('Please enter a valid Final URL to see images from your website.'))}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nDomainInputView.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n isDomainInvalid: PropTypes.bool.isRequired,\r\n onDomainChange: PropTypes.func.isRequired,\r\n errorMessage: PropTypes.string,\r\n errorMessageClassName: PropTypes.string,\r\n domainInputWrapperClassName: PropTypes.string,\r\n};\r\n\r\nDomainInputView.defaultProps = {\r\n errorMessage: '',\r\n errorMessageClassName: '',\r\n domainInputWrapperClassName: '',\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { Input, makeStyles } from '@fluentui/react-components';\r\nimport { SearchFilled } from '@fluentui/react-icons';\r\nimport { getUrlProtocolAndDomain, hasProtocol } from '@bingads-webui/url-util';\r\n\r\nconst useStyles = makeStyles({\r\n subdomainWrapper: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n },\r\n input: {\r\n width: '260px',\r\n },\r\n divider: {\r\n marginLeft: '10px',\r\n marginRight: '10px',\r\n fontSize: '14px',\r\n },\r\n});\r\n\r\nexport const SubdomainInputView = (props) => {\r\n const {\r\n i18n, isLoading, defaultDomainUrl, onDomainUrlChange, onSubdomainUrlChange,\r\n } = props;\r\n const classes = useStyles();\r\n\r\n const onDomainBlur = useCallback((ev) => {\r\n const temporaryFinalUrl = ev && ev.target && ev.target.value;\r\n let newDomainUrl = getUrlProtocolAndDomain(temporaryFinalUrl);\r\n\r\n if (!hasProtocol(newDomainUrl)) {\r\n newDomainUrl = `https://${newDomainUrl}`;\r\n }\r\n onDomainUrlChange(newDomainUrl);\r\n }, [onDomainUrlChange]);\r\n\r\n const onDomainKeyDown = useCallback((ev) => {\r\n if (ev.key === 'Enter') {\r\n onDomainBlur(ev);\r\n }\r\n }, [onDomainBlur]);\r\n\r\n const onSubdomainBlur = useCallback((ev) => {\r\n const newSubdomainUrl = ev && ev.target && ev.target.value;\r\n onSubdomainUrlChange(newSubdomainUrl);\r\n }, [onSubdomainUrlChange]);\r\n\r\n const onSubdomainKeyDown = useCallback((ev) => {\r\n if (ev.key === 'Enter') {\r\n onSubdomainBlur(ev);\r\n }\r\n }, [onSubdomainBlur]);\r\n\r\n return (\r\n <div className={classes.subdomainWrapper}>\r\n <Input className={classNames('url-input', classes.input)} defaultValue={defaultDomainUrl} placeholder={i18n.getString(_TL_('Enter your website URL'))} contentBefore={<SearchFilled />} disabled={isLoading} onBlur={onDomainBlur} onKeyDown={onDomainKeyDown} />\r\n <div className={classes.divider}>\r\n /\r\n </div>\r\n <Input className={classNames('subdomain-input', classes.input)} placeholder={i18n.getString(_TL_('Enter your subdomain'))} disabled={isLoading} onBlur={onSubdomainBlur} onKeyDown={onSubdomainKeyDown} />\r\n </div>\r\n );\r\n};\r\n\r\nSubdomainInputView.propTypes = {\r\n i18n: PropTypes.shape({}).isRequired,\r\n isLoading: PropTypes.bool.isRequired,\r\n defaultDomainUrl: PropTypes.string.isRequired,\r\n onDomainUrlChange: PropTypes.func.isRequired,\r\n onSubdomainUrlChange: PropTypes.func.isRequired,\r\n};\r\n\r\n","import React, { useState, useCallback, useMemo, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport { makeStyles } from '@fluentui/react-components';\r\nimport { getUrlProtocolAndDomain, isValidUrl } from '@bingads-webui/url-util';\r\nimport { DomainInputView } from './domain-input-view';\r\nimport { SubdomainInputView } from './subdomain-input-view';\r\nimport { useWebsiteImages } from './useWebsiteImages';\r\nimport { PanelImageGrid } from '../panel-image-grid';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\n\r\nconst subdomainUrlRegex = /^https?:\\/\\/([a-z0-9-_]+\\.)*[a-z0-9-_]+\\.[a-z]{2,63}(?=$|\\/)\\//i;\r\n\r\nconst useStyles = makeStyles({\r\n contentWrapper: {\r\n paddingTop: '8px',\r\n },\r\n});\r\n\r\nconst getSubdomain = (url) => {\r\n const regexResult = url.trim().split(subdomainUrlRegex);\r\n if (regexResult && regexResult.length > 1) {\r\n return regexResult[2];\r\n }\r\n return url;\r\n};\r\n\r\nexport const WebsiteImagePanelContent = (props) => {\r\n const {\r\n aid, cid, oDataConfig, i18n, setSelectedImages, overlayBodyRef,\r\n } = props;\r\n const [domainUrl, setDomailUrl] = useState('');\r\n const [subdomain, setSubdomain] = useState('');\r\n const [isDomainInvalid, setIsdomainInvalid] = useState(false);\r\n const classes = useStyles();\r\n\r\n const {\r\n setPageNumber,\r\n loadNextPage,\r\n loadImages,\r\n images,\r\n totalCount,\r\n isLoadingFistPage,\r\n isLoading,\r\n setImages,\r\n onSelectImage,\r\n } = useWebsiteImages({\r\n aid, cid, oDataConfig, setSelectedImages,\r\n });\r\n\r\n const finalUrl = useMemo(() => `${domainUrl}/${subdomain}`, [domainUrl, subdomain]);\r\n const showDomain = useMemo(() => !finalUrl || !isValidUrl(finalUrl), [finalUrl]);\r\n\r\n const finalUrlDomain = useMemo(() => {\r\n if (finalUrl) {\r\n return getUrlProtocolAndDomain(finalUrl);\r\n }\r\n return '';\r\n }, [finalUrl]);\r\n\r\n const onDomainChange = useCallback((newDomainUrl) => {\r\n setDomailUrl(newDomainUrl);\r\n if (isValidUrl(newDomainUrl)) {\r\n setIsdomainInvalid(false);\r\n setPageNumber(1);\r\n setImages([]);\r\n loadImages({ url: `${newDomainUrl}/${subdomain}`, sDomain: subdomain });\r\n } else {\r\n setIsdomainInvalid(true);\r\n }\r\n }, [loadImages, setImages, setPageNumber, subdomain]);\r\n\r\n const onSubdomainChange = useCallback((newSubdomainUrl) => {\r\n if (!_.isNull(newSubdomainUrl) && !_.isUndefined(newSubdomainUrl)) {\r\n const newValue = getSubdomain(newSubdomainUrl);\r\n const newSearchUrl = `${finalUrlDomain}/${newValue}`;\r\n if (newSearchUrl !== finalUrl) {\r\n setSubdomain(newValue);\r\n setPageNumber(1);\r\n setImages([]);\r\n loadImages({ url: newSearchUrl, sDomain: newValue });\r\n }\r\n }\r\n }, [finalUrl, finalUrlDomain, loadImages, setImages, setPageNumber]);\r\n\r\n const loadMoreData = useCallback(() => {\r\n loadNextPage({ url: finalUrl, sDomain: subdomain });\r\n }, [finalUrl, loadNextPage, subdomain]);\r\n\r\n useEffect(() => {\r\n if (showDomain) {\r\n setDomailUrl('');\r\n setSubdomain('');\r\n }\r\n }, [showDomain]);\r\n\r\n return (\r\n <div className={classNames('website-content-container', classes.contentWrapper)}>\r\n {\r\n showDomain ?\r\n <DomainInputView isDomainInvalid={isDomainInvalid} i18n={i18n} onDomainChange={onDomainChange} /> :\r\n <SubdomainInputView defaultDomainUrl={domainUrl} i18n={i18n} isLoading={isLoading} onDomainUrlChange={onDomainChange} onSubdomainUrlChange={onSubdomainChange} />\r\n }\r\n {\r\n !showDomain && !isLoading && images.length === 0 &&\r\n <div className=\"alert alert-info\" style={{ marginTop: '20px' }}>\r\n <div className=\"alert-image\" />\r\n <div className=\"alert-info-inline\">\r\n {i18n.getString(_TL_('No suggestion found from your site.'))}\r\n </div>\r\n </div>\r\n }\r\n {\r\n !showDomain && (\r\n <>\r\n { isLoadingFistPage && !images.length && <AdsStudioSpinner useCustomSize customStyle={{ marginTop: '50px' }} /> }\r\n {!!images.length && (\r\n <PanelImageGrid\r\n i18n={i18n}\r\n onSelectImage={onSelectImage}\r\n overlayBodyRef={overlayBodyRef}\r\n isLoadingMore={isLoading}\r\n dataService={{\r\n assets: images,\r\n totalAssetCount: totalCount,\r\n loadMoreData,\r\n }}\r\n />\r\n )}\r\n </>\r\n )\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nWebsiteImagePanelContent.prototype = {\r\n aid: PropTypes.number.isRequired,\r\n cid: PropTypes.number.isRequired,\r\n oDataConfig: PropTypes.shape({}).isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n setSelectedImages: PropTypes.func.isRequired,\r\n};\r\n","import { useMemo, useCallback, useState, useRef } from 'react';\r\nimport _ from 'underscore';\r\nimport { SuggestionPoller } from '@bingads-webui-campaign/media-repository';\r\nimport { MIN_SIZE } from '../../../src/model/constants';\r\n\r\nexport const useWebsiteImages = ({\r\n cid, aid, oDataConfig, setSelectedImages,\r\n}) => {\r\n const [images, setImages] = useState([]);\r\n const [totalCount, setTotalCount] = useState(0);\r\n const [isLoadingFistPage, setIsLoadingFirstPage] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const pageNumber = useRef(0);\r\n const selectedImages = useRef([]);\r\n\r\n const suggestionPoller = useMemo(() => new SuggestionPoller({\r\n cid,\r\n aid,\r\n oDataConfig,\r\n logger: {\r\n trace: _.noop,\r\n startSignal: _.noop,\r\n stopSignal: _.noop,\r\n },\r\n jobCompleteCallback: _.noop,\r\n }), [cid, aid, oDataConfig]);\r\n\r\n const setPageNumber = useCallback((newPageNumber) => {\r\n pageNumber.current = newPageNumber;\r\n }, []);\r\n\r\n const getLandingPageSuggestions = useCallback(({\r\n landingPageUrl,\r\n isSubdomain,\r\n pageNum,\r\n }) => {\r\n const minimumResolution = {\r\n width: MIN_SIZE[0],\r\n height: MIN_SIZE[1],\r\n };\r\n if (pageNum === 1) {\r\n // eslint-disable-next-line no-restricted-globals\r\n return new Promise((resolve) => {\r\n suggestionPoller.setJobCompleteCallback(resolve);\r\n suggestionPoller.getLandingPageSuggestions({\r\n landingPageUrl,\r\n forceInternalScrapingService: isSubdomain,\r\n minimumResolution,\r\n pageNumber: pageNum,\r\n });\r\n });\r\n }\r\n return suggestionPoller.getMoreLandingPageSuggestions({\r\n landingPageUrl,\r\n pageNumber: pageNum,\r\n forceInternalScrapingService: isSubdomain,\r\n minimumResolution,\r\n });\r\n }, [suggestionPoller]);\r\n /* istanbul ignore next */\r\n const loadImages =\r\n useCallback(({ url = '', sDomain = '' }) => {\r\n if (url) {\r\n if (pageNumber.current === 1) {\r\n selectedImages.current = [];\r\n setSelectedImages(selectedImages.current);\r\n setIsLoadingFirstPage(true);\r\n }\r\n setIsLoading(true);\r\n getLandingPageSuggestions({\r\n landingPageUrl: url,\r\n isSubdomain: !!sDomain,\r\n pageNum: pageNumber.current,\r\n }).then((data) => {\r\n const { TotalCount } = data.ImagePaging;\r\n setTotalCount(TotalCount);\r\n setImages(prevImages => [\r\n ...(pageNumber.current > 1 ? prevImages : []),\r\n ..._.map(data.Images, (item) => {\r\n const image = {\r\n url: item.ThumbnailUrl || item.ImageUrl,\r\n id: item.ImageUrl,\r\n };\r\n\r\n return image;\r\n }),\r\n ]);\r\n\r\n if (pageNumber.current === 1) {\r\n setIsLoadingFirstPage(false);\r\n }\r\n\r\n setIsLoading(false);\r\n }).catch(() => {\r\n if (pageNumber.current === 1) {\r\n setIsLoadingFirstPage(false);\r\n }\r\n\r\n setIsLoading(false);\r\n });\r\n }\r\n }, [getLandingPageSuggestions, setSelectedImages]);\r\n /* istanbul ignore else */\r\n const loadNextPage = useCallback((props) => {\r\n pageNumber.current += 1;\r\n loadImages(props);\r\n }, [loadImages]);\r\n\r\n const onSelectImage = useCallback((imageId) => {\r\n const originSelectedLength = selectedImages.current.length;\r\n const newSelectedList = selectedImages.current.filter(({ id }) => id !== imageId);\r\n /* istanbul ignore else */\r\n if (newSelectedList.length === originSelectedLength) {\r\n const selectedItem = images.find(({ id }) => id === imageId);\r\n selectedImages.current.push(selectedItem);\r\n } else {\r\n selectedImages.current = newSelectedList;\r\n }\r\n setSelectedImages([...selectedImages.current]);\r\n }, [images, setSelectedImages]);\r\n\r\n return {\r\n images,\r\n totalCount,\r\n isLoadingFistPage,\r\n isLoading,\r\n setImages,\r\n loadNextPage,\r\n loadImages,\r\n setPageNumber,\r\n onSelectImage,\r\n };\r\n};\r\n","import React, { useCallback, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n Tooltip,\r\n Menu,\r\n MenuTrigger,\r\n useOverflowMenu,\r\n MenuPopover,\r\n MenuList,\r\n MenuItem,\r\n Button,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Breadcrumb,\r\n BreadcrumbItem,\r\n BreadcrumbButton,\r\n BreadcrumbDivider,\r\n partitionBreadcrumbItems,\r\n truncateBreadcrumbLongName,\r\n isTruncatableBreadcrumbContent,\r\n} from '@fluentui/react-breadcrumb';\r\nimport { MoreHorizontalRegular } from '@fluentui/react-icons';\r\n\r\nconst DefaultMaxDisplayedItems = 5;\r\nconst DefaultMaxLengthOfItem = 30;\r\n\r\nconst OverflowItemsMenu = ({\r\n overflowItems,\r\n onItemClick,\r\n}) => {\r\n const { ref, isOverflowing, overflowCount } = useOverflowMenu();\r\n // const tooltipStyles = useTooltipStyles();\r\n\r\n const overflowItemsCount = useMemo(() =>\r\n (overflowItems ? overflowItems.length + overflowCount : overflowCount\r\n ), [overflowItems, overflowCount]);\r\n\r\n if (!isOverflowing && overflowItems && overflowItems.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Menu>\r\n <MenuTrigger disableButtonEnhancement>\r\n <Button\r\n id=\"menu\"\r\n appearance=\"subtle\"\r\n ref={ref}\r\n icon={<MoreHorizontalRegular />}\r\n aria-label={`${overflowItemsCount} more items`}\r\n role=\"button\"\r\n />\r\n </MenuTrigger>\r\n <MenuPopover>\r\n <MenuList>\r\n {\r\n overflowItems && overflowItems.map(item => (\r\n <MenuItem key={item.key} onClick={() => onItemClick(item)}>{item.text}</MenuItem>\r\n ))\r\n }\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\nexport const AdsStudioBreadcrumb = ({\r\n items,\r\n onItemClick,\r\n maxDisplayedItems,\r\n maxLengthOfItem,\r\n customItemStyle,\r\n}) => {\r\n const {\r\n startDisplayedItems,\r\n overflowItems,\r\n endDisplayedItems,\r\n } = partitionBreadcrumbItems({\r\n items,\r\n maxDisplayedItems,\r\n });\r\n\r\n const lastIndex = useMemo(() => items.length - 1, [items]);\r\n\r\n const renderItem = useCallback((entry, isLastItem, onClick) => (\r\n <React.Fragment key={`item-${entry.key}`}>\r\n {isTruncatableBreadcrumbContent(entry.text, maxLengthOfItem) ? (\r\n <BreadcrumbItem>\r\n <Tooltip withArrow content={entry.text} relationship=\"label\">\r\n <BreadcrumbButton\r\n current={isLastItem}\r\n onClick={() => onClick(entry)}\r\n className={mergeClasses(customItemStyle.breadcrumbButton, isLastItem && customItemStyle.breadcrumbButtonCurrent)}\r\n >\r\n {truncateBreadcrumbLongName(entry.text, maxLengthOfItem)}\r\n </BreadcrumbButton>\r\n </Tooltip>\r\n </BreadcrumbItem>\r\n ) : (\r\n <BreadcrumbItem>\r\n <BreadcrumbButton\r\n current={isLastItem}\r\n onClick={() => onClick(entry)}\r\n className={mergeClasses(customItemStyle.breadcrumbButton, isLastItem && customItemStyle.breadcrumbButtonCurrent)}\r\n >{entry.text}\r\n </BreadcrumbButton>\r\n </BreadcrumbItem>\r\n )}\r\n\r\n {!isLastItem && <BreadcrumbDivider />}\r\n </React.Fragment>\r\n ), [customItemStyle, maxLengthOfItem]);\r\n\r\n return (\r\n <Breadcrumb>\r\n {\r\n startDisplayedItems && startDisplayedItems.map((item, index) => renderItem(item, index === lastIndex, onItemClick))\r\n }\r\n {\r\n overflowItems &&\r\n <OverflowItemsMenu\r\n overflowItems={overflowItems}\r\n onItemClick={onItemClick}\r\n />\r\n }\r\n {\r\n endDisplayedItems && endDisplayedItems.map((item, index) => {\r\n const isLastItem = index + (items.length - endDisplayedItems.length) === lastIndex;\r\n return renderItem(item, isLastItem, onItemClick);\r\n })\r\n }\r\n </Breadcrumb>\r\n );\r\n};\r\n\r\nAdsStudioBreadcrumb.propTypes = {\r\n items: PropTypes.arrayOf(PropTypes.shape({\r\n key: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\r\n text: PropTypes.string,\r\n })).isRequired,\r\n onItemClick: PropTypes.func.isRequired,\r\n maxDisplayedItems: PropTypes.number,\r\n maxLengthOfItem: PropTypes.number,\r\n customItemStyle: PropTypes.shape({\r\n breadcrumbButton: PropTypes.string,\r\n breadcrumbButtonCurrent: PropTypes.string,\r\n }),\r\n};\r\n\r\nAdsStudioBreadcrumb.defaultProps = {\r\n maxDisplayedItems: DefaultMaxDisplayedItems,\r\n maxLengthOfItem: DefaultMaxLengthOfItem,\r\n customItemStyle: {},\r\n};\r\n","import { makeStyles, shorthands, tokens } from '@fluentui/react-components';\r\n\r\n\r\nexport const useLibraryEmptyViewStyle = makeStyles({\r\n CardContainer: {\r\n display: 'flex',\r\n flexDirection: 'row',\r\n flexWrap: 'wrap',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n ...shorthands.gap('8px'),\r\n ...shorthands.padding('8px', '0', '0', '0'),\r\n width: '700px',\r\n\r\n '& >button': {\r\n width: '340px',\r\n },\r\n },\r\n emptyView: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n ...shorthands.gap('8px'),\r\n },\r\n emptyIcon: {\r\n width: '256px',\r\n height: '256px',\r\n },\r\n mainText: {\r\n fontFamily: 'Segoe UI',\r\n fontStyle: 'normal',\r\n textAlign: 'center',\r\n ...shorthands.overflow('hidden'),\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n color: tokens.neutralForegroundRest,\r\n lineHeight: '22px',\r\n fontWeight: 400,\r\n\r\n },\r\n});\r\n\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { mergeClasses } from '@fluentui/react-components';\r\nimport { getEntryCardData } from '../../model/utils';\r\nimport { AddAssetEntryCard } from '../add-asset-entry-card';\r\n\r\nimport { EmptyViewIcons } from '../../asset-images';\r\nimport { useLibraryEmptyViewStyle } from '../ads-studio-library-page-content/styles/empty-view-style';\r\n\r\nexport const LibraryEmptyView = ({\r\n i18n,\r\n isInSubfolder,\r\n isAnyFilterSet,\r\n onClickStock,\r\n onClickCreate,\r\n onClickUpload,\r\n onClickWebsite,\r\n onClickInvest,\r\n hideAddAssetCards,\r\n isXandrIntegrationEnabled,\r\n}) => {\r\n const cardData = getEntryCardData({\r\n i18n,\r\n onClickCreate,\r\n onClickUpload,\r\n onClickStock,\r\n onClickWebsite,\r\n onClickInvest,\r\n isXandrIntegrationEnabled,\r\n });\r\n\r\n const classes = useLibraryEmptyViewStyle();\r\n\r\n let str = i18n.getString(_TL_('You haven\\'t added any assets yet. Choose from the options below to add assets.'));\r\n if (isAnyFilterSet) {\r\n str = i18n.getString(_TL_('No assets match your search. Please try again.'));\r\n } else if (isInSubfolder) {\r\n str = i18n.getString(_TL_('You haven\\'t added any assets to this folder yet. Once you add assets, you\\'ll see them here.'));\r\n }\r\n\r\n return (\r\n <div className={mergeClasses('empty-view-box', classes.emptyView)}>\r\n <div className={mergeClasses('empty-icon', classes.emptyIcon)}>\r\n <img src={EmptyViewIcons.LibraryEmptyViewSVG} alt=\"Empty Icon\" />\r\n </div>\r\n <div className={mergeClasses('main-text', classes.mainText)}>\r\n {str}\r\n </div>\r\n {\r\n !hideAddAssetCards &&\r\n <div className={mergeClasses('card-container', classes.CardContainer)}>\r\n {cardData.map(card => (\r\n <AddAssetEntryCard\r\n key={card.key}\r\n id={card.key}\r\n description={card.description}\r\n title={card.title}\r\n imageSrc={card.image}\r\n onClick={card.onClick}\r\n />\r\n ))}\r\n </div>\r\n }\r\n </div>\r\n );\r\n};\r\n\r\nLibraryEmptyView.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n }).isRequired,\r\n isInSubfolder: PropTypes.bool,\r\n isAnyFilterSet: PropTypes.bool,\r\n onClickStock: PropTypes.func.isRequired,\r\n onClickCreate: PropTypes.func.isRequired,\r\n onClickUpload: PropTypes.func.isRequired,\r\n onClickWebsite: PropTypes.func.isRequired,\r\n onClickInvest: PropTypes.func.isRequired,\r\n hideAddAssetCards: PropTypes.bool,\r\n isXandrIntegrationEnabled: PropTypes.bool,\r\n};\r\n\r\nLibraryEmptyView.defaultProps = {\r\n isInSubfolder: false,\r\n isAnyFilterSet: false,\r\n hideAddAssetCards: false,\r\n isXandrIntegrationEnabled: false,\r\n};\r\n","import React, { useCallback } from 'react';\r\nimport {\r\n Menu,\r\n MenuButton,\r\n MenuItem,\r\n MenuList,\r\n MenuDivider,\r\n MenuPopover,\r\n MenuTrigger,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Add20Regular,\r\n ArrowUpload20Regular,\r\n ImageMultiple20Regular,\r\n FolderAdd20Regular,\r\n} from '@fluentui/react-icons';\r\nimport { SparkeSVGIcon } from '../../asset-images';\r\n\r\nconst AddFromAnotherSourceSubMenu = (props) => {\r\n const {\r\n i18n,\r\n onUploadImage,\r\n onUploadVideo,\r\n } = props;\r\n\r\n return (\r\n <Menu>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuItem className=\"add-asset-button\" icon={<ImageMultiple20Regular />}>\r\n {i18n.getString(_TL_('Add from another source'))}\r\n </MenuItem>\r\n </MenuTrigger>\r\n\r\n <MenuPopover>\r\n <MenuList className=\"add-asset-menu-list\">\r\n <MenuItem className=\"add-image-button\" onClick={onUploadImage}>\r\n {i18n.getString(_TL_('Add image'))}\r\n </MenuItem>\r\n <MenuItem className=\"add-video-button\" onClick={onUploadVideo}>\r\n {i18n.getString(_TL_('Add video'))}\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\nconst UploadFromComputerSubMenu = (props) => {\r\n const {\r\n i18n,\r\n onUploadLocalFile,\r\n onUploadLocalFolder,\r\n } = props;\r\n\r\n return (\r\n <Menu>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuItem className=\"upload-button\" icon={<ArrowUpload20Regular />}>\r\n {i18n.getString(_TL_('Upload from computer'))}\r\n </MenuItem>\r\n </MenuTrigger>\r\n\r\n <MenuPopover>\r\n <MenuList className=\"upload-menu-list\">\r\n <MenuItem className=\"upload-file-button\" onClick={onUploadLocalFile}>\r\n {i18n.getString(_TL_('Upload file'))}\r\n </MenuItem>\r\n <MenuItem className=\"upload-folder-button\" onClick={onUploadLocalFolder}>\r\n {i18n.getString(_TL_('Upload folder'))}\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\nexport const NewDropDown = (props) => {\r\n const {\r\n i18n,\r\n className,\r\n logger,\r\n onUploadLocalFileClick,\r\n onUploadLocalFolderClick,\r\n onUploadImageClick,\r\n onUploadVideoClick,\r\n onAIGenerateClick,\r\n onCreateFolderClick,\r\n handleUsage,\r\n } = props;\r\n\r\n const onUploadLocalFile = useCallback(() => {\r\n logger.logTrace('Add assets - file upload is clicked');\r\n onUploadLocalFileClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onUploadLocalFileClick]);\r\n\r\n const onUploadLocalFolder = useCallback(() => {\r\n logger.logTrace('Add assets - folder upload is clicked');\r\n onUploadLocalFolderClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onUploadLocalFolderClick]);\r\n\r\n const onUploadImage = useCallback(() => {\r\n logger.logTrace('Add assets - image source is clicked');\r\n onUploadImageClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onUploadImageClick]);\r\n\r\n const onUploadVideo = useCallback(() => {\r\n logger.logTrace('Add assets - video source is clicked');\r\n onUploadVideoClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onUploadVideoClick]);\r\n\r\n const onAIGenerate = useCallback(() => {\r\n logger.logTrace('Add assets - ai generate image clicked');\r\n onAIGenerateClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onAIGenerateClick]);\r\n\r\n const onCreateFolder = useCallback(() => {\r\n logger.logTrace('Create folder is clicked');\r\n onCreateFolderClick();\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [handleUsage, logger, onCreateFolderClick]);\r\n\r\n return (\r\n <div className={className}>\r\n <Menu>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuButton className=\"new-drop-button\" appearance=\"primary\" icon={<Add20Regular />}>\r\n {i18n.getString(_TL_('New'))}\r\n </MenuButton>\r\n </MenuTrigger>\r\n\r\n <MenuPopover>\r\n <MenuList className=\"new-menu-list\">\r\n <MenuItem className=\"generate-images-button\" icon={<SparkeSVGIcon />} onClick={onAIGenerate}>\r\n {i18n.getString(_TL_('Generate images'))}\r\n </MenuItem>\r\n <MenuDivider />\r\n <UploadFromComputerSubMenu\r\n i18n={i18n}\r\n onUploadLocalFile={onUploadLocalFile}\r\n onUploadLocalFolder={onUploadLocalFolder}\r\n />\r\n <AddFromAnotherSourceSubMenu\r\n i18n={i18n}\r\n onUploadImage={onUploadImage}\r\n onUploadVideo={onUploadVideo}\r\n />\r\n <MenuItem className=\"create-folder-button\" icon={<FolderAdd20Regular />} onClick={onCreateFolder}>\r\n {i18n.getString(_TL_('Create folder'))}\r\n </MenuItem>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useRef, useCallback, useMemo, useEffect } from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n Button,\r\n MenuButton,\r\n MenuList,\r\n MenuDivider,\r\n makeStyles,\r\n tokens,\r\n Label,\r\n Input,\r\n useId,\r\n mergeClasses,\r\n Popover,\r\n PopoverTrigger,\r\n PopoverSurface,\r\n shorthands,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n} from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '180px',\r\n ...shorthands.padding('4px'),\r\n },\r\n menuButton: {\r\n // This is a known fluent ui issue between Popover and MenuButton: https://github.com/microsoft/fluentui/issues/31804\r\n // This bug has been fixed in the latest version, but as we use legacy version, update the style as a workaround.\r\n backgroundColor: 'transparent',\r\n '&[aria-expanded=\"true\"]': {\r\n backgroundColor: '#EBEBEB',\r\n },\r\n },\r\n unselectedMenuButton: {\r\n '&[aria-expanded=\"false\"]': {\r\n fontWeight: 'unset',\r\n },\r\n },\r\n enabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n },\r\n disabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n});\r\n\r\nconst useCustomItemStyles = makeStyles({\r\n minWidth: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n maxWidth: '124px',\r\n },\r\n minHeight: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n marginBottom: '6px',\r\n maxWidth: '124px',\r\n },\r\n input: {\r\n paddingRight: '0px',\r\n height: '32px',\r\n lineHeight: '32px',\r\n overflowX: 'hidden',\r\n overflowY: 'hidden',\r\n },\r\n contentAfter: {\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n paddingRight: '6px',\r\n paddingLeft: '8px',\r\n },\r\n contentLabel: {\r\n marginBottom: '6px',\r\n marginTop: '8px',\r\n },\r\n});\r\n\r\nexport const ImageSizeFilter = (props) => {\r\n const {\r\n i18n,\r\n defaultMinWidth,\r\n defaultMinHeight,\r\n onChange,\r\n forceClear,\r\n onDismiss,\r\n defaultOpen = false,\r\n } = props;\r\n\r\n const minWidthId = useId('minWidth');\r\n const afterMinWidthId = useId('afterMinWidthId');\r\n const minHeightId = useId('minHeight');\r\n const afterMinHeightId = useId('afterMinHeightId');\r\n const customClasses = useCustomItemStyles();\r\n\r\n const classes = useStyles();\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n const [showInput, setShowInput] = useState(defaultOpen);\r\n const [menuList, setMenuList] = useState(null);\r\n\r\n // use ref to handle focus switching when pressing tab key\r\n const minWidthRef = useRef(null);\r\n const minHeightRef = useRef(null);\r\n\r\n const [minWidth, setMinWidth] = useState(defaultMinWidth);\r\n const [minHeight, setMinHeight] = useState(defaultMinHeight);\r\n\r\n const getOnChangeCallback = useCallback(setter => (event, newValue) => {\r\n const val = parseInt(newValue, 10);\r\n if (_.isEmpty(newValue) || _.isNaN(val)) {\r\n setter(null);\r\n return;\r\n }\r\n if (!_.isNaN(val) && val >= 0 && val <= 1000000) {\r\n setter(val);\r\n }\r\n }, []);\r\n\r\n const onMinWidthChange = useMemo(\r\n () => getOnChangeCallback(setMinWidth),\r\n [getOnChangeCallback]\r\n );\r\n\r\n const onMinHeightChange = useMemo(\r\n () => getOnChangeCallback(setMinHeight),\r\n [getOnChangeCallback]\r\n );\r\n\r\n const onClear = useCallback(() => {\r\n setMinWidth(null);\r\n setMinHeight(null);\r\n if ((defaultMinHeight || defaultMinWidth)) {\r\n // trigger onchange only when dropdown list is closed\r\n onChange({ newMinHeight: null, newMinWidth: null });\r\n }\r\n if (onDismiss) {\r\n onDismiss();\r\n }\r\n }, [defaultMinHeight, defaultMinWidth, onChange, onDismiss]);\r\n\r\n const title = useMemo(() => {\r\n if (minWidth && minHeight) {\r\n return `> ${minWidth}px x ${minHeight}px`;\r\n }\r\n if (minWidth) {\r\n return `${i18n.getString(_TL_('Width'))} > ${minWidth}px`;\r\n }\r\n if (minHeight) {\r\n return `${i18n.getString(_TL_('Height'))} > ${minHeight}px`;\r\n }\r\n return '';\r\n }, [i18n, minHeight, minWidth]);\r\n\r\n const focusTextField = useCallback(textFieldRef => (event) => {\r\n if (event.key === 'Tab') {\r\n if (textFieldRef.current) {\r\n textFieldRef.current.focus();\r\n }\r\n if (event.stopPropagation) { event.stopPropagation(); }\r\n if (event.preventDefault) { event.preventDefault(); }\r\n }\r\n }, []);\r\n\r\n const onMinWidthKeyUp = useMemo(() => focusTextField(minHeightRef), [focusTextField]);\r\n const onMinHeightKeyUp = useMemo(() => focusTextField(minWidthRef), [focusTextField]);\r\n\r\n const onDropdownDismiss = useCallback(() => {\r\n if (defaultMinHeight !== minHeight || defaultMinWidth !== minWidth) {\r\n onChange({ newMinWidth: minWidth, newMinHeight: minHeight }, title);\r\n }\r\n }, [defaultMinHeight, defaultMinWidth, minHeight, minWidth, onChange, title]);\r\n\r\n const clear = () => {\r\n setIsOpen(false);\r\n onClear();\r\n };\r\n\r\n const isSelected = useMemo(() => minWidth || minHeight, [minHeight, minWidth]);\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n useEffect(() => {\r\n if (forceClear) {\r\n clear();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [forceClear]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n onDropdownDismiss();\r\n }\r\n }, [isOpen, onDropdownDismiss]);\r\n\r\n useEffect(() => {\r\n let timeoutId;\r\n if (isOpen) {\r\n timeoutId = setTimeout(() => {\r\n if (minWidthRef.current) {\r\n minWidthRef.current.focus();\r\n }\r\n }, 300);\r\n }\r\n setShowInput(isOpen);\r\n return () => {\r\n clearTimeout(timeoutId);\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n if (menuList) {\r\n // as we are using custom input, we need to remove menu role for accessibility\r\n menuList.removeAttribute('role');\r\n }\r\n }, [menuList]);\r\n\r\n return (\r\n <Popover trapFocus open={isOpen} onOpenChange={onOpenChange} positioning=\"below-start\">\r\n <PopoverTrigger disableButtonEnhancement>\r\n <MenuButton appearance=\"subtle\" className={isSelected ? mergeClasses(classes.menuButton, 'image-size-button') : mergeClasses(classes.menuButton, classes.unselectedMenuButton, 'image-size-button')}>\r\n {isSelected ? title : i18n.getString(_TL_('Image ratio'))}\r\n </MenuButton>\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface className={mergeClasses(classes.menuPopover, 'image-size-menu')}>\r\n <MenuList ref={setMenuList}>\r\n <div className=\"custom-ratio\">\r\n <div className={mergeClasses(customClasses.minWidth, 'min-width')}>\r\n <Label className={customClasses.contentLabel} htmlFor={minWidthId}>{i18n.getString(_TL_('Min. width'))}</Label>\r\n {\r\n // Add a condition to check if the input should be shown or not\r\n // By this way, screen reader can read the expanded state of Menu correctly\r\n showInput &&\r\n <Input\r\n className={customClasses.input}\r\n ref={minWidthRef}\r\n value={minWidth ? minWidth.toString() : ''}\r\n onChange={(ev, data) => onMinWidthChange(ev, data.value)}\r\n contentAfter={\r\n <div className={customClasses.contentAfter} id={afterMinWidthId}>\r\n {i18n.getString(_TL_('px'))}\r\n </div>\r\n }\r\n aria-labelledby={`${minWidthId} ${afterMinWidthId}`}\r\n id={minWidthId}\r\n onKeyDown={onMinWidthKeyUp}\r\n />\r\n }\r\n </div>\r\n <div className={mergeClasses(customClasses.minHeight, 'min-height')}>\r\n <Label className={customClasses.contentLabel} htmlFor={minHeightId}>{i18n.getString(_TL_('Min. height'))}</Label>\r\n {\r\n showInput &&\r\n <Input\r\n className={customClasses.input}\r\n ref={minHeightRef}\r\n value={minHeight ? minHeight.toString() : ''}\r\n onChange={(ev, data) => onMinHeightChange(ev, data.value)}\r\n contentAfter={\r\n <div className={customClasses.contentAfter} id={afterMinHeightId}>\r\n {i18n.getString(_TL_('px'))}\r\n </div>\r\n }\r\n onKeyDown={onMinHeightKeyUp}\r\n aria-labelledby={`${minHeightId} ${afterMinHeightId}`}\r\n id={minHeightId}\r\n />\r\n }\r\n </div>\r\n </div>\r\n <MenuDivider />\r\n </MenuList>\r\n <div>\r\n <Button\r\n className={isSelected ? mergeClasses('clear-button', classes.enabledClearButton) : classes.disabledClearButton}\r\n disabled={!isSelected}\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => clear()}\r\n >\r\n {i18n.getString(_TL_('Clear'))}\r\n </Button>\r\n </div>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\n","import { CivilDate } from 'tc39-proposal-temporal';\r\nimport {\r\n getCivilDateToday,\r\n compareCivilDate,\r\n} from '@bingads-webui-universal/temporal-utitlities';\r\n\r\nexport const civilDateEqual = (d1, d2) => {\r\n if (!d1 && !d2) {\r\n return true;\r\n }\r\n if (!d1 || !d2) {\r\n return false;\r\n }\r\n return compareCivilDate(d1, d2) === 0;\r\n};\r\n\r\nexport const civilDateRangeEqual = (r1, r2) => {\r\n if ((!r1 && !r2) || (r1 === r2)) {\r\n return true;\r\n }\r\n if (!r1 || !r2) {\r\n return false;\r\n }\r\n return civilDateEqual(r1.start, r2.start) && civilDateEqual(r1.end, r2.end);\r\n};\r\n\r\nexport const civilDateToDebugString = (cd) => {\r\n if (!cd) return '';\r\n const { year, month, day } = cd || {};\r\n return `${year || ''}-${month || ''}-${day || ''}`;\r\n};\r\n\r\nexport const civilDateRangeToDebugString = (dr) => {\r\n if (!dr) {\r\n return '';\r\n }\r\n return `start:${civilDateToDebugString(dr.start)} end:${civilDateToDebugString(dr.end)}`;\r\n};\r\n\r\nexport const getDefaultDateRange = () => {\r\n const yesterday = getCivilDateToday().plus({ days: -1 });\r\n const defaultRange = { start: yesterday, end: yesterday };\r\n return defaultRange;\r\n};\r\n\r\nexport const getDefaultMetricDateRange = (i18n, dateFormat, timeZone, lcid) => {\r\n const todayObj = i18n.getToday({ timeZone });\r\n const today = new CivilDate(todayObj.year, todayObj.month, todayObj.day);\r\n const yesterday = today.plus({ days: -1 });\r\n const last30day = today.plus({ days: -30 });\r\n return {\r\n RangeStartDate: i18n.formatCivilDate(last30day, { raw: dateFormat, timeZone }),\r\n RangeEndDate: i18n.formatCivilDate(yesterday, { raw: dateFormat, timeZone }),\r\n Rangelcid: lcid,\r\n RangeId: 5, // last 30 days, RANGES.Last30Days\r\n };\r\n};\r\n","import classnames from 'classnames';\r\nimport React, { useCallback, useMemo, useState, useRef, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CivilDate } from 'tc39-proposal-temporal';\r\nimport { SingleMonthCalendar } from '@bingads-webui-react/single-month-calendar';\r\n\r\nimport { civilDateRangeEqual } from '../../../utils/date-utils';\r\n\r\n// this is a simple date range picker based on the Calendar control used in\r\n// Campaign UI (NOT Fluent UI Calendar)\r\n// the 'Compare' feature is not supported, so only one date range selection\r\n// is supported\r\nconst SimpleDateRangePickerInternal = ({\r\n defaultSelectedDateRange,\r\n // to select a date range, need to select 2 days (start & end) on calendars\r\n // this value control which value is currently selecting\r\n defaultIsSelectingStartDate,\r\n onDateRangeChange,\r\n timeZone,\r\n i18n,\r\n}) => {\r\n // use ref instead of state to avoid unnecessary rending\r\n const isSelectingStartDate = useRef(defaultIsSelectingStartDate);\r\n\r\n const [selectedDateRange, setSelectedDateRange]\r\n = useState(defaultSelectedDateRange);\r\n\r\n // the navigatedDate set on the left calendar, which control which month\r\n // is shown on the calendar\r\n const [leftNavigatedDate, setLeftNavigationDate] = useState(new CivilDate(\r\n defaultSelectedDateRange.end.year,\r\n defaultSelectedDateRange.end.month - 1,\r\n 15\r\n ));\r\n\r\n // the navigatedDate set on the right calendar\r\n const rightNavigatedDate = useMemo(\r\n () => new CivilDate(leftNavigatedDate.year, leftNavigatedDate.month + 1, 15),\r\n [leftNavigatedDate]\r\n );\r\n\r\n const today = useMemo(() => {\r\n const todayObj = i18n.getToday({ timeZone });\r\n return new CivilDate(todayObj.year, todayObj.month, todayObj.day);\r\n }, [i18n, timeZone]);\r\n\r\n // for now, use the default values here\r\n const minDate = useMemo(() => today.plus({ years: -3 }), [today]);\r\n const maxDate = today;\r\n\r\n // 'Compare' is not supported, so only one range is used\r\n const selectedRanges = useMemo(() => [selectedDateRange], [selectedDateRange]);\r\n\r\n // click '<' button on the left calendar\r\n const onNavigateStartMonthDate = useCallback((date) => {\r\n setLeftNavigationDate(date);\r\n }, []);\r\n\r\n // click '>' button on the right calendar\r\n const onNavigateEndMonthDate = useCallback((date) => {\r\n setLeftNavigationDate(date.plus({ months: -1 }));\r\n }, []);\r\n\r\n const onSelectDate = useCallback((newDate) => {\r\n let { start, end } = selectedDateRange || {};\r\n if (isSelectingStartDate.current) {\r\n start = newDate;\r\n end = end > newDate ? end : newDate;\r\n } else {\r\n end = newDate;\r\n }\r\n if (start > end) {\r\n setSelectedDateRange({ start: end, end: start });\r\n } else {\r\n setSelectedDateRange({ start, end });\r\n }\r\n isSelectingStartDate.current = !isSelectingStartDate.current;\r\n }, [selectedDateRange]);\r\n\r\n useEffect(() => {\r\n if (!civilDateRangeEqual(selectedDateRange, defaultSelectedDateRange) && onDateRangeChange) {\r\n onDateRangeChange(selectedDateRange);\r\n }\r\n }, [onDateRangeChange, selectedDateRange, defaultSelectedDateRange]);\r\n\r\n return (\r\n <div className={classnames('simple-date-range-picker')}>\r\n <div className=\"compared-date-range-picker-dialog\">\r\n <div className=\"double-month-calendar\">\r\n <div className=\"left-calendar\">\r\n <SingleMonthCalendar\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n today={today}\r\n onSelectDate={onSelectDate}\r\n selectedRanges={selectedRanges}\r\n navigatedDate={leftNavigatedDate}\r\n onNavigateDate={onNavigateStartMonthDate}\r\n isRightNavigateVisible={false}\r\n i18n={i18n}\r\n />\r\n </div>\r\n <div className=\"divider\" />\r\n <div className=\"right-calendar\">\r\n <SingleMonthCalendar\r\n minDate={minDate}\r\n maxDate={maxDate}\r\n today={today}\r\n onSelectDate={onSelectDate}\r\n selectedRanges={selectedRanges}\r\n navigatedDate={rightNavigatedDate}\r\n onNavigateDate={onNavigateEndMonthDate}\r\n isLeftNavigateVisible={false}\r\n i18n={i18n}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nSimpleDateRangePickerInternal.propTypes = {\r\n defaultSelectedDateRange: PropTypes.shape({\r\n start: PropTypes.instanceOf(CivilDate),\r\n end: PropTypes.instanceOf(CivilDate),\r\n }).isRequired,\r\n defaultIsSelectingStartDate: PropTypes.bool,\r\n onDateRangeChange: PropTypes.func,\r\n timeZone: PropTypes.string.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n getToday: PropTypes.func,\r\n }).isRequired,\r\n};\r\n\r\nSimpleDateRangePickerInternal.defaultProps = {\r\n defaultIsSelectingStartDate: true,\r\n onDateRangeChange: undefined,\r\n};\r\n\r\nexport const SimpleDateRangePicker = SimpleDateRangePickerInternal;\r\n","import _ from 'underscore';\r\nimport {\r\n getFoldersLimitPerAccount,\r\n getImageAssetLimitPerAccount,\r\n getVideoAssetLimitPerAccount\r\n} from '../model';\r\n\r\nconst containsErrorCodeInList = (errorList, searchErrorCode) => {\r\n const found = _.find(errorList, (err) => {\r\n const errorCodeInn = _.get(err, ['body', 'value', 0, 'Code'], '') || err;\r\n return errorCodeInn === searchErrorCode;\r\n });\r\n if (found) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const processFolderSizeLimitError = ({ errorList, aid, logger }) => {\r\n if (errorList.length > 0 && containsErrorCodeInList(errorList, 'FolderLimitExceededPerAccount')) {\r\n const limit = getFoldersLimitPerAccount(aid, logger);\r\n\r\n return { limit };\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport const processImageSizeLimitError = ({ errorList, aid, logger }) => {\r\n if (errorList.length > 0 && containsErrorCodeInList(errorList, 'ImagesLimitExceededPerAccount')) {\r\n const limit = getImageAssetLimitPerAccount(aid, logger);\r\n\r\n return { limit };\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport const processVideoSizeLimitError = ({ errorList, aid, logger }) => {\r\n if (errorList.length > 0 && containsErrorCodeInList(errorList, 'VideoLimitExceededPerAccount')) {\r\n const limit = getVideoAssetLimitPerAccount(aid, logger);\r\n\r\n return { limit };\r\n }\r\n\r\n return null;\r\n};\r\n","import { Promise } from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { parseSync } from '@bingads-webui/safe-json';\r\n\r\nexport const fetchImgPromise = imgUrl => new Promise((resolve, reject) => {\r\n const image = new Image();\r\n image.onload = () => {\r\n resolve(image);\r\n };\r\n image.onerror = () => {\r\n reject(new Error('Failed to load image'));\r\n };\r\n image.crossOrigin = '';\r\n image.src = imgUrl;\r\n});\r\n\r\nexport const createOffScreenContext = (width, height) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n const context = canvas.getContext('2d');\r\n return {\r\n canvas,\r\n context,\r\n };\r\n};\r\n\r\nexport const getImagePixels = (image, imageWidth, imageHeight) => {\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n\r\n context.drawImage(image, 0, 0);\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n return pixels;\r\n};\r\n\r\nexport const parseMaskResultPromise = ({\r\n result,\r\n imageUrl,\r\n imageWidth,\r\n imageHeight,\r\n}) => new Promise((resolve, reject) => {\r\n const { rawMaskSetsBase64String } = result;\r\n const maskSetsBase64Json = parseSync(rawMaskSetsBase64String);\r\n if (_.isUndefined(maskSetsBase64Json)) {\r\n reject(new Error('Failed to parse result'));\r\n }\r\n const {\r\n shape = [],\r\n data: maskSetsBase64,\r\n } = maskSetsBase64Json;\r\n\r\n // Convert the decompressed data into a 3D array\r\n const reshapeTo3D = (array, x, y, z) => {\r\n const res = [];\r\n let index = 0;\r\n for (let i = 0; i < x; i += 1) {\r\n const temp2D = [];\r\n for (let j = 0; j < y; j += 1) {\r\n const temp1D = [];\r\n for (let k = 0; k < z; k += 1) {\r\n temp1D.push(array[index]);\r\n index += 1;\r\n }\r\n temp2D.push(temp1D);\r\n }\r\n res.push(temp2D);\r\n }\r\n return res;\r\n };\r\n\r\n async function decompressAndParse3DArray(base64String, x, y, z) {\r\n // Step 1: Decode the Base64 string to a binary Uint8Array\r\n const binaryString = atob(base64String);\r\n const byteArray = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i += 1) {\r\n byteArray[i] = binaryString.charCodeAt(i);\r\n }\r\n\r\n // Step 2: Create a readable stream from the byteArray\r\n const inputStream = new Blob([byteArray]).stream();\r\n\r\n // Step 3: Decompress the stream using DecompressionStream (assuming 'gzip')\r\n const decompressionStream = new DecompressionStream('gzip');\r\n const decompressedStream = inputStream.pipeThrough(decompressionStream);\r\n\r\n // Step 4: Collect the decompressed data\r\n const decompressedResponse = new Response(decompressedStream);\r\n const decompressedBuffer = await decompressedResponse.arrayBuffer();\r\n\r\n // Step 5: Convert the decompressed data to a Uint8Array\r\n const decompressedArray = new Uint8Array(decompressedBuffer);\r\n\r\n // Step 6: Reshape the decompressed array into the specified 3D dimensions (x, y, z)\r\n const int3DArray = reshapeTo3D(decompressedArray, x, y, z);\r\n\r\n return int3DArray;\r\n }\r\n\r\n // Execute the function and log the result\r\n decompressAndParse3DArray(maskSetsBase64, shape[1], shape[0], shape[2])\r\n .then((maskSets3Darray) => {\r\n const maskSetsArray = maskSets3Darray.map(row => row.map(a => a[0])).flat();\r\n const alphaArray = maskSets3Darray.map(row => row.map(a => a[1])).flat();\r\n const selectedMasksArray = _.filter(_.uniq(maskSetsArray), pixelMask => pixelMask > 0);\r\n fetchImgPromise(imageUrl).then((image) => {\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n\r\n context.drawImage(image, 0, 0);\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n return pixels;\r\n }).then((originalImagePixels) => {\r\n if (originalImagePixels && maskSetsArray) {\r\n // If not in mask, return empty and transparent pixel\r\n // If in mask, return the original pixel\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n if (maskSetsArray[i / 4] > 0) {\r\n pixels[i] = originalImagePixels[i];\r\n pixels[i + 1] = originalImagePixels[i + 1];\r\n pixels[i + 2] = originalImagePixels[i + 2];\r\n pixels[i + 3] = alphaArray[i / 4];\r\n }\r\n }\r\n // put the selected image from first canvas to second canvas\r\n const { context: secondContext, canvas: secondCanvas } = createOffScreenContext(imageWidth, imageHeight);\r\n secondContext.putImageData(imageData, 0, 0);\r\n resolve({\r\n rawMaskSetsBase64String,\r\n maskSetsArray,\r\n alphaArray,\r\n selectedMasksArray,\r\n imageUrlWithoutBackground: secondCanvas.toDataURL(),\r\n });\r\n } else {\r\n reject(new Error('Failed to parse result'));\r\n }\r\n });\r\n })\r\n .catch(() => {\r\n reject(new Error('Failed to parse result'));\r\n });\r\n});\r\n\r\nexport function hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16),\r\n } : null;\r\n}\r\n\r\nexport function getMaskValueAtPointFunc(x, y, imageWidth, segmentationMasks) {\r\n if (x < 0 || y < 0) {\r\n return null;\r\n }\r\n // Should transform the point to the original point on the image size\r\n const width = imageWidth;\r\n\r\n // get index of the mask array\r\n const index = (parseInt(y, 10) * width) + parseInt(x, 10);\r\n // get mask value at the index\r\n return segmentationMasks[index];\r\n}\r\n\r\nexport function createColorBackground(image, imageWidth, imageHeight, color, segmentationMasks, selectedMasks, alphaArray) {\r\n // If not in mask, return empty and transparent pixel\r\n // If in mask, return the original pixel\r\n const { r, g, b } = hexToRgb(color);\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n\r\n context.drawImage(image, 0, 0);\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n if (!selectedMasks.includes(segmentationMasks[i / 4])) {\r\n pixels[i] = r;\r\n pixels[i + 1] = g;\r\n pixels[i + 2] = b;\r\n pixels[i + 3] = 255;\r\n } else {\r\n const alpha = alphaArray[i / 4] / 255;\r\n const newR = ((1 - alpha) * r) + ((alpha) * pixels[i]);\r\n const newG = ((1 - alpha) * g) + ((alpha) * pixels[i + 1]);\r\n const newB = ((1 - alpha) * b) + ((alpha) * pixels[i + 2]);\r\n pixels[i] = newR;\r\n pixels[i + 1] = newG;\r\n pixels[i + 2] = newB;\r\n pixels[i + 3] = 255;\r\n }\r\n }\r\n // put the selected image from first canvas to second canvas\r\n const { context: secondContext, canvas: secondCanvas } = createOffScreenContext(imageWidth, imageHeight);\r\n secondContext.putImageData(imageData, 0, 0);\r\n return secondCanvas.toDataURL();\r\n}\r\n\r\nexport function createSelectedImageSrc(image, imageWidth, imageHeight, originalImagePixels, segmentationMasks, masks, isAdd, hasSelectedImageSrc) {\r\n // If not in mask, return empty and transparent pixel\r\n // If in mask, return the original pixel\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n\r\n if (hasSelectedImageSrc) {\r\n context.drawImage(image, 0, 0);\r\n }\r\n\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n if (masks.includes(segmentationMasks[i / 4])) {\r\n if (isAdd) {\r\n pixels[i] = originalImagePixels[i];\r\n pixels[i + 1] = originalImagePixels[i + 1];\r\n pixels[i + 2] = originalImagePixels[i + 2];\r\n pixels[i + 3] = originalImagePixels[i + 3];\r\n } else {\r\n pixels[i] = 0;\r\n pixels[i + 1] = 0;\r\n pixels[i + 2] = 0;\r\n pixels[i + 3] = 0;\r\n }\r\n }\r\n }\r\n\r\n const { context: secondContext, canvas: secondCanvas } = createOffScreenContext(imageWidth, imageHeight);\r\n secondContext.putImageData(imageData, 0, 0);\r\n\r\n const dArr = [-1, -1, 0, -1, 1, -1, -1, 0, 1, 0, -1, 1, 0, 1, 1, 1]; // offset array\r\n const s = 6; // thickness scale\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n // draw images at offsets from the array scaled by s\r\n for (let i = 0; i < dArr.length; i += 2) {\r\n context.drawImage(secondCanvas, dArr[i] * s, dArr[i + 1] * s);\r\n }\r\n\r\n // fill with color\r\n context.globalCompositeOperation = 'source-in';\r\n context.fillStyle = '#D1ACFF';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n return ({\r\n borderImageSrc: canvas.toDataURL(),\r\n selectedImageSrc: secondCanvas.toDataURL(),\r\n });\r\n}\r\n\r\nexport function createHighlightedImage(imageWidth, imageHeight, originalImagePixels, segmentationMasks, workingMasks, maskValue) {\r\n const {\r\n canvas,\r\n context,\r\n } = createOffScreenContext(imageWidth, imageHeight);\r\n\r\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\r\n const pixels = imageData.data;\r\n\r\n if (originalImagePixels) {\r\n for (let i = 0; i < pixels.length; i += 4) {\r\n if (segmentationMasks[i / 4] === maskValue) {\r\n if (workingMasks.includes(maskValue)) {\r\n pixels[i] = (originalImagePixels[i] + 1672) / 9; // X + Y * 8) / 9\r\n pixels[i + 1] = (originalImagePixels[i + 1] + 1376) / 9;\r\n pixels[i + 2] = (originalImagePixels[i + 2] + 2040) / 9;\r\n pixels[i + 3] = originalImagePixels[i + 3];\r\n } else if (maskValue > 0) {\r\n pixels[i] = originalImagePixels[i];\r\n pixels[i + 1] = originalImagePixels[i + 1];\r\n pixels[i + 2] = originalImagePixels[i + 2];\r\n pixels[i + 3] = 128;\r\n }\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(imageData, 0, 0);\r\n\r\n return canvas.toDataURL();\r\n}\r\n","export const PlacementQualities = {\r\n PERFECT: 7,\r\n EXCELLENT_AND_PERFECT: 6,\r\n PERFECT_AND_GOOD: 5,\r\n ONLY_PERFECT: 4,\r\n EXCELLENT: 3,\r\n ONLY_EXCELLENT: 2,\r\n GOOD: 1,\r\n NONE: 0,\r\n};\r\n\r\n// recently changed wording for each quality label\r\n// perfect -> excellent\r\n// excellent -> good\r\n// good -> fair\r\nexport const PlacementQualityToText = {\r\n [PlacementQualities.PERFECT]: _TL_('Excellent'),\r\n [PlacementQualities.EXCELLENT]: _TL_('Good'),\r\n [PlacementQualities.GOOD]: _TL_('Fair'),\r\n [PlacementQualities.NONE]: _TL_('Poor'),\r\n [PlacementQualities.PERFECT_AND_GOOD]: _TL_('Excellent'),\r\n [PlacementQualities.EXCELLENT_AND_PERFECT]: _TL_('Excellent'),\r\n [PlacementQualities.ONLY_PERFECT]: _TL_('Excellent'),\r\n [PlacementQualities.ONLY_EXCELLENT]: _TL_('Good'),\r\n};\r\n\r\nexport const formatFileSize = fileSize => Math.round(fileSize / 1000000);\r\n\r\nexport const getClosestAspectRatio = (width, height) => {\r\n const inputRatio = width / height;\r\n const ratios = {\r\n '16:9': (16 / 9),\r\n '9:16': (9 / 16),\r\n '4:3': (4 / 3),\r\n '1:1': (1 / 1),\r\n '9:21': (9 / 21),\r\n '21:9': (21 / 9),\r\n '3:4': (3 / 4),\r\n };\r\n let closestRatio = null;\r\n let closestDiff = Math.abs(inputRatio - closestRatio);\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (const [label, ratio] of Object.entries(ratios)) {\r\n const diff = Math.abs(inputRatio - ratio);\r\n if (diff < closestDiff) {\r\n closestDiff = diff;\r\n closestRatio = label;\r\n }\r\n }\r\n /* eslint-enable no-restricted-syntax */\r\n\r\n return closestRatio;\r\n};\r\n\r\nexport const formatBrandkitForAPI = (obj) => {\r\n if (Array.isArray(obj)) {\r\n return obj.map(formatBrandkitForAPI);\r\n } else if (obj !== null && typeof obj === 'object') {\r\n const formattedObj = {};\r\n Object.keys(obj).forEach((key) => {\r\n if (key === 'Id') {\r\n formattedObj.Id = parseInt(obj[key], 10);\r\n } else if (key === 'SubType') {\r\n formattedObj.SubType = 'None';\r\n } else if (obj[key] === null) {\r\n formattedObj[key] = [];\r\n } else if (key !== 'Type') {\r\n formattedObj[key] = formatBrandkitForAPI(obj[key]);\r\n }\r\n });\r\n return formattedObj;\r\n }\r\n return obj;\r\n};\r\n","import _ from 'underscore';\r\n\r\nconst errorObjectToString = (err) => {\r\n const { name, message, stack } = err;\r\n if (message || stack) {\r\n return `Error: ${name}, message: ${message}, stack: ${stack}`;\r\n }\r\n return JSON.stringify(err) || '(no error message)';\r\n};\r\n\r\nexport const getErrorString = (err) => {\r\n if (!err) {\r\n return '';\r\n }\r\n\r\n if (_.isString(err)) {\r\n return err;\r\n }\r\n\r\n if (_.isObject(err)) {\r\n let msg = errorObjectToString(err);\r\n if (err.originError) {\r\n msg += `,\\r\\nOrigin ${errorObjectToString(err.originError)}`;\r\n }\r\n return msg;\r\n }\r\n\r\n return JSON.stringify(err);\r\n};\r\n","import _ from 'underscore';\r\n\r\n// return first truthy result\r\nexport const fetchResultFromProcessors = ({ processors, options = {} } = {}) => {\r\n for (let i = 0; i < _.size(processors); i += 1) {\r\n const result = processors[i](options);\r\n\r\n if (result) {\r\n return result;\r\n }\r\n }\r\n\r\n return '';\r\n};\r\n","import React from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n processImageSizeLimitError,\r\n processVideoSizeLimitError,\r\n} from './upload-asset-limit-error';\r\nimport { fetchResultFromProcessors } from './processor-util';\r\n\r\nconst errorCodeMessageKeyMapping = {\r\n InvalidDuration: _TL_('One or more videos failed to upload because their duration is outside the valid range: 6 - 120 seconds.'),\r\n AssetDataInvalidWidth: _TL_('One or more videos failed to upload because their width is outside the valid range: 120 - 4096 pixels'),\r\n AssetDataInvalidHeight: _TL_('One or more videos failed to upload because their height is outside the valid range: 120 - 2160 pixels'),\r\n ImageAIUpScaleFailed: _TL_('One or more images are smaller than the required minimum size (703 x 368).'),\r\n};\r\n\r\nconst processAssetLimitErrors = ({\r\n codes, aid, logger, i18n,\r\n}) => {\r\n const imageSizeLimitResult = processImageSizeLimitError({ errorList: codes, aid, logger });\r\n\r\n if (imageSizeLimitResult) {\r\n const { limit: imageAssetLimit } = imageSizeLimitResult;\r\n\r\n return i18n.getString(\r\n _TL_('One or more images failed to upload because your account has exceeded the {{value}}-image asset limit. Please remove assets and try again.'),\r\n { value: imageAssetLimit }\r\n );\r\n }\r\n\r\n const videoSizeLimitResult = processVideoSizeLimitError({ errorList: codes, aid, logger });\r\n if (videoSizeLimitResult) {\r\n const { limit: videoAssetLimit } = videoSizeLimitResult;\r\n\r\n return i18n.getString(\r\n _TL_('One or more videos failed to upload because your account has exceeded the {{value}}-video asset limit. Please remove assets and try again.'),\r\n { value: videoAssetLimit }\r\n );\r\n }\r\n\r\n return '';\r\n};\r\n\r\nconst processImageErrors = ({ codes, filePickerI18n }) => filePickerI18n.getString(`ImageExperience_Error_${codes[0]}`);\r\n\r\nconst processPredefinedAssetErrors = ({ codes, i18n }) => {\r\n const mappedKey = errorCodeMessageKeyMapping[codes[0]];\r\n\r\n return mappedKey ? i18n.getString(mappedKey) : '';\r\n};\r\n\r\nexport const getAssetUploadError = ({\r\n uploadErrorCodeArr,\r\n i18n,\r\n filePickerI18n,\r\n aid,\r\n logger,\r\n disableGenericMessage = false,\r\n} = {}) => {\r\n if (_.size(uploadErrorCodeArr) > 0) {\r\n const errorMessage = fetchResultFromProcessors({\r\n processors: [\r\n processAssetLimitErrors,\r\n processImageErrors,\r\n processPredefinedAssetErrors,\r\n ],\r\n options: {\r\n codes: uploadErrorCodeArr,\r\n filePickerI18n,\r\n i18n,\r\n aid,\r\n logger,\r\n },\r\n });\r\n\r\n if (disableGenericMessage || errorMessage) {\r\n return errorMessage;\r\n }\r\n\r\n const genericMessage = (\r\n <span>\r\n {\r\n i18n.getString(_TL_('One or more assets failed to upload. Please try again'))\r\n }\r\n <a style={{ marginLeft: 5 }} className=\"HelpTopic\" href=\" \" query=\"help:app54863\" role=\"button\">{i18n.getString(_TL_('Learn more about asset guidelines and accepted file types.'))}</a>\r\n </span>\r\n );\r\n\r\n return genericMessage;\r\n }\r\n\r\n return '';\r\n};\r\n","/* eslint-disable arrow-body-style */\r\nimport Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { runJobsInParallelWithRateLimit } from '@bingads-webui-universal/parallel-job-with-rate-limit';\r\nimport { parseFileName } from '@bingads-webui-campaign-react/upload-file-picker';\r\n\r\n// if folder creation fails, continue partial upload around failed folder\r\n// mark failing folder with unique id;\r\nexport const INVALID_FOLDER_ID = -9999;\r\n\r\nconst UPLOAD_PARALLEL_RATE_LIMIT = 6;\r\n\r\n/*\r\n* Folder traversal functions\r\n* Upload folder via input button results in an array of File objects\r\n* with property webkitRelativePath that contains path of File relative\r\n* to (and including) the selected folder.\r\n* e.g. if I selected a folder A with subfolder B and file C.jpg is in B\r\n* then B's webkitRelativePath is \"A/B/C.jpg\"\r\n*\r\n* More information can be found here: https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory\r\n* Some of these property names may be liable to changing as the webkit\r\n* prefix is an artifact of this folder upload feature being originally\r\n* implemented in Chrome and not having been standardized across all\r\n* browsers initially.\r\n*/\r\n\r\n// Will return an array of folders that form the relative path\r\n// e.g. for \"A/B/C.jpg\", returns [\"A\", \"B\"]\r\nconst getRelativeFoldersFromRelativePath = (relativePath) => {\r\n const pathArr = _.map(relativePath.split('/'), name => name.trim());\r\n\r\n pathArr.pop();\r\n\r\n return pathArr;\r\n};\r\n\r\n\r\n// Will return name of the parent folder directly containing the file\r\n// e.g. from file with path \"A/B/C.jpg\", returns \"B\"\r\nexport const getFileFolderName = (file) => {\r\n const { webkitRelativePath } = file;\r\n const pathArr = _.map(webkitRelativePath.split('/'), name => name.trim());\r\n\r\n pathArr.pop();\r\n\r\n return pathArr.pop();\r\n};\r\n\r\n// Filters out all files in the files array for files with supported\r\n// extension type (not handled by default by browser)\r\nexport const filterFilesByExtensions = ({ files, supportedExtensions }) => {\r\n const acceptedFiles = [];\r\n\r\n _.each(files, (file) => {\r\n const { ext } = parseFileName(file.name);\r\n if (ext && _.contains(supportedExtensions, ext)) {\r\n acceptedFiles.push(file);\r\n }\r\n });\r\n\r\n return acceptedFiles;\r\n};\r\n\r\n// For a list of files, will return a map of the folder hierarchy\r\n// where an empty object - {} - indicates that the folder is a leaf\r\n// node\r\n// e.g. for [\"A/B/C.jpg\", \"A/D/E.jpg\", \"A/F.png\"] will return\r\n// { A: { B: { C: {} }, D: { E: {} } } }\r\nexport const createFolderHierarchyMap = (files) => {\r\n const foldersToCreate = {};\r\n\r\n _.each(files, ({ webkitRelativePath }) => {\r\n const folders = getRelativeFoldersFromRelativePath(webkitRelativePath);\r\n let currFolderMap = foldersToCreate;\r\n\r\n _.each(folders, (folder) => {\r\n if (!currFolderMap[folder]) {\r\n currFolderMap[folder] = {};\r\n }\r\n currFolderMap = currFolderMap[folder];\r\n });\r\n });\r\n\r\n return foldersToCreate;\r\n};\r\n\r\nconst createFolderWithErrorHandling = ({\r\n folderCreationErrors,\r\n createFolderAsync,\r\n folderName,\r\n parentFolderId,\r\n currentFolderId,\r\n originalFolderName,\r\n numberOfAttempts = 1,\r\n}) => {\r\n return createFolderAsync({\r\n folderName,\r\n parentFolderId,\r\n })\r\n .catch((e) => {\r\n // for duplicate folder upload, rename as <original folder>-1\r\n if (parentFolderId === currentFolderId) {\r\n const errorCode = _.get(e, ['body', 'value', 0, 'Code'], null);\r\n\r\n if (errorCode === 'DuplicateEntity') {\r\n return createFolderWithErrorHandling({\r\n folderCreationErrors,\r\n createFolderAsync,\r\n folderName: `${originalFolderName}-${numberOfAttempts}`,\r\n parentFolderId,\r\n currentFolderId,\r\n originalFolderName,\r\n numberOfAttempts: numberOfAttempts + 1,\r\n });\r\n }\r\n }\r\n // allow other folder creation jobs to continue as we allow partial succeed\r\n folderCreationErrors.push(e);\r\n return INVALID_FOLDER_ID;\r\n });\r\n};\r\n\r\nconst createFoldersByHierarchyInternal = ({\r\n folderMap,\r\n createFolderAsync,\r\n creationPromises,\r\n parentFolderName,\r\n folderCreationErrors,\r\n currentFolderId,\r\n}) => {\r\n const folderNames = _.keys(folderMap);\r\n if (folderNames.length > 0) {\r\n _.each(folderNames, (folderName) => {\r\n const subFoldersMap = folderMap[folderName];\r\n const parentPromise = parentFolderName ? creationPromises[parentFolderName] : Promise.resolve(currentFolderId);\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n creationPromises[folderName] = parentPromise.then((parentFolderId) => {\r\n // if parent folder failed to be created, skip trying to create child folder\r\n if (parentFolderId === INVALID_FOLDER_ID) {\r\n return INVALID_FOLDER_ID;\r\n }\r\n\r\n return createFolderWithErrorHandling({\r\n folderCreationErrors,\r\n createFolderAsync,\r\n folderName,\r\n parentFolderId,\r\n currentFolderId,\r\n originalFolderName: folderName,\r\n });\r\n });\r\n\r\n createFoldersByHierarchyInternal({\r\n folderMap: subFoldersMap,\r\n createFolderAsync,\r\n creationPromises,\r\n parentFolderName: folderName,\r\n folderCreationErrors,\r\n });\r\n });\r\n }\r\n};\r\n\r\n// For a given folderMap (in the format created by createFolderHierarchyMap)\r\n// Will create folders using the provided method in the correct sequence\r\n// e.g. if for file \"A/B/C.jpg\", createFolderHierarchyMap will generate map\r\n// { A: { B: {} } }, createFoldersByHierarchy will create folders in this order:\r\n// create folder A with parentId = null (null used for root in MT)\r\n// create folder B with parentId = folder A's Id\r\nexport const createFoldersByHierarchy = ({\r\n folderMap,\r\n createFolderAsync,\r\n folderCreationErrors = [],\r\n currentFolderId,\r\n}) => {\r\n const creationPromises = {};\r\n\r\n createFoldersByHierarchyInternal({\r\n folderMap,\r\n createFolderAsync,\r\n creationPromises,\r\n folderCreationErrors,\r\n parentFolderName: null,\r\n currentFolderId,\r\n });\r\n\r\n return Promise.all(_.values(creationPromises))\r\n .then(() => creationPromises);\r\n};\r\n\r\n// Creates a promise which will ensure all assets are uploaded\r\n// in a rate limited manner, in which we will send AddAsset requests\r\n// one by one with a maximum of 6 parallel requests at a time\r\nexport const createRateLimitedAssetUploadPromises = ({\r\n customizedFilesOptions = [],\r\n acceptedAssets,\r\n folderIdPromises,\r\n validateAssetAsync = () => Promise.resolve(true),\r\n uploadAssetAsync,\r\n assetsSkippedUpload = [],\r\n assetUploadErrors = [],\r\n readAssetAsync,\r\n}) => {\r\n const processAssetJobPromises = [];\r\n const assetUploadJobs = [];\r\n\r\n _.each(acceptedAssets, (asset, index) => {\r\n const folderName = getFileFolderName(asset);\r\n const extraOptions = customizedFilesOptions[index] || {};\r\n\r\n const processAssetJobPromise = folderIdPromises[folderName].then((folderId) => {\r\n if (folderId === INVALID_FOLDER_ID) {\r\n assetsSkippedUpload.push(asset);\r\n return Promise.resolve();\r\n }\r\n\r\n return readAssetAsync(asset, extraOptions)\r\n .then((dataURL) => {\r\n const assetUploadJob = () => {\r\n return validateAssetAsync({\r\n dataURL,\r\n ...extraOptions,\r\n })\r\n .then((validatedResult) => {\r\n const isImageUpscaled = _.get(validatedResult, 'isImageUpscaled', false);\r\n const { nameWithoutExt } = parseFileName(asset.name);\r\n\r\n return uploadAssetAsync({\r\n dataURL,\r\n fileObject: asset,\r\n nameWithoutExt,\r\n folderId,\r\n isImageUpscaled,\r\n ...extraOptions,\r\n });\r\n });\r\n };\r\n assetUploadJobs.push(assetUploadJob);\r\n })\r\n .catch((e) => {\r\n assetUploadErrors.push(e);\r\n });\r\n });\r\n\r\n processAssetJobPromises.push(processAssetJobPromise);\r\n });\r\n\r\n return Promise.all(processAssetJobPromises).then(() => {\r\n return runJobsInParallelWithRateLimit({\r\n jobsToRateLimit: assetUploadJobs,\r\n maxJobsInParallel: UPLOAD_PARALLEL_RATE_LIMIT,\r\n handleJobError: e => assetUploadErrors.push(e),\r\n });\r\n });\r\n};\r\n","import { fetchResultFromProcessors } from './processor-util';\r\nimport { processFolderSizeLimitError } from './upload-asset-limit-error';\r\nimport { getAssetUploadError } from './upload-asset-error';\r\n\r\nconst processFolderSizeLimitErrors = ({\r\n folderCreationErrors, aid, logger, i18n,\r\n}) => {\r\n const folderLimitResult = processFolderSizeLimitError({ errorList: folderCreationErrors, aid, logger });\r\n if (folderLimitResult) {\r\n const { limit: folderLimit } = folderLimitResult;\r\n const warnMessage = _TL_('Failed to create one or more folders because your account has exceeded the {{value}}-folder limit. Please remove folders and try again.');\r\n\r\n return i18n.getString(warnMessage, { value: folderLimit });\r\n }\r\n\r\n return '';\r\n};\r\n\r\nconst processAssetErrors = ({\r\n assetUploadErrors, i18n, filePickerI18n, aid, logger,\r\n}) => getAssetUploadError({\r\n uploadErrorCodeArr: assetUploadErrors,\r\n i18n,\r\n filePickerI18n,\r\n aid,\r\n logger,\r\n disableGenericMessage: true,\r\n});\r\n\r\nexport const getFolderUploadError = ({\r\n folderCreationErrors,\r\n assetUploadErrors,\r\n i18n,\r\n filePickerI18n,\r\n aid,\r\n logger,\r\n}) => {\r\n const result = fetchResultFromProcessors({\r\n processors: [\r\n processFolderSizeLimitErrors,\r\n processAssetErrors,\r\n ],\r\n options: {\r\n folderCreationErrors,\r\n assetUploadErrors,\r\n i18n,\r\n filePickerI18n,\r\n aid,\r\n logger,\r\n },\r\n });\r\n\r\n if (result) {\r\n return result;\r\n }\r\n\r\n let genericErrorMessage;\r\n if (folderCreationErrors.length > 0) {\r\n if (assetUploadErrors.length > 0) {\r\n genericErrorMessage = _TL_('One or more folders or assets within folders failed to upload.');\r\n } else {\r\n genericErrorMessage = _TL_('One or more folders failed to upload.');\r\n }\r\n } else {\r\n genericErrorMessage = _TL_('One or more assets within your folders failed to upload.');\r\n }\r\n\r\n return i18n.getString(genericErrorMessage);\r\n};\r\n","import Promise from 'bluebird';\r\n\r\nexport const getTaskPoller = ({\r\n task, // func returns a promise which resolves to a value { isFinished }\r\n interval = 30000, // in milli-seconds\r\n}) => {\r\n let timerId;\r\n let stopRunning = false;\r\n let counter = 0;\r\n let taskPromise = null;\r\n\r\n const start = () => {\r\n if (taskPromise) {\r\n return taskPromise;\r\n }\r\n\r\n taskPromise = new Promise((resolve, reject) => {\r\n // run task immediately once\r\n counter = 1;\r\n task().then((result) => {\r\n const { isFinished } = result || {};\r\n if (!isFinished && !stopRunning) {\r\n timerId = setInterval(() => {\r\n if (!stopRunning) {\r\n counter += 1;\r\n task().then(({ isFinished: isDone }) => {\r\n if (isDone) {\r\n clearInterval(timerId);\r\n timerId = undefined;\r\n resolve(counter);\r\n }\r\n }).catch((err) => {\r\n clearInterval(timerId);\r\n timerId = undefined;\r\n reject(err);\r\n });\r\n } else {\r\n if (timerId) {\r\n clearInterval(timerId);\r\n timerId = undefined;\r\n }\r\n resolve(counter);\r\n }\r\n }, interval);\r\n } else {\r\n resolve(counter);\r\n }\r\n }).catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n\r\n return taskPromise;\r\n };\r\n\r\n const stop = () => {\r\n stopRunning = true;\r\n return taskPromise;\r\n };\r\n\r\n return { start, stop };\r\n};\r\n","import _ from 'underscore';\r\nimport { useCallback, useReducer } from 'react';\r\n\r\nconst existDup = (arr, newArr, itemKey) => {\r\n const keys = _.pluck(arr, itemKey);\r\n const newKeys = _.pluck(newArr, itemKey);\r\n\r\n return _.intersection(keys, newKeys).length > 0;\r\n};\r\n\r\nconst ACTION_TYPE_SET_FOLDER_DATA = 100;\r\nconst ACTION_TYPE_SET_PERF_TIME_SERIES = 200;\r\nconst ACTION_TYPE_RESET_DATA = 300;\r\n\r\nconst AL_FOLDER_REDUCER_INIT_STATE = {\r\n folders: null,\r\n assets: null,\r\n perfTimeSeriesData: null,\r\n};\r\n\r\n/*\r\n state:{\r\n // null - not yet initialized\r\n // [] - no folders\r\n folders: [\r\n {\r\n folderId: id of folder,\r\n folderName: name of folder,\r\n parentFolderId: id of parent folder, if parent is root\r\n parentHierarchy: [],\r\n assets: [],\r\n subfolders: [],\r\n itemCount: {\r\n ImageAssetsCount,\r\n LogoAssetsCount,\r\n SubFoldersCount,\r\n TextAssetsCount,\r\n VideoAssetsCount,\r\n TotalCount,\r\n },\r\n createdTime: time folder was created\r\n modifiedTime: last time folder was modified\r\n }\r\n ],\r\n assets: [\r\n {\r\n id, // \"1234\"\r\n name,\r\n folderAssetType, // \"Image\"\r\n url,\r\n originalUrl,\r\n sourceType, // \"UserUploaded\",\r\n type, // \"GenericImage\",\r\n height,\r\n width,\r\n originalHeight,\r\n originalWidth,\r\n cropSettings,\r\n cropSettingOnOriginal,\r\n placementSettings: [\r\n ],\r\n createdTime,\r\n modifiedTime,\r\n\r\n // !! Performance metrics, new for V4\r\n usedByCount: 10, // ads count?\r\n performanceLabel, // \"Best\", \"Good\", \"Low\",\r\n // # performanceMetrics\r\n impressions,\r\n clicks,\r\n CTR,\r\n spend,\r\n // # performanceMetricsChange\r\n impressionsChange,\r\n clicksChange,\r\n CTRChange,\r\n spendChange,\r\n // # performanceMetricsChangePercentage\r\n impressionsChangePercentage,\r\n clicksChangePercentage,\r\n CTRChangePercentage,\r\n spendChangePercentage,\r\n // # periodPerformanceMetrics\r\n periodImpressions,\r\n periodClicks,\r\n periodCTR,\r\n periodSpend,\r\n }\r\n ],\r\n perfTimeSeriesData: [ // one entry for each selected metric, at most 2 selected metrics on UI chart currently\r\n {\r\n metricName: \"Impressions\",\r\n uniqueId: 'a guid',\r\n primaryDataPoints: [\r\n {\r\n datetime: \"2023-06-12T00:00:00\",\r\n value: 400,\r\n },\r\n ...\r\n ],\r\n comparisonDataPoints: [ // empty if POP is disabled\r\n {\r\n datetime: \"2023-06-12T00:00:00\",\r\n value: 600,\r\n },\r\n ...\r\n ],\r\n },\r\n ],\r\n\r\n // mark where the data are loaded\r\n pageName: AdsStudioPageName.LibraryPage/AdsStudioPageName.PerfPage/undefined\r\n }\r\n*/\r\nconst folderDataStateReducer = (state, action) => {\r\n const { type: actionType, ...actionData } = action;\r\n switch (actionType) {\r\n case ACTION_TYPE_SET_FOLDER_DATA:\r\n {\r\n const {\r\n newFolders = [], newAssets = [], newPerfTimeSeries = [], shouldFlush, logger, pageName,\r\n } = actionData;\r\n\r\n if (shouldFlush) {\r\n return {\r\n ...state, folders: newFolders, assets: newAssets, perfTimeSeriesData: newPerfTimeSeries, pageName,\r\n };\r\n }\r\n\r\n // todo: investigate why there are duliacted folders and assets\r\n const foundFolderDup = existDup(state.folders, newFolders, 'folderId');\r\n const foundAssetDup = existDup(state.assets, newAssets, 'id');\r\n if (foundFolderDup) {\r\n logger.logTrace('Unexpected duplicate folders found in folderDataStateReducer');\r\n }\r\n if (foundAssetDup) {\r\n logger.logTrace('Unexpected duplicate assets found in folderDataStateReducer');\r\n }\r\n if (foundFolderDup || foundAssetDup) {\r\n // if found duplicate, which should not happen, don't update the state\r\n return state;\r\n }\r\n\r\n // todo: don't update time series data if shouldFlush is false, is that expected? confirm with MT\r\n return {\r\n ...state,\r\n folders: [...(state.folders || []), ...newFolders],\r\n assets: [...(state.assets || []), ...newAssets],\r\n };\r\n }\r\n case ACTION_TYPE_SET_PERF_TIME_SERIES:\r\n {\r\n const { newPerfTimeSeries } = actionData;\r\n return { ...state, perfTimeSeriesData: newPerfTimeSeries };\r\n }\r\n case ACTION_TYPE_RESET_DATA:\r\n {\r\n return AL_FOLDER_REDUCER_INIT_STATE;\r\n }\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport const useDataServiceReducer = (logger, initState = AL_FOLDER_REDUCER_INIT_STATE) => {\r\n const [folderData, dispatch] = useReducer(folderDataStateReducer, initState);\r\n\r\n const setFolderData = useCallback(({\r\n newAssets, newFolders, newPerfTimeSeries,\r\n }, pageName) => {\r\n dispatch({\r\n type: ACTION_TYPE_SET_FOLDER_DATA,\r\n newAssets,\r\n newFolders,\r\n newPerfTimeSeries,\r\n pageName,\r\n shouldFlush: true,\r\n logger,\r\n });\r\n }, [logger]);\r\n\r\n // replace assets only, and keep other data unchanged\r\n const setAssetsOnly = useCallback((newAssets) => {\r\n dispatch({\r\n type: ACTION_TYPE_SET_FOLDER_DATA,\r\n newAssets,\r\n newFolders: folderData.folders,\r\n newPerfTimeSeries: folderData.perfTimeSeriesData,\r\n pageName: folderData.pageName,\r\n shouldFlush: true,\r\n logger,\r\n });\r\n }, [folderData.pageName, folderData.folders, folderData.perfTimeSeriesData, logger]);\r\n\r\n const appendFolderData = useCallback(({ newAssets, newFolders }) => {\r\n dispatch({\r\n type: ACTION_TYPE_SET_FOLDER_DATA,\r\n newAssets,\r\n newFolders,\r\n shouldFlush: false,\r\n logger,\r\n });\r\n }, [logger]);\r\n\r\n const setPerfTimeSeriesData = useCallback(({ newPerfTimeSeries }) => {\r\n dispatch({\r\n type: ACTION_TYPE_SET_PERF_TIME_SERIES,\r\n newPerfTimeSeries,\r\n logger,\r\n });\r\n }, [logger]);\r\n\r\n const resetFolderData = useCallback(() => {\r\n dispatch({ type: ACTION_TYPE_RESET_DATA });\r\n }, []);\r\n\r\n return {\r\n folderData,\r\n setFolderData,\r\n setAssetsOnly,\r\n appendFolderData,\r\n setPerfTimeSeriesData,\r\n resetFolderData,\r\n };\r\n};\r\n","import _ from 'underscore';\r\n\r\nexport class AdsStudioErrorBase extends Error {\r\n constructor({\r\n message,\r\n originError,\r\n errorCode,\r\n errorProcessor, // use processor to extend the error object with anything needed\r\n ...rest // additional data passed to processor\r\n }) {\r\n super(message);\r\n this.originError = originError;\r\n this.errorCode = errorCode || (originError && originError.errorCode) || 'Unknown';\r\n if (errorProcessor) {\r\n const params = { message, errorCode, ...rest };\r\n const info = errorProcessor(this.errorCode, params);\r\n _.extendOwn(this, info);\r\n }\r\n }\r\n}\r\n","import { FolderAssetType } from '../model';\r\n\r\n// use processors to append any info to AdsStudioODataError instance based on errorCode,\r\n// for example:\r\n// uxMessage: message to show on UI\r\n// actionable: if use could correct this error\r\n// getUXMessage(): function to get message shown on UI, but could pass in additiona parameters\r\n// ...\r\n\r\nexport const renameFolderApiErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n InvalidFolderId: {\r\n uxMessage: _TL_(\"This folder doesn't exist because you may have already deleted it. Please refresh the page to confirm.\"),\r\n actionable: false,\r\n },\r\n DuplicateFolderName: {\r\n uxMessage: _TL_('This folder name already exists. Please enter another one.'),\r\n actionable: true,\r\n },\r\n InvalidFolderName: {\r\n uxMessage: _TL_(\"You've entered one or more invalid characters in the fields. Please correct them and try again.\"),\r\n actionable: true,\r\n },\r\n genericError: {\r\n uxMessage: _TL_(\"Your folder couldn't be renamed. Please refresh the page and try again.\"),\r\n actionable: false,\r\n },\r\n };\r\n\r\n // actionable:\r\n // true - ask user to do correct the error\r\n // false - user can't do any action, just show notification\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const deleteFolderApiErrorProcessor = (errorCode /* {folderId, folderName} */) => {\r\n const msgs = {\r\n InvalidFolderId: {\r\n uxMessage: _TL_(\"This folder doesn't exist because you may have already deleted it. Please refresh the page to confirm.\"),\r\n ignorable: true,\r\n shortMsg: _TL_('Error'),\r\n },\r\n\r\n FolderHasAssets: {\r\n uxMessage: _TL_(\"Your folder couldn't be deleted because it contains assets or subfolders. Please remove these and try again.\"),\r\n shortMsg: _TL_(\"Folder isn't empty\"),\r\n ignorable: true,\r\n },\r\n\r\n genericError: {\r\n uxMessage: _TL_(\"Your folder couldn't be deleted. Please refresh the page and try again.\"),\r\n shortMsg: _TL_('Error'),\r\n },\r\n };\r\n msgs.InvalidId = msgs.InvalidFolderId;\r\n msgs.FolderHasSubFolders = msgs.FolderHasAssets;\r\n\r\n // actionable:\r\n // true - ask user to do correct the error\r\n // false - user can't do any action, just show notification\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const bulkMoveApiErrorProcessor = (errorCode, { folderCount, assetCount }) => {\r\n const msgs = {\r\n // DestFolderId is invalid\r\n InvalidFolderId: {\r\n getUXMessage: i18n => i18n.getString(\r\n _TL_(\"({{folderCount}} folders, {{assetCount}} assets)) couldn't be moved because you may have already deleted the folder. Please refresh the page and try a different folder.\"),\r\n { folderCount, assetCount }\r\n ),\r\n actionable: false,\r\n },\r\n\r\n genericError: {\r\n getUXMessage: i18n => i18n.getString(\r\n _TL_(\"({{folderCount}} folders, {{assetCount}} assets) couldn't be moved. Please refresh the page and try again.\"),\r\n { folderCount, assetCount }\r\n ),\r\n },\r\n };\r\n\r\n // actionable:\r\n // true - ask user to do correct the error\r\n // false - user can't do any action, just show notification\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\n// error for a specific item in the batch response\r\nexport const bulkMoveApiItemErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n InvalidFolderId: {\r\n uxMessage: _TL_(\"This folder doesn't exist because you may have already deleted it. Please refresh the page to confirm.\"),\r\n shortMsg: _TL_(\"Folder doesn't exist\"),\r\n availableActions: {},\r\n },\r\n AssetIdInvalid: {\r\n uxMessage: _TL_(\"This asset doesn't exist because you may have already deleted it. Please refresh the page to confirm.\"),\r\n shortMsg: _TL_(\"Asset doesn't exist\"),\r\n availableActions: {},\r\n },\r\n DuplicateAssetsUnderFolder: {\r\n uxMessage: _TL_('Your asset already exists in the folder. Please note that you can add the same asset to different folders, but you cannot have duplicate assets in the same folder.'),\r\n shortMsg: _TL_('Duplicate asset'),\r\n availableActions: {},\r\n },\r\n DuplicateImage: {\r\n uxMessage: _TL_('Your image already exists in the folder. Please note that you can add the same image to different folders, but you cannot have duplicate images in the same folder.'),\r\n shortMsg: _TL_('Duplicate image'),\r\n availableActions: {},\r\n },\r\n DuplicateFolderName: {\r\n uxMessage: _TL_('You cannot have duplicate subfolder names in the same folder. Please rename your subfolder and try again.'),\r\n shortMsg: _TL_('Duplicate subfolder name'),\r\n availableActions: {},\r\n },\r\n FolderCanNotMoveToTarget: {\r\n uxMessage: _TL_('You cannot move a folder into itself or one of its subfolders. Please select a different folder and try again.'),\r\n shortMsg: _TL_('Wrong target folder'),\r\n availableActions: {},\r\n },\r\n\r\n genericError: {\r\n uxMessage: _TL_(\"Your assets couldn't be moved. Please refresh the page and try again.\"),\r\n shortMsg: _TL_('Error'),\r\n availableActions: {},\r\n },\r\n };\r\n\r\n // actionable:\r\n // true - ask user to do correct the error\r\n // false - user can't do any action, just show notification\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const deleteAssetApiErrorProcessor = (errorCode, { assetType }) => {\r\n const msgs = {\r\n AssetIsUsed: {\r\n uxMessage: assetType === FolderAssetType.Video\r\n ? _TL_(\"You can't delete this video because it's being used by other campaigns, ads, or video extensions.\")\r\n : _TL_(\"You can't delete this image because it's being used by other campaigns, ads, or image extensions.\"),\r\n availableActions: {\r\n gotoAds: true,\r\n // others: true,\r\n },\r\n },\r\n // ImageAdExtensionPilotNotEnabledForCustomer\r\n // AssetDoesNotBelongToAccount\r\n // AssetIdInvalid\r\n // AssetIsAlreadyDeleted\r\n // CamAssetCannotBeDeleted --Asset of this Type ( CAM ) can not be deleted\r\n genericError: {\r\n uxMessage: _TL_('Failed to delete image. Please try again or contact support.'),\r\n availableActions: {},\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const createFolderApiErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n DuplicateEntity: {\r\n getUXMessage: i18n => i18n.getString(_TL_('This folder name already exists. Please enter another one.')),\r\n actionable: true,\r\n },\r\n InvalidFolderName: {\r\n getUXMessage: i18n => i18n.getString(_TL_(\"You've entered one or more invalid characters in the fields. Please correct them and try again.\")),\r\n actionable: true,\r\n },\r\n FolderLimitExceededPerAccount: {\r\n getUXMessage: (i18n, getFolderLimit) => (i18n.getString(_TL_('Failed to create one or more folders because your account has exceeded the {{value}}-folder limit. Please remove folders and try again.'), getFolderLimit())\r\n ),\r\n actionable: false,\r\n },\r\n genericError: {\r\n getUXMessage: i18n => i18n.getString(_TL_('Failed to create folder. Please try again.')),\r\n actionable: false,\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\n// ## rename asset\r\n// AssetIsNull\r\n// AssetDoesNotBelongToAccount\r\n// AssetIsAlreadyDeleted\r\n\r\n//\r\n// ## bulk delete asset\r\nexport const bulkDeleteAssetsApiItemErrorProcessor = (errorCode, { assetType }) => {\r\n const msgs = {\r\n // AssetIdInvalid\r\n // AssetIsAlreadyDeleted\r\n CampaignServiceMediaIdInvalid: {\r\n uxMessage: _TL_(\"This asset doesn't exist because you may have already deleted it. Please refresh the page to confirm.\"),\r\n shortMsg: _TL_(\"Asset doesn't exist\"),\r\n availableActions: {},\r\n },\r\n // // AssetDoesNotBelongToAccount\r\n // CampaignServiceMediaNotFoundInAccount: {\r\n // uxMessage: _TL_('Asset does not belong to account'),\r\n // availableActions: {},\r\n // },\r\n // // CamAssetCannotBeDeleted\r\n // CampaignServiceMediaTypeInvalidForOperation: {\r\n // uxMessage: _TL_('Asset of this Type ( CAM ) cannot be deleted'),\r\n // availableActions: {},\r\n // },\r\n // AssetIsUsed\r\n CampaignServiceMediaIsAssociated: {\r\n uxMessage: assetType === FolderAssetType.Video\r\n ? _TL_(\"You can't delete this video because it's being used by other campaigns, ads, or video extensions. Delete these associations and try again.\")\r\n : _TL_(\"You can't delete this image because it's being used by other campaigns, ads, or image extensions. Delete these associations and try again.\"),\r\n shortMsg: _TL_('Asset is currently in use '),\r\n availableActions: {\r\n gotoAds: true,\r\n // others: true,\r\n },\r\n },\r\n // // AccountIdInvalid\r\n // CampaignServiceInvalidAccountId: {\r\n // uxMessage: _TL_('account id is invalid'),\r\n // availableActions: {},\r\n // },\r\n // // DuplicateId\r\n // DuplicateId: {\r\n // uxMessage: _TL_('There are dulpicate ids from input'),\r\n // availableActions: {},\r\n // },\r\n genericError: {\r\n uxMessage: _TL_(\"Your assets couldn't be deleted. Please refresh the page and try again.\"),\r\n shortMsg: _TL_('Error'),\r\n availableActions: {},\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const bulkDeleteAssetsApiErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n genericError: {\r\n uxMessage: _TL_(\"Your assets couldn't be deleted. Please refresh the page and try again.\"),\r\n shortMsg: _TL_('Error'),\r\n availableActions: {},\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const generateImagesWithAIAPIErrorProcessor = (errorCode, params) => {\r\n const reqCountErr = _TL_(\"Sorry, our servers are busy and we're unable to process your request. We're working to resolve this issue. Please try again later.\");\r\n\r\n const msgs = {\r\n GenerateImagesPromptLengthInvalid: {\r\n uxMessage: _TL_('Your image description is either too long or too short. 256 characters maximum.'),\r\n },\r\n GenerateImagesRequestCountLimitExceededPerAccount: {\r\n uxMessage: reqCountErr,\r\n },\r\n GenerateImagesRequestCountLimitExceeded: {\r\n uxMessage: reqCountErr,\r\n },\r\n GenerateImagesPromptContentInvalid: { // when AIGC told MT the input prompt is invalid\r\n uxMessage: _TL_('Something went wrong with your request and we\\'re unable to process it at this time.'),\r\n },\r\n\r\n // use general message for this one\r\n // GenerateImagesAIGCNoRecommendation: when AIGC failed to create task, failed to generate image, but it does not specify the reason.\r\n\r\n GenerateImagesAIGCNoRecommendationWithBrand: {\r\n brandNameDetected: true,\r\n brandNames: (params && params.errorMessage) || '',\r\n },\r\n\r\n genericError: {\r\n uxMessage: _TL_('We\\'ve encountered an error and failed to generate images.'),\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\nexport const getAIGeneratedImageAPIErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n AI_Generation_Failed: {\r\n shouldRetry: false,\r\n uxMessage: _TL_('Something went wrong with your request and we\\'re unable to process it at this time. We apologize for the inconvenience. Please try again later.'),\r\n },\r\n genericError: {\r\n shouldRetry: true,\r\n uxMessage: _TL_('We\\'ve encountered an error and failed to generate images.'),\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n\r\n// todo: handle error codes returned from MT (what error codes are returned from MT?)\r\n// todo: scrub error message text\r\nexport const getRemoveImageBackgroundAPIErrorProcessor = (errorCode) => {\r\n const msgs = {\r\n GenerateImagesAIGCInvalidImageSize: {\r\n uxMessage: _TL_('We’re unable to generate the image because the image size does not meet the minimum required dimensions.'),\r\n },\r\n GenerateImagesAIGCInvalidImageContent: {\r\n uxMessage: _TL_('We’re unable to generate the image because the image you provided may violate our policies and guidelines. To learn more, see '),\r\n availableActions: {\r\n gotoDisallowedContent: true,\r\n },\r\n },\r\n GenerateImageAIGCInvalidUserPrompt: {\r\n uxMessage: _TL_('We’re unable to generate the image because the prompt you provided may violate our policies and guidelines. To learn more, see '),\r\n availableActions: {\r\n gotoDisallowedContent: true,\r\n },\r\n },\r\n GenerateImageAIGCInvalidGeneratedImage: {\r\n uxMessage: _TL_('We’re unable to generate the image because it may violate our policies and guidelines. To learn more, see '),\r\n availableActions: {\r\n gotoDisallowedContent: true,\r\n },\r\n },\r\n genericError: {\r\n shouldRetry: true,\r\n uxMessage: _TL_('We’ve encountered an error removing the image’s background. Please try again.'),\r\n },\r\n };\r\n return msgs[errorCode] || msgs.genericError;\r\n};\r\n","/* istanbul ignore file */\r\n// ut tests of use-folders are covered in CMUI level\r\n/* eslint-disable arrow-body-style */\r\nimport Promise from 'bluebird';\r\nimport _ from 'underscore';\r\nimport { useCallback, useMemo, useRef, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport {\r\n ROOT_FOLDER_ID,\r\n RootFolderName,\r\n DEFAULT_PAGE_SIZE,\r\n CSMLSortBy,\r\n FolderAssetType,\r\n} from '../../model';\r\nimport { civilDateRangeToDebugString } from '../../utils';\r\nimport { useDataServiceReducer } from './folder-reducer';\r\nimport { AdsStudioErrorBase, deleteFolderApiErrorProcessor } from '../../error-handling';\r\n\r\nconst PATH_SEPERATOR = ' > ';\r\n\r\nconst getPathString = (i18n, folderPath) => {\r\n // remove ROOT section from the string\r\n let pathString = folderPath.slice(1).map(fp => fp.folderName).join(PATH_SEPERATOR) || '';\r\n if (pathString) {\r\n pathString = `${PATH_SEPERATOR}${pathString}`;\r\n }\r\n pathString = `${i18n.getString(_TL_('Library'))}${pathString}`;\r\n return pathString;\r\n};\r\n\r\nexport const getAssetTypeToFetch = ({ filterSettings, defaultAssetType }) => {\r\n const { assetTypeFilter } = filterSettings || {};\r\n\r\n return assetTypeFilter || defaultAssetType;\r\n};\r\n\r\nexport const useFolders = ({\r\n perfMetricDateRange,\r\n defaultPerfMetricDateRange,\r\n repository,\r\n logger,\r\n assetType: defaultAssetType,\r\n i18n,\r\n}) => {\r\n const ROOT_FOLDER = {\r\n folderId: ROOT_FOLDER_ID,\r\n folderName: i18n.getString(RootFolderName[defaultAssetType] || _TL_('Library')),\r\n };\r\n\r\n const {\r\n folderData, setFolderData, setAssetsOnly: setAssets, appendFolderData, setPerfTimeSeriesData, resetFolderData,\r\n } = useDataServiceReducer(logger);\r\n\r\n const [newFolderId, setNewFolderId] = useState('');\r\n const totalItemCount = useRef({});\r\n\r\n // set current folder navigation path\r\n // ROOT_FOLDER will always be element 0 in the paths folder state\r\n // when navigating, folders get pushed onto path\r\n // so top most folder is the current folder\r\n const [folderPath, setFolderPath] = useState([ROOT_FOLDER]);\r\n const currentFolder = useMemo(() => folderPath[folderPath.length - 1], [folderPath]);\r\n const currentFolderId = useMemo(() => currentFolder.folderId, [currentFolder]);\r\n\r\n const latestRequestTimestamp = useRef(0);\r\n\r\n /*\r\n searchTerm,\r\n minWidth,\r\n minHeight,\r\n dateAddedStart,\r\n dateAddedEnd,\r\n importSource,\r\n assetSources,\r\n assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch,\r\n hasPerfData,\r\n topRated,\r\n */\r\n const curFilterSettings = useRef(null);\r\n\r\n const curSortBy = useRef(CSMLSortBy.MostRecent);\r\n const curAssetCountToLoadForSubFolders = useRef(1);\r\n const curFolderAssetTypeToLoad = useRef(defaultAssetType);\r\n const curIncludeParentHierarchy = useRef(false);\r\n const curIncludeSubfolders = useRef(true);\r\n const curPageName = useRef(undefined);\r\n const curPerfMarker = useRef(undefined);\r\n\r\n const pendingVideoBlobUploadPromiseTokens = useRef([]);\r\n\r\n const resetData = useCallback(() => {\r\n resetFolderData();\r\n curFilterSettings.current = null;\r\n curSortBy.current = CSMLSortBy.MostRecent;\r\n curAssetCountToLoadForSubFolders.current = 1;\r\n curFolderAssetTypeToLoad.current = defaultAssetType;\r\n curIncludeParentHierarchy.current = false;\r\n curIncludeSubfolders.current = true;\r\n curPageName.current = undefined;\r\n curPerfMarker.current = undefined;\r\n }, [defaultAssetType, resetFolderData]);\r\n\r\n const logTrace = useCallback((message, ...rest) => {\r\n logger.logTrace(`DataService: ${message}`, ...rest);\r\n }, [logger]);\r\n\r\n const loadFolderArgs = useCallback(({\r\n filterSettings,\r\n sortBy,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n }) => {\r\n const folderAssetTypeToFetch = getAssetTypeToFetch({\r\n filterSettings,\r\n defaultAssetType,\r\n });\r\n\r\n return repository.getFolderArgs({\r\n perfMetricDateRange,\r\n ...filterSettings,\r\n sortBy,\r\n skip: 0,\r\n count: count || DEFAULT_PAGE_SIZE,\r\n folderId: currentFolderId,\r\n assetType: folderAssetTypeToFetch,\r\n includeAssets: true,\r\n includeSubfolders: true,\r\n includeParentHierarchy,\r\n assetsToLoadForSubfolders,\r\n isAssetPickerScenario: defaultAssetType !== null,\r\n });\r\n }, [defaultAssetType, repository, perfMetricDateRange, currentFolderId]);\r\n\r\n const loadFolderDataInternal = useCallback(({\r\n hasDateRange,\r\n filterSettings,\r\n sortBy,\r\n folderId,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders = true,\r\n pageName,\r\n perfMarker,\r\n withBIData = false,\r\n }) => {\r\n const requestTimestamp = Date.now();\r\n const folderAssetTypeToFetch = getAssetTypeToFetch({\r\n filterSettings,\r\n defaultAssetType,\r\n });\r\n const saveCurrentFilters = () => {\r\n curSortBy.current = sortBy;\r\n curFilterSettings.current = filterSettings;\r\n curFolderAssetTypeToLoad.current = folderAssetTypeToFetch;\r\n curAssetCountToLoadForSubFolders.current = assetsToLoadForSubfolders;\r\n curIncludeParentHierarchy.current = includeParentHierarchy;\r\n curIncludeSubfolders.current = includeSubfolders;\r\n curPageName.current = pageName;\r\n curPerfMarker.current = perfMarker;\r\n };\r\n return repository.getFolderData({\r\n perfMetricDateRange: hasDateRange ? perfMetricDateRange : defaultPerfMetricDateRange,\r\n ...filterSettings,\r\n sortBy,\r\n skip: 0,\r\n count: count || DEFAULT_PAGE_SIZE,\r\n folderId,\r\n assetType: folderAssetTypeToFetch,\r\n includeAssets: true,\r\n includeSubfolders,\r\n includeParentHierarchy,\r\n assetsToLoadForSubfolders,\r\n isAssetPickerScenario: defaultAssetType !== null,\r\n withBIData,\r\n perfMarker,\r\n }).then((res) => {\r\n if (requestTimestamp >= latestRequestTimestamp.current) {\r\n const { folder } = res;\r\n const newFolders = folder.subfolders || [];\r\n const newAssets = folder.assets || [];\r\n const perfTimeSeriesData = folder.perfTimeSeriesData || [];\r\n\r\n totalItemCount.current = folder.itemCount;\r\n saveCurrentFilters();\r\n\r\n setFolderData({ newAssets, newFolders, newPerfTimeSeries: perfTimeSeriesData }, pageName);\r\n\r\n latestRequestTimestamp.current = requestTimestamp;\r\n\r\n const {\r\n searchTerm: searchText, dateAddedStart, dateAddedEnd, ...otherFilters\r\n } = filterSettings || {};\r\n logTrace('FolderDataService: loaded assets, folders', {\r\n ...otherFilters,\r\n searchText,\r\n dateAddedDateRange: (dateAddedStart != null && dateAddedEnd != null) ? civilDateRangeToDebugString({ start: dateAddedStart, end: dateAddedEnd }) : undefined,\r\n sortBy: curSortBy.current,\r\n skip: 0,\r\n count: DEFAULT_PAGE_SIZE,\r\n assetType: curFolderAssetTypeToLoad.current,\r\n hasDateRange,\r\n });\r\n } else {\r\n logTrace('DataService: load folders and assets through folder service, ignore other requests');\r\n }\r\n\r\n return res;\r\n }).tapCatch(() => {\r\n if (requestTimestamp > latestRequestTimestamp.current) {\r\n saveCurrentFilters();\r\n latestRequestTimestamp.current = requestTimestamp;\r\n }\r\n });\r\n }, [defaultAssetType, repository, perfMetricDateRange, defaultPerfMetricDateRange, setFolderData, logTrace]);\r\n\r\n const loadFolderData = useCallback(({\r\n filterSettings,\r\n sortBy,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders = true,\r\n pageName,\r\n perfMarker,\r\n }) => {\r\n return loadFolderDataInternal({\r\n hasDateRange: false,\r\n filterSettings,\r\n sortBy,\r\n folderId: currentFolderId,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders,\r\n pageName,\r\n perfMarker,\r\n });\r\n }, [loadFolderDataInternal, currentFolderId]);\r\n\r\n const loadFolderDataInDateRange = useCallback(({\r\n filterSettings,\r\n sortBy,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders = true,\r\n pageName,\r\n perfMarker,\r\n }) => loadFolderDataInternal({\r\n hasDateRange: true,\r\n filterSettings,\r\n sortBy,\r\n folderId: currentFolderId,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders,\r\n pageName,\r\n perfMarker,\r\n withBIData: true,\r\n }), [loadFolderDataInternal, currentFolderId]);\r\n\r\n const loadPerfTimeSeriesData = useCallback(({ perfTimeSeriesParams, filterSettings }) => {\r\n const ret = repository.getPerfTimeSeriesData({\r\n perfMetricDateRange,\r\n perfTimeSeriesParams,\r\n ...(filterSettings || {}),\r\n folderId: currentFolderId === ROOT_FOLDER_ID ? -1 : currentFolderId,\r\n }).then((res) => {\r\n const { perfTimeSeriesData } = res || {};\r\n setPerfTimeSeriesData({ newPerfTimeSeries: perfTimeSeriesData });\r\n logTrace('FolderDataService: loaded performance timeseries data');\r\n return perfTimeSeriesData;\r\n });\r\n return ret;\r\n }, [currentFolderId, logTrace, perfMetricDateRange, repository, setPerfTimeSeriesData]);\r\n\r\n const loadMoreFolderDataImpl = useCallback(({ hasDateRange, count = DEFAULT_PAGE_SIZE, withBIData = false }) => {\r\n const requestTimestamp = Date.now();\r\n\r\n const { folders, assets } = folderData;\r\n\r\n const skip = (folders ? folders.length : 0) + (assets ? assets.length : 0);\r\n\r\n // avoid error: Invalid $top, $skip Combination. $skip should be multiple of $top\r\n // this could happen if additional loadmore request (maybe caused by grid rerender) is sent after all items are aready loaded\r\n if (totalItemCount.current && skip >= totalItemCount.current.TotalCount) {\r\n logTrace('skip this request as all items are already loaded.', {\r\n skip, top: count, totalItemCount: totalItemCount.current.TotalCount, hasDateRange,\r\n });\r\n return Promise.resolve({});\r\n }\r\n if (count && skip % count) {\r\n logTrace('$skip is not multiple of $top', {\r\n skip, top: count, totalItemCount: totalItemCount.current.TotalCount, hasDateRange,\r\n });\r\n return Promise.resolve({});\r\n }\r\n\r\n return repository.getFolderData({\r\n perfMetricDateRange: hasDateRange ? perfMetricDateRange : defaultPerfMetricDateRange,\r\n ...curFilterSettings.current,\r\n sortBy: curSortBy.current,\r\n skip,\r\n folderId: currentFolderId,\r\n count: count || DEFAULT_PAGE_SIZE,\r\n assetType: curFolderAssetTypeToLoad.current,\r\n includeAssets: true,\r\n includeSubfolders: curIncludeSubfolders.current,\r\n includeParentHierarchy: curIncludeParentHierarchy.current,\r\n assetsToLoadForSubfolders: curAssetCountToLoadForSubFolders.current,\r\n isAssetPickerScenario: defaultAssetType !== null,\r\n withBIData,\r\n perfMarker: curPerfMarker.current,\r\n }).then((res) => {\r\n if (requestTimestamp >= latestRequestTimestamp.current) {\r\n const { folder } = res;\r\n const newFolders = folder.subfolders || [];\r\n const newAssets = folder.assets || [];\r\n\r\n latestRequestTimestamp.current = requestTimestamp;\r\n\r\n logTrace('DataService: loaded more folders and assets through folder service', {\r\n sortBy: curSortBy.current,\r\n skip,\r\n count,\r\n filterSettings: curFilterSettings.current,\r\n assetType: curFolderAssetTypeToLoad.current,\r\n hasDateRange,\r\n });\r\n\r\n appendFolderData({ newFolders, newAssets });\r\n } else {\r\n logTrace('DataService: load more data, ignore other requests');\r\n }\r\n\r\n return res;\r\n }).tapCatch(() => {\r\n logger.logError('Failed to load more data');\r\n });\r\n }, [folderData, repository, perfMetricDateRange, defaultPerfMetricDateRange, currentFolderId, defaultAssetType, logTrace, appendFolderData, logger]);\r\n\r\n const loadMoreFolderData = useCallback(({ count = DEFAULT_PAGE_SIZE }) => loadMoreFolderDataImpl({ hasDateRange: false, count }), [loadMoreFolderDataImpl]);\r\n const loadMoreFolderDataInDateRange = useCallback(({ count = DEFAULT_PAGE_SIZE }) => loadMoreFolderDataImpl({ hasDateRange: true, count, withBIData: true }), [loadMoreFolderDataImpl]);\r\n\r\n const reloadFolders = useCallback(({ count } = {}) => loadFolderDataInternal({\r\n hasDateRange: false,\r\n filterSettings: curFilterSettings.current,\r\n folderId: currentFolderId,\r\n sortBy: curSortBy.current,\r\n assetsToLoadForSubfolders: curAssetCountToLoadForSubFolders.current,\r\n includeParentHierarchy: curIncludeParentHierarchy.current,\r\n includeSubfolders: curIncludeSubfolders.current,\r\n count,\r\n pageName: curPageName.current,\r\n perfMarker: curPerfMarker.current,\r\n }), [loadFolderDataInternal, currentFolderId]);\r\n\r\n const reloadFoldersInDateRange = useCallback(({ count } = {}) => loadFolderDataInternal({\r\n hasDateRange: true,\r\n filterSettings: curFilterSettings.current,\r\n folderId: currentFolderId,\r\n sortBy: curSortBy.current,\r\n assetsToLoadForSubfolders: curAssetCountToLoadForSubFolders.current,\r\n includeParentHierarchy: curIncludeParentHierarchy.current,\r\n includeSubfolders: curIncludeSubfolders.current,\r\n count,\r\n pageName: curPageName.current,\r\n perfMarker: curPerfMarker.current,\r\n }), [loadFolderDataInternal, currentFolderId]);\r\n\r\n // use method to navigate into a folder that's a child of the current folder\r\n // i.e. user clicking a folder that's displayed in the folder grid\r\n const navigateIntoFolder = useCallback(({ id = '', navigateToNewFolder = false }) => {\r\n let folderToNavigate;\r\n\r\n const { folders } = folderData;\r\n\r\n if (navigateToNewFolder && !id && newFolderId) {\r\n folderToNavigate = _.find(folders, ({ folderId }) => folderId === newFolderId);\r\n } else if (id) {\r\n folderToNavigate = _.find(folders, ({ folderId }) => folderId === id);\r\n }\r\n\r\n const { parentHierarchy } = folderToNavigate;\r\n if (parentHierarchy && parentHierarchy.length > 0) {\r\n setFolderPath([ROOT_FOLDER, ...parentHierarchy]);\r\n } else {\r\n setFolderPath(curFolderPath => [\r\n ...curFolderPath,\r\n folderToNavigate,\r\n ]);\r\n }\r\n setNewFolderId('');\r\n }, [ROOT_FOLDER, folderData, newFolderId]);\r\n\r\n // use method to navigate to a folder in current path\r\n // i.e. user clicking a parent folder that's displayed in the summary bar\r\n const navigateToFolderInPath = useCallback(({ id }) => {\r\n setFolderPath((curFolderPath) => {\r\n const indexOfFolderInPath = _.findIndex(curFolderPath, ({ folderId }) => folderId === id);\r\n return curFolderPath.slice(0, indexOfFolderInPath + 1);\r\n });\r\n setNewFolderId('');\r\n }, [setFolderPath]);\r\n\r\n // use method to navigate into a folder in navigation tree\r\n // i.e. user clicking a folder in the navigation tree or in recent of home page\r\n const navigateIntoFolderItem = useCallback(({ folder }) => {\r\n const { parentHierarchy = [] } = folder;\r\n setFolderPath([ROOT_FOLDER, ...parentHierarchy]);\r\n }, [ROOT_FOLDER]);\r\n\r\n const navigateIntoRootFolder = useCallback(() => {\r\n setFolderPath([ROOT_FOLDER]);\r\n }, [ROOT_FOLDER]);\r\n\r\n const createFolder = useCallback(({ folderName }) => {\r\n return repository.createFolder({ folderName, parentFolderId: currentFolderId });\r\n }, [repository, currentFolderId]);\r\n\r\n const createFolderBulk = useCallback(({ folderName, parentFolderId }) => {\r\n return repository.createFolder({ folderName, parentFolderId });\r\n }, [repository]);\r\n\r\n const deleteEmptyFolder = useCallback(({ folderId, folderName }) => {\r\n return repository.deleteFolder({ folderId, folderName });\r\n }, [repository]);\r\n\r\n const renameFolder = useCallback(({ folderId, newFolderName }) => {\r\n return repository.renameFolder({ folderId, newFolderName });\r\n }, [repository]);\r\n\r\n const uploadImageByUrlToFolder = useCallback(({\r\n imageUrl,\r\n folderId,\r\n sourceType,\r\n }) => {\r\n return repository.addUrlImageToFolder({\r\n imageSrc: imageUrl,\r\n folderId: folderId || currentFolderId,\r\n sourceType,\r\n });\r\n }, [repository, currentFolderId]);\r\n\r\n const addImageWithBaseIdToFolder = useCallback(({\r\n folderId,\r\n imageSrc,\r\n metaData,\r\n baseId,\r\n sourceType,\r\n }) => {\r\n return repository.addImageWithBaseIdToFolder({\r\n folderId: folderId || currentFolderId,\r\n imageSrc,\r\n metaData,\r\n baseId,\r\n sourceType,\r\n });\r\n }, [currentFolderId, repository]);\r\n\r\n const uploadVideoToAzureBlob = useCallback(({\r\n fileObject,\r\n onProgress,\r\n }) => {\r\n const promise = new Promise((resolve, reject) => {\r\n repository.uploadVideoToAzureBlobWithCancellation({\r\n fileObject,\r\n onProgress,\r\n }).then(({ token, blobName }) => {\r\n pendingVideoBlobUploadPromiseTokens.current.push(token);\r\n\r\n token.on({\r\n onSuccess: () => resolve({ token, blobName }),\r\n onError: reject,\r\n onCancel: () => {\r\n logTrace('DataService: cancel azure upload for video file');\r\n\r\n reject();\r\n },\r\n });\r\n });\r\n });\r\n\r\n return promise;\r\n }, [logTrace, repository]);\r\n\r\n const uploadVideoToFolder = useCallback(({\r\n fileObject,\r\n updateCurrentProgress,\r\n name,\r\n folderId,\r\n perfMarker,\r\n }) => {\r\n let uploadVideoPerfMarker = null;\r\n if (perfMarker) {\r\n uploadVideoPerfMarker = perfMarker.createChild('uploadSingleVideo');\r\n uploadVideoPerfMarker.willInit();\r\n }\r\n // blob upload stage: 0.9 progress\r\n // save blob to MT: 0.1 progress\r\n const scale = 0.9;\r\n const progressForBlobUpload = updateCurrentProgress ? (percentage) => {\r\n return updateCurrentProgress({\r\n loaded: percentage * scale,\r\n total: 1,\r\n });\r\n } : undefined;\r\n const progressForSavingBlobToMT = updateCurrentProgress ? (evt) => {\r\n const { loaded, total } = evt;\r\n\r\n return updateCurrentProgress({\r\n loaded: (total * scale) + (loaded * (1 - scale)),\r\n total,\r\n });\r\n } : undefined;\r\n\r\n return uploadVideoToAzureBlob({\r\n fileObject,\r\n onProgress: progressForBlobUpload,\r\n }).then(({ token, blobName }) => {\r\n pendingVideoBlobUploadPromiseTokens.current = _.without(pendingVideoBlobUploadPromiseTokens.current, token);\r\n\r\n return repository.addFolderUploadAsset({\r\n folderId: folderId || currentFolderId,\r\n asset: { blobName, name },\r\n folderAssetType: FolderAssetType.Video,\r\n inProgress: progressForSavingBlobToMT,\r\n }).finally(() => {\r\n if (uploadVideoPerfMarker) {\r\n uploadVideoPerfMarker.done();\r\n }\r\n });\r\n });\r\n }, [currentFolderId, repository, uploadVideoToAzureBlob]);\r\n\r\n const cancelPendingVideoUpload = () => {\r\n _.each(pendingVideoBlobUploadPromiseTokens.current, (token) => {\r\n token.cancel();\r\n });\r\n };\r\n\r\n const postVideoByUrl = useCallback(({\r\n videoUrl,\r\n name,\r\n folderId,\r\n }) => {\r\n return repository.postVideoByUrl({\r\n folderId: folderId || currentFolderId,\r\n videoUrl,\r\n name,\r\n });\r\n }, [currentFolderId, repository]);\r\n\r\n const uploadImageToFolder = useCallback(({\r\n imageData,\r\n updateCurrentProgress,\r\n imageName,\r\n folderId,\r\n supportUpscale,\r\n }) => {\r\n return repository.addFolderUploadAsset({\r\n folderId: folderId || currentFolderId,\r\n asset: { data: imageData, name: imageName },\r\n folderAssetType: FolderAssetType.Image,\r\n inProgress: updateCurrentProgress,\r\n supportUpscale,\r\n });\r\n }, [currentFolderId, repository]);\r\n\r\n const uploadStockImageToFolder = useCallback(({\r\n stockImageId,\r\n folderId,\r\n }) => {\r\n return repository.addStockImageToFolder({\r\n folderId: folderId || currentFolderId,\r\n stockImageId,\r\n });\r\n }, [repository, currentFolderId]);\r\n\r\n const uploadInvestImageToFolder = useCallback(({\r\n investImageId,\r\n imageSrc,\r\n folderId,\r\n }) => {\r\n return repository.addInvestImageToFolder({\r\n folderId: folderId || currentFolderId,\r\n investImageId,\r\n imageSrc,\r\n });\r\n }, [repository, currentFolderId]);\r\n\r\n const uploadInvestVideoToFolder = useCallback(({\r\n investVideoId,\r\n videoSrc,\r\n description,\r\n folderId,\r\n }) => {\r\n return repository.addInvestVideoToFolder({\r\n folderId: folderId || currentFolderId,\r\n investVideoId,\r\n videoSrc,\r\n description,\r\n });\r\n }, [repository, currentFolderId]);\r\n\r\n const renameAsset = useCallback(({\r\n assetId,\r\n folderAssetType,\r\n name,\r\n }) => {\r\n return repository.renameAsset({\r\n assetId,\r\n folderAssetType,\r\n name,\r\n }).then(() => {\r\n logTrace('DataService: asset is renamed', { assetId, folderAssetType, newName: name });\r\n\r\n // update the internal state\r\n const { assets } = folderData;\r\n const idx = _.findIndex(assets, asset => asset.id === assetId);\r\n if (idx >= 0 && assets[idx].name !== name) {\r\n const newAsset = { ...assets[idx], name };\r\n const newAssets = [...assets];\r\n newAssets.splice(idx, 1, newAsset);\r\n setAssets(newAssets);\r\n }\r\n });\r\n }, [folderData, logTrace, repository, setAssets]);\r\n\r\n const deleteAsset = useCallback(({\r\n assetId,\r\n folderAssetType,\r\n }) => {\r\n return repository.deleteAsset({ assetId, folderAssetType })\r\n .tap(() => {\r\n logTrace('DataService: asset is deleted', { assetId, folderAssetType });\r\n });\r\n }, [repository, logTrace]);\r\n\r\n // eslint-disable-next-line no-underscore-dangle\r\n const _batchDeleteAssetsAsync = useCallback(({ assets, parentPath, onItemDeleted }) => {\r\n return repository.bulkDeleteAssets(assets).then(({ resultSummary }) => {\r\n const ret = _.map(resultSummary, ({\r\n err, id: assetId, name: assetName, folderAssetType, url, thumbnailUrl,\r\n }) => {\r\n onItemDeleted({\r\n err, assetId, assetName, path: parentPath, assetType: folderAssetType, thumbnailUrl: thumbnailUrl || url, api: 'bulkdeleteAssetApi', errorCode: err && err.errorCode,\r\n });\r\n return {\r\n err, assetId, assetName, parentPath, folderAssetType,\r\n };\r\n });\r\n return ret;\r\n }).catch((err) => {\r\n const ret = _.map(assets, ({\r\n id: assetId, name: assetName, folderAssetType, url, thumbnailUrl,\r\n }) => {\r\n onItemDeleted({\r\n err, assetId, assetName, path: parentPath, assetType: folderAssetType, thumbnailUrl: thumbnailUrl || url, api: 'bulkdeleteAssetApi', errorCode: err && err.errorCode,\r\n });\r\n return {\r\n err, assetId, assetName, parentPath, folderAssetType,\r\n };\r\n });\r\n return ret;\r\n });\r\n }, [repository]);\r\n\r\n // eslint-disable-next-line no-underscore-dangle\r\n const _deleteEmptyFolderAsync = useCallback(({\r\n folderId, folderName, parentPath, onItemDeleted = _.noop,\r\n }) => {\r\n return deleteEmptyFolder({ folderId, folderName }).then(() => {\r\n onItemDeleted({\r\n folderId, folderName, path: parentPath, api: 'deleteFolderApi',\r\n });\r\n return {\r\n folderId, folderName, parentPath,\r\n };\r\n }).catch((err) => {\r\n onItemDeleted({\r\n err, folderId, folderName, path: parentPath, api: 'deleteFolderApi', errorCode: err && err.errorCode,\r\n });\r\n return {\r\n err, folderId, folderName, parentPath,\r\n };\r\n });\r\n }, [deleteEmptyFolder]);\r\n\r\n // MT only support delete empty folder, to delete a folder with assets & subfolders,\r\n // need to delete its subfolders one by one, and batch delete its assets\r\n // eslint-disable-next-line no-underscore-dangle\r\n const _batchDelete = useCallback(({\r\n folders = [], assets = [], path, onItemDeleted, _deleteFolder,\r\n }) => {\r\n const parentPath = path || getPathString(i18n, folderPath);\r\n const concurrencyCount = 3;\r\n\r\n return Promise.map(\r\n folders,\r\n ({ folderId, folderName, itemCount: ic }) => _deleteFolder({\r\n folderId, folderName, path: parentPath, totalItemCount: ic.TotalCount, onItemDeleted,\r\n }),\r\n { concurrency: concurrencyCount }\r\n ).then((foldersResult) => {\r\n return _batchDeleteAssetsAsync({ assets, parentPath, onItemDeleted }).then((assetsResult) => {\r\n return { folders: foldersResult, assets: assetsResult };\r\n });\r\n });\r\n }, [_batchDeleteAssetsAsync, folderPath, i18n]);\r\n\r\n const deleteFolder = useCallback(({\r\n folderId,\r\n folderName,\r\n totalItemCount: totalItmCnt, // optional param\r\n path,\r\n onItemDeleted,\r\n skip = 0,\r\n }) => {\r\n const parentPath = path || getPathString(i18n, folderPath);\r\n\r\n // query one page (without any filters) and then delete returned items.\r\n const loadOnePageAndDeleteAsync = () => {\r\n const ret = repository.getFolderData({\r\n folderId, sortBy: curSortBy.current, skip, count: DEFAULT_PAGE_SIZE, includeAssets: true, includeSubfolders: true,\r\n }).then((res) => {\r\n const { folder } = res;\r\n const { subfolders, assets, itemCount: { TotalCount: totalCount } } = folder || {};\r\n\r\n logTrace('delete folder - loaded data to delete', { folderId, folderName, totalItemCount: totalCount });\r\n\r\n // folder is empty\r\n if (totalCount <= 0) {\r\n return { hasNextPage: false };\r\n }\r\n\r\n // folder is not empty, batch deleting\r\n return _batchDelete({\r\n folders: subfolders, assets, path: `${parentPath}${PATH_SEPERATOR}${folderName}`, onItemDeleted, _deleteFolder: deleteFolder,\r\n }).then((results) => {\r\n // stop if all tasks failed\r\n let newSkip = skip;\r\n const successCount = _.filter([...results.folders, ...results.assets], ({ err }) => !err).length;\r\n if (successCount <= 0) {\r\n // all failed, skip the page\r\n newSkip = skip + DEFAULT_PAGE_SIZE;\r\n }\r\n\r\n // all items are deleted (some of them may failed)\r\n return { hasNextPage: totalCount > skip + DEFAULT_PAGE_SIZE, newSkip };\r\n });\r\n }).catch((e) => {\r\n // failed to load data, stop handling this folder\r\n const err = new AdsStudioErrorBase({ message: 'failed to load data to delete', originError: e, errorProcessor: deleteFolderApiErrorProcessor });\r\n onItemDeleted({\r\n e, folderId, folderName, path: parentPath, api: 'getFolderDataApi', errorCode: err && err.errorCode,\r\n });\r\n\r\n\r\n return { hasNextPage: undefined, loadDataError: err };\r\n });\r\n return ret;\r\n };\r\n\r\n // current folder is empty\r\n if (totalItmCnt <= 0) {\r\n return _deleteEmptyFolderAsync({\r\n folderId, folderName, parentPath: path, onItemDeleted,\r\n });\r\n }\r\n\r\n // load subfolders and assets for 'folderId' page by page and then delete them one by one\r\n return loadOnePageAndDeleteAsync().then(({ hasNextPage, newSkip, loadDataError }) => {\r\n // continue to load next page and delete it\r\n if (hasNextPage === true) {\r\n return deleteFolder({\r\n folderId, folderName, totalItemCount: totalItmCnt, parentPath, onItemDeleted, skip: newSkip,\r\n });\r\n } else if (hasNextPage === false) {\r\n // try to delete the folder itself\r\n return _deleteEmptyFolderAsync({\r\n folderId, folderName, parentPath, onItemDeleted, skip: newSkip,\r\n });\r\n }\r\n\r\n // failed to load data (!!loadDataError), stop handling this folder\r\n return {\r\n folderId, folderName, parentPath, err: loadDataError,\r\n };\r\n // }).tap((result) => {\r\n // console.log('####', result);\r\n });\r\n }, [_batchDelete, _deleteEmptyFolderAsync, folderPath, i18n, logTrace, repository]);\r\n\r\n const batchDelete = useCallback(({\r\n folders = [], assets = [], path, onItemDeleted = _.noop,\r\n }) => _batchDelete({\r\n folders, assets, path, onItemDeleted, _deleteFolder: deleteFolder,\r\n }), [_batchDelete, deleteFolder]);\r\n\r\n const batchMove = useCallback(({ destFolderId, folders = [], assets = [] }) => {\r\n return repository.batchMove({ destFolderId, folders, assets });\r\n }, [repository]);\r\n\r\n const folderContext = useMemo(() => ({\r\n folders: folderData.folders,\r\n folderPath,\r\n loadFolderData,\r\n loadMoreFolderData,\r\n loadFolderDataInDateRange,\r\n loadFolderArgs,\r\n loadMoreFolderDataInDateRange,\r\n perfTimeSeriesData: folderData.perfTimeSeriesData,\r\n loadPerfTimeSeriesData,\r\n navigateIntoFolder,\r\n navigateToFolderInPath,\r\n navigateIntoFolderItem,\r\n navigateIntoRootFolder,\r\n createFolder,\r\n deleteFolder,\r\n renameFolder,\r\n createFolderBulk,\r\n currentFolder,\r\n uploadImageByUrlToFolder,\r\n currentFolderId,\r\n uploadVideoToFolder,\r\n cancelPendingVideoUpload,\r\n postVideoByUrl,\r\n uploadImageToFolder,\r\n uploadStockImageToFolder,\r\n uploadInvestImageToFolder,\r\n uploadInvestVideoToFolder,\r\n reloadFolders,\r\n reloadFoldersInDateRange,\r\n totalItemCount,\r\n assets: folderData.assets,\r\n setAssets,\r\n renameAsset,\r\n deleteAsset,\r\n batchDelete,\r\n batchMove,\r\n addImageWithBaseIdToFolder,\r\n resetFolderData: resetData,\r\n dataOwnerPageName: folderData.pageName,\r\n }), [folderData.folders, folderData.perfTimeSeriesData, folderData.assets, folderData.pageName, folderPath, loadFolderData, loadMoreFolderData, loadFolderDataInDateRange, loadFolderArgs, loadMoreFolderDataInDateRange, loadPerfTimeSeriesData, navigateIntoFolder, navigateToFolderInPath, navigateIntoRootFolder, navigateIntoFolderItem, createFolder, deleteFolder, renameFolder, createFolderBulk, currentFolder, uploadImageByUrlToFolder, currentFolderId, uploadVideoToFolder, postVideoByUrl, uploadImageToFolder, uploadStockImageToFolder, uploadInvestImageToFolder, uploadInvestVideoToFolder, reloadFolders, reloadFoldersInDateRange, setAssets, renameAsset, deleteAsset, batchDelete, batchMove, resetData, addImageWithBaseIdToFolder]);\r\n\r\n return folderContext;\r\n};\r\n\r\nuseFolders.propTypes = {\r\n repository: PropTypes.shape({\r\n getFolders: PropTypes.func.isRequired,\r\n getImages: PropTypes.func.isRequired,\r\n createFolder: PropTypes.func.isRequired,\r\n }).isRequired,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func.isRequired,\r\n }).isRequired,\r\n};\r\n","import { useCallback, useMemo, useRef, useState } from 'react';\r\nimport _ from 'underscore';\r\nimport Promise from 'bluebird';\r\n\r\nexport const useCommonImageRepoMethods = ({\r\n imageRepository,\r\n logger,\r\n loadedImages,\r\n setLoadedImages,\r\n}) => {\r\n const latestTimestampRef = useRef(0);\r\n const [imageCroppingTasks, setImageCroppingTasks] = useState({});\r\n // used to restart task status poller\r\n const [croppingTaskUpdated, setCroppingTaskUpdated] = useState(null);\r\n\r\n const getImageById = useCallback(({ imageId, useCache = true }) => {\r\n if (useCache) {\r\n const image = _.find(loadedImages, img => img.id === imageId);\r\n if (image) {\r\n return Promise.resolve(image);\r\n }\r\n }\r\n // no local value, request from backend\r\n return imageRepository.getImage(imageId);\r\n }, [loadedImages, imageRepository]);\r\n\r\n const getImageCroppingTaskStatus = useCallback((imageId) => {\r\n const requestTimestamp = Date.now();\r\n return imageRepository.getImageCroppingTaskStatus(imageId).then(({ tasks /* totalCount */ }) => {\r\n // if multipe requests are sent out, ensure to keep the result from the latest request\r\n if (requestTimestamp > latestTimestampRef.current) {\r\n // only update if any value is changed\r\n setImageCroppingTasks((curTasks) => {\r\n let dirty = false;\r\n const newTaks = (tasks || []).reduce((prev, tsk = {}) => {\r\n const curTsk = curTasks && curTasks[tsk.id];\r\n const newTsk = _.pick(tsk, ['id', 'stage', 'hasError', 'failureMessage', 'isFinished']) || {};\r\n if (newTsk.isFinished) {\r\n dirty = dirty || !!curTsk;\r\n // task is finsished, remove it from the list\r\n return prev;\r\n }\r\n if (!curTsk || !_.isEqual(curTsk, newTsk)) {\r\n dirty = true;\r\n }\r\n return { ...prev, [newTsk.id]: newTsk };\r\n }, {});\r\n dirty = dirty || !_.isEmpty(_.difference(_.keys(curTasks), _.keys(newTaks)));\r\n if (dirty) {\r\n return newTaks;\r\n }\r\n return curTasks;\r\n });\r\n // eslint-disable-next-line no-param-reassign\r\n latestTimestampRef.current = requestTimestamp;\r\n }\r\n const taskCount = _.filter(tasks || [], t => t && !t.isFinished).length;\r\n return { totalCount: taskCount };\r\n }).catch((ex) => {\r\n // log and ignore the error\r\n logger.logError(`Failed to get image cropping task status. ${JSON.stringify(ex)}`);\r\n });\r\n }, [logger, imageRepository, latestTimestampRef]);\r\n\r\n const renameImage = useCallback(({ assetId: imageId, name }) => {\r\n const renameLocalImage = (images, setImages) => {\r\n const idx = _.findIndex(images, img => img.id === imageId);\r\n if (idx >= 0 && images[idx].name !== name) {\r\n const newImage = { ...images[idx], name };\r\n const newImages = [...images];\r\n newImages.splice(idx, 1, newImage);\r\n setImages(newImages);\r\n }\r\n };\r\n\r\n return imageRepository.renameImage({ imageId, name })\r\n .then(() => {\r\n logger.logTrace('DataService: image is renamed', { imageId, newName: name });\r\n renameLocalImage(loadedImages, setLoadedImages);\r\n })\r\n .tapCatch(() => {\r\n // logger.logError(err);\r\n });\r\n }, [imageRepository, logger, loadedImages, setLoadedImages]);\r\n\r\n const deleteImage = useCallback(({ assetId: imageId }) => {\r\n const promise = imageRepository.deleteImage(imageId)\r\n .tap(() => {\r\n logger.logTrace('DataService: image is deleted', { imageId });\r\n })\r\n .tapCatch(() => {\r\n // logger.logError();\r\n });\r\n return promise;\r\n }, [logger, imageRepository]);\r\n\r\n const cropImage = useCallback(({ imageId, cropSettings, placementSettings }) => {\r\n const ret = imageRepository.cropImage({ imageId, cropSettings, placementSettings }).then(() => {\r\n // update state to notify the status changes\r\n setCroppingTaskUpdated({ imageId });\r\n logger.logTrace('DataService: image is cropping', { imageId });\r\n });\r\n return ret;\r\n }, [logger, imageRepository]);\r\n\r\n const addCreative = useCallback(({ creativeData, baseId }) => {\r\n const ret = imageRepository.addCreative({ creativeData, baseId });\r\n return ret;\r\n }, [imageRepository]);\r\n\r\n const returnVal = useMemo(() => ({\r\n imageCroppingTasks,\r\n croppingTaskUpdated,\r\n getImageById,\r\n getImageCroppingTaskStatus,\r\n renameImage,\r\n deleteImage,\r\n cropImage,\r\n addCreative,\r\n }), [\r\n imageCroppingTasks,\r\n croppingTaskUpdated,\r\n getImageById,\r\n getImageCroppingTaskStatus,\r\n renameImage,\r\n deleteImage,\r\n cropImage,\r\n addCreative,\r\n ]);\r\n\r\n return returnVal;\r\n};\r\n","import { useCallback, useMemo, useRef, useState } from 'react';\r\nimport _ from 'underscore';\r\n\r\nimport { checkVideosIntermediateStatus } from '../../model';\r\n\r\n// below fields will be impacted along with status change\r\nconst VideoChangedFieldsWithStatusUpdate = [\r\n 'thumbnailUrl',\r\n 'url',\r\n 'width',\r\n 'height',\r\n 'durationInMS',\r\n 'status',\r\n];\r\n\r\nexport const useCommonVideoRepoMethods = ({\r\n repository,\r\n videoRepository,\r\n logger,\r\n}) => {\r\n const latestTimestampRef = useRef(0);\r\n const [videoUpdated, setVideoUpdated] = useState({}); // sample: { 123: { .. } }\r\n const getVideoTaskStatus = useCallback((videoTasks) => {\r\n const requestTimestamp = Date.now();\r\n const videosToCheck = _.keys(videoTasks);\r\n\r\n return repository.updateVideoStatusByIds(videosToCheck).then((response) => {\r\n // if multipe requests are sent out, ensure to keep the result from the latest request\r\n let notFinishedTaskList = {};\r\n let newVideoUpdated = {};\r\n if (requestTimestamp > latestTimestampRef.current) {\r\n const responseKeys = [];\r\n\r\n response.forEach((item) => {\r\n responseKeys.push(item.id);\r\n newVideoUpdated = {\r\n ...newVideoUpdated,\r\n [item.id]: _.pick(item, VideoChangedFieldsWithStatusUpdate),\r\n };\r\n\r\n if (item && checkVideosIntermediateStatus(item)) {\r\n notFinishedTaskList = { ...notFinishedTaskList, [item.id]: item.status };\r\n }\r\n });\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n latestTimestampRef.current = requestTimestamp;\r\n }\r\n\r\n setVideoUpdated(newVideoUpdated);\r\n\r\n const taskCount = Object.keys(notFinishedTaskList).length;\r\n\r\n return { totalCount: taskCount };\r\n }).catch(() => {\r\n // log and ignore the error\r\n logger.logError('Failed to get videos task status.');\r\n });\r\n }, [logger, repository]);\r\n\r\n const addVideoCreative = useCallback(({ videoCreative }) => {\r\n const promise = videoRepository.addVideoCreative({ videoCreative });\r\n return promise;\r\n }, [videoRepository]);\r\n\r\n const getVideo = useCallback(({ id, fetchMetadata }) => {\r\n const promise = videoRepository.getVideo({ id, fetchMetadata });\r\n return promise;\r\n }, [videoRepository]);\r\n\r\n const returnVal = useMemo(() => ({\r\n getVideoTaskStatus,\r\n videoUpdated,\r\n addVideoCreative,\r\n getVideo,\r\n }), [addVideoCreative, getVideo, getVideoTaskStatus, videoUpdated]);\r\n\r\n return returnVal;\r\n};\r\n","import Promise from 'bluebird';\r\nimport { useCallback } from 'react';\r\nimport { getTaskPoller } from '../task-poller';\r\n\r\nfunction checkError(err) {\r\n const { errorCode } = err || {};\r\n return ['GenerateImagesAIGCNoRecommendation', 'AI_Generation_Failed'].includes(errorCode);\r\n}\r\n\r\n// retry promise if it fails within timeout\r\nfunction retryPromise(getPromise, retryCount, start, logger, { timeout = 5000, shouldRetry = () => true }) {\r\n return getPromise().catch((err) => {\r\n const now = Date.now();\r\n const elapsed = now - start;\r\n\r\n if (retryCount >= 1 && elapsed < timeout && shouldRetry(err)) {\r\n return retryPromise(getPromise, retryCount - 1, start, logger, { timeout, shouldRetry });\r\n }\r\n\r\n logger.logError('Re-tried but failed to generate image by AI');\r\n return Promise.reject(err);\r\n });\r\n}\r\n\r\nexport const useAIGeneratedImages = ({\r\n repository,\r\n logger,\r\n pollInterval = 3000,\r\n maxRetryCount = 3, // max retry count for polling task status\r\n}) => {\r\n const generateImagesByAI = useCallback(({\r\n prompt, onProgress, onStartPolling, skipBrandDetection,\r\n }) => {\r\n if (!repository) {\r\n return Promise.reject(new Error());\r\n }\r\n\r\n const generateImagesByAIPromise = () => new Promise((resolve, reject) => {\r\n // start generating task\r\n repository.generateImagesWithAIAsync(prompt, skipBrandDetection).then((res) => {\r\n const { taskId } = res || {};\r\n\r\n if (!taskId && res.brandNameDetected) {\r\n resolve({\r\n brandNameDetected: true, brandNames: res.brandNames, prompt, images: [],\r\n });\r\n return;\r\n }\r\n\r\n // poll task status\r\n let retryCount = 0;\r\n const pollStatus = () => repository.getAIGeneratedImageTaskStatus(taskId).then((taskStatus) => {\r\n // status, progress, requestId, images, isTaskDone, taskId,\r\n const { isTaskDone, ...rest } = taskStatus || {};\r\n\r\n // reset retry count if there is successfull poll\r\n retryCount = 0;\r\n\r\n // report status\r\n if (onProgress) {\r\n onProgress({ ...rest, isTaskDone });\r\n }\r\n\r\n if (isTaskDone) {\r\n resolve({ ...rest, prompt });\r\n }\r\n\r\n // stop polling if it's done\r\n return { isFinished: isTaskDone };\r\n }).catch((err) => {\r\n retryCount += 1;\r\n if (err.shouldRetry === false || retryCount >= maxRetryCount) { // got continuous errors\r\n reject(err);\r\n // stop polling if failed maxRetryCount times continuously\r\n return { isFinished: true };\r\n }\r\n\r\n // ignore errors and retry\r\n logger.logError(`failed to get AI generation task status, retryCount: ${retryCount}, taskId: ${taskId}, prompt: ${prompt}, error: ${err.uxMessage}`);\r\n return { isFinished: false };\r\n });\r\n\r\n // start polling task status\r\n const taskPoller = getTaskPoller({ task: pollStatus, interval: pollInterval });\r\n taskPoller.start();\r\n if (onStartPolling) {\r\n onStartPolling(taskPoller);\r\n }\r\n }).catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n\r\n const ret = retryPromise(generateImagesByAIPromise, 1, Date.now(), logger, { shouldRetry: checkError, timeout: 10000 });\r\n\r\n if (logger.monitorPromise) {\r\n return logger.monitorPromise({ promise: ret, msg: `generateImagesByAI, prompt: ${prompt}`, api: 'generateImagesByAI' });\r\n }\r\n return ret;\r\n }, [logger, maxRetryCount, pollInterval, repository]);\r\n\r\n return {\r\n generateImagesByAI,\r\n };\r\n};\r\n","/* istanbul ignore file */\r\n// ut test has been covered by other hook files\r\n/* eslint-disable arrow-body-style */\r\nimport React, { useCallback, useContext, useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { useFolders } from './use-folders';\r\nimport { useCommonImageRepoMethods } from './use-image-repo-methods';\r\nimport { useCommonVideoRepoMethods } from './use-video-repo-methods';\r\nimport { useAIGeneratedImages } from './use-ai-generated-images';\r\nimport { useFolderPathTree } from './use-folder-path-tree';\r\n\r\nconst AssetWithFoldersDataServiceContext = React.createContext({});\r\n\r\nexport const AssetWithFoldersDataServiceProvider = ({\r\n children, imageRepository, aigcRepository, folderRepository, videoRepository, logger, allowedAssetType, i18n, perfMetricDateRange, defaultPerfMetricDateRange,\r\n}) => {\r\n const {\r\n folders,\r\n folderPath,\r\n loadFolderData,\r\n loadMoreFolderData,\r\n loadFolderDataInDateRange,\r\n loadFolderArgs,\r\n loadMoreFolderDataInDateRange,\r\n perfTimeSeriesData,\r\n loadPerfTimeSeriesData,\r\n navigateIntoFolder,\r\n navigateToFolderInPath,\r\n navigateIntoFolderItem,\r\n navigateIntoRootFolder,\r\n createFolder,\r\n createFolderBulk,\r\n deleteFolder,\r\n renameFolder,\r\n currentFolder,\r\n currentFolderId,\r\n uploadVideoToFolder,\r\n cancelPendingVideoUpload,\r\n postVideoByUrl,\r\n uploadImageByUrlToFolder,\r\n uploadImageToFolder,\r\n uploadStockImageToFolder,\r\n uploadInvestImageToFolder,\r\n uploadInvestVideoToFolder,\r\n reloadFolders,\r\n reloadFoldersInDateRange,\r\n totalItemCount,\r\n loadAssetsUnderFolder,\r\n assets,\r\n setAssets,\r\n renameAsset,\r\n deleteAsset,\r\n batchDelete,\r\n batchMove,\r\n resetFolderData,\r\n dataOwnerPageName,\r\n addImageWithBaseIdToFolder,\r\n } = useFolders({\r\n repository: folderRepository,\r\n logger,\r\n assetType: allowedAssetType,\r\n i18n,\r\n perfMetricDateRange,\r\n defaultPerfMetricDateRange,\r\n });\r\n\r\n const {\r\n imageCroppingTasks,\r\n croppingTaskUpdated,\r\n getImageById,\r\n getImageCroppingTaskStatus,\r\n cropImage,\r\n addCreative,\r\n } = useCommonImageRepoMethods({\r\n imageRepository,\r\n logger,\r\n loadedImages: assets,\r\n setLoadedImages: setAssets,\r\n });\r\n\r\n const {\r\n generateImagesByAI,\r\n } = useAIGeneratedImages({ repository: aigcRepository, logger });\r\n\r\n const {\r\n getVideoTaskStatus, videoUpdated, addVideoCreative, getVideo,\r\n } = useCommonVideoRepoMethods({\r\n repository: folderRepository,\r\n videoRepository,\r\n logger,\r\n i18n,\r\n });\r\n\r\n const {\r\n folderPathTree,\r\n loadFolderPathTreeItem,\r\n loadMoreFolderPathTreeItem,\r\n initializeFolderPathTree,\r\n reloadFolderPathTreeItem,\r\n } = useFolderPathTree({ repository: folderRepository, defaultPerfMetricDateRange });\r\n\r\n const totalAssetCount =\r\n totalItemCount.current.ImageAssetsCount + totalItemCount.current.VideoAssetsCount;\r\n const totalSubfoldersCount = totalItemCount.current.SubFoldersCount;\r\n\r\n const loadDataArgs = useCallback(({\r\n searchText,\r\n minImageWidth,\r\n minImageHeight,\r\n dateAddedDateRange,\r\n sortBy,\r\n importSource,\r\n assetSources,\r\n assetsToLoadForSubfolders = 1,\r\n assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch = false,\r\n includeParentHierarchy = false,\r\n count,\r\n topRated,\r\n } = {}) => {\r\n return loadFolderArgs({\r\n filterSettings: {\r\n searchTerm: searchText,\r\n minWidth: minImageWidth,\r\n minHeight: minImageHeight,\r\n dateAddedStart: dateAddedDateRange && dateAddedDateRange.start,\r\n dateAddedEnd: dateAddedDateRange && dateAddedDateRange.end,\r\n importSource,\r\n assetSources,\r\n assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch,\r\n topRated,\r\n },\r\n sortBy,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n });\r\n }, [loadFolderArgs]);\r\n\r\n const loadDataImpl = useCallback(({\r\n useDateRange,\r\n searchText,\r\n minImageWidth,\r\n minImageHeight,\r\n dateAddedDateRange,\r\n sortBy,\r\n importSource,\r\n assetSources,\r\n assetsToLoadForSubfolders = 1,\r\n assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch = false,\r\n includeParentHierarchy = false,\r\n hasPerfData = false,\r\n includeSubfolders = true,\r\n count,\r\n topRated,\r\n pageName,\r\n perfMarker,\r\n } = {}) => {\r\n const loadFolderDataFunc = useDateRange ? loadFolderDataInDateRange : loadFolderData;\r\n return loadFolderDataFunc({\r\n filterSettings: {\r\n searchTerm: searchText,\r\n minWidth: minImageWidth,\r\n minHeight: minImageHeight,\r\n dateAddedStart: dateAddedDateRange && dateAddedDateRange.start,\r\n dateAddedEnd: dateAddedDateRange && dateAddedDateRange.end,\r\n importSource,\r\n assetSources,\r\n assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch,\r\n hasPerfData,\r\n topRated,\r\n },\r\n perfMarker,\r\n sortBy,\r\n assetsToLoadForSubfolders,\r\n includeParentHierarchy,\r\n count,\r\n includeSubfolders,\r\n pageName,\r\n });\r\n }, [loadFolderData, loadFolderDataInDateRange]);\r\n\r\n const loadData = useCallback(args => loadDataImpl({ ...args, useDateRange: false }), [loadDataImpl]);\r\n const loadDataInDateRange = useCallback(args => loadDataImpl({ ...args, useDateRange: true }), [loadDataImpl]);\r\n\r\n const loadPerfTimeSeriesDataImpl = useCallback((\r\n perfTimeSeriesParams,\r\n {\r\n searchText,\r\n minImageWidth,\r\n minImageHeight,\r\n dateAddedDateRange,\r\n importSource,\r\n assetSources,\r\n // assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch = false,\r\n hasPerfData = false,\r\n topRated,\r\n } = {}\r\n ) => {\r\n return loadPerfTimeSeriesData({\r\n perfTimeSeriesParams,\r\n filterSettings: {\r\n searchTerm: searchText,\r\n minWidth: minImageWidth,\r\n minHeight: minImageHeight,\r\n dateAddedStart: dateAddedDateRange && dateAddedDateRange.start,\r\n dateAddedEnd: dateAddedDateRange && dateAddedDateRange.end,\r\n importSource,\r\n assetSources,\r\n // assetTypeFilter,\r\n minVideoDuration,\r\n maxVideoDuration,\r\n isGlobalSearch,\r\n hasPerfData,\r\n topRated,\r\n },\r\n });\r\n }, [loadPerfTimeSeriesData]);\r\n\r\n const uploadImageByUrl = useCallback(({ imageUrl, folderId, sourceType }) => {\r\n return uploadImageByUrlToFolder({ imageUrl, folderId, sourceType }).tap(() => {\r\n logger.logTrace('DataService: image is uploaded by Url to folder', { sourceType, imageUrl, folderId });\r\n });\r\n }, [logger, uploadImageByUrlToFolder]);\r\n\r\n const uploadImage = useCallback(({\r\n imageData,\r\n updateCurrentProgress = null,\r\n name = '',\r\n folderId = null,\r\n supportUpscale,\r\n }) => {\r\n return uploadImageToFolder({\r\n imageData,\r\n updateCurrentProgress,\r\n imageName: name,\r\n folderId,\r\n supportUpscale,\r\n }).tap(() => {\r\n logger.logTrace('DataService: image is uploaded to folder');\r\n });\r\n }, [logger, uploadImageToFolder]);\r\n\r\n const uploadVideo = useCallback(({\r\n fileObject,\r\n updateCurrentProgress = null,\r\n name = '',\r\n folderId = null,\r\n perfMarker = null,\r\n }) => {\r\n return uploadVideoToFolder({\r\n fileObject,\r\n updateCurrentProgress,\r\n name,\r\n folderId,\r\n perfMarker,\r\n }).tap(() => {\r\n logger.logTrace('DataService: video is uploaded to folder');\r\n });\r\n }, [logger, uploadVideoToFolder]);\r\n\r\n const uploadVideoByUrl = useCallback(({\r\n videoUrl,\r\n name = '',\r\n folderId = null,\r\n }) => {\r\n return postVideoByUrl({\r\n videoUrl,\r\n name,\r\n folderId,\r\n }).tap(() => {\r\n logger.logTrace('DataService: video is uploaded by Url to folder');\r\n });\r\n }, [logger, postVideoByUrl]);\r\n\r\n const uploadStockImage = useCallback(({ stockImageId, folderId }) => {\r\n return uploadStockImageToFolder({ stockImageId, folderId }).tap(() => {\r\n logger.logTrace('DataService: stock image is uploaded to folder');\r\n });\r\n }, [logger, uploadStockImageToFolder]);\r\n\r\n const uploadInvestImage = useCallback(({ investImageId, imageSrc, folderId }) => {\r\n return uploadInvestImageToFolder({ investImageId, imageSrc, folderId }).tap(() => {\r\n logger.logTrace('DataService: invest image is uploaded to folder');\r\n });\r\n }, [logger, uploadInvestImageToFolder]);\r\n\r\n const uploadInvestVideo = useCallback(({\r\n investVideoId, videoSrc, description, folderId,\r\n }) => {\r\n return uploadInvestVideoToFolder({\r\n investVideoId, videoSrc, description, folderId,\r\n }).tap(() => {\r\n logger.logTrace('DataService: invest video is uploaded to folder');\r\n });\r\n }, [logger, uploadInvestVideoToFolder]);\r\n\r\n const contextVal = useMemo(\r\n () => ({\r\n assets,\r\n totalAssetCount,\r\n totalSubfoldersCount,\r\n // load first page, with filters and sortby\r\n loadData,\r\n loadDataArgs,\r\n loadDataInDateRange,\r\n // reload images with previous filters\r\n reloadData: reloadFolders,\r\n reloadDataInDataRange: reloadFoldersInDateRange,\r\n // load more, with previous filters/sort\r\n loadMoreData: loadMoreFolderData,\r\n loadMoreDataInDateRange: loadMoreFolderDataInDateRange,\r\n getImageById, // if it's not cached, send a request (deep linking)\r\n perfTimeSeriesData,\r\n loadPerfTimeSeriesData: loadPerfTimeSeriesDataImpl,\r\n\r\n // get image cropping tasks status\r\n imageCroppingTasks,\r\n getImageCroppingTaskStatus,\r\n croppingTaskUpdated,\r\n\r\n // get video tasks status\r\n getVideoTaskStatus,\r\n videoUpdated,\r\n addVideoCreative,\r\n getVideo,\r\n\r\n renameAsset,\r\n deleteAsset,\r\n cropImage,\r\n uploadVideo,\r\n cancelPendingVideoUpload,\r\n uploadVideoByUrl,\r\n uploadImage,\r\n uploadImageByUrl,\r\n addCreative,\r\n folders,\r\n folderPath,\r\n navigateIntoFolder,\r\n navigateToFolderInPath,\r\n navigateIntoFolderItem,\r\n navigateIntoRootFolder,\r\n createFolder,\r\n createFolderBulk,\r\n deleteFolder,\r\n renameFolder,\r\n currentFolder,\r\n currentFolderId,\r\n loadAssetsUnderFolder,\r\n uploadStockImage,\r\n uploadInvestImage,\r\n uploadInvestVideo,\r\n reloadFolders,\r\n batchDelete,\r\n batchMove,\r\n resetFolderData,\r\n dataOwnerPageName,\r\n generateImagesByAI,\r\n addImageWithBaseIdToFolder,\r\n\r\n folderPathTree,\r\n loadFolderPathTreeItem,\r\n loadMoreFolderPathTreeItem,\r\n initializeFolderPathTree,\r\n reloadFolderPathTreeItem,\r\n }),\r\n [assets, totalAssetCount, totalSubfoldersCount, loadData, loadDataArgs, loadDataInDateRange, reloadFolders, reloadFoldersInDateRange, loadMoreFolderData, loadMoreFolderDataInDateRange, getImageById, perfTimeSeriesData, loadPerfTimeSeriesDataImpl, imageCroppingTasks, getImageCroppingTaskStatus, croppingTaskUpdated, getVideoTaskStatus, videoUpdated, addVideoCreative, getVideo, renameAsset, deleteAsset, cropImage, uploadVideo, cancelPendingVideoUpload, uploadVideoByUrl, uploadImage, uploadImageByUrl, addCreative, folders, folderPath, navigateIntoFolder, navigateToFolderInPath, navigateIntoFolderItem, navigateIntoRootFolder, createFolder, createFolderBulk, deleteFolder, renameFolder, currentFolder, currentFolderId, loadAssetsUnderFolder, uploadStockImage, uploadInvestImage, uploadInvestVideo, batchDelete, batchMove, resetFolderData, dataOwnerPageName, generateImagesByAI, folderPathTree, loadFolderPathTreeItem, loadMoreFolderPathTreeItem, initializeFolderPathTree, reloadFolderPathTreeItem, addImageWithBaseIdToFolder]\r\n );\r\n\r\n return (\r\n <AssetWithFoldersDataServiceContext.Provider value={contextVal}>\r\n {children}\r\n </AssetWithFoldersDataServiceContext.Provider>\r\n );\r\n};\r\n\r\nAssetWithFoldersDataServiceProvider.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n imageRepository: PropTypes.shape({\r\n getImage: PropTypes.func,\r\n getImageCroppingTaskStatus: PropTypes.func,\r\n renameImage: PropTypes.func,\r\n deleteImage: PropTypes.func,\r\n updateCropSettings: PropTypes.func,\r\n }).isRequired,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func,\r\n logError: PropTypes.func,\r\n }).isRequired,\r\n aigcRepository: PropTypes.shape({}),\r\n folderRepository: PropTypes.shape({}).isRequired,\r\n videoRepository: PropTypes.shape({}).isRequired,\r\n allowedAssetType: PropTypes.string,\r\n i18n: PropTypes.shape({}).isRequired,\r\n perfMetricDateRange: PropTypes.shape({}),\r\n defaultPerfMetricDateRange: PropTypes.shape({}),\r\n};\r\n\r\nAssetWithFoldersDataServiceProvider.defaultProps = {\r\n aigcRepository: null,\r\n allowedAssetType: null,\r\n perfMetricDateRange: null,\r\n defaultPerfMetricDateRange: null,\r\n};\r\n\r\nexport const useAsssetWithFoldersDataService = () => useContext(AssetWithFoldersDataServiceContext);\r\n","import { useState, useCallback } from 'react';\r\nimport { Promise } from 'bluebird';\r\n\r\nimport { CSMLSortBy, DEFAULT_PAGE_SIZE, ROOT_FOLDER_ID } from '../../model';\r\n\r\n/**\r\n * floderPathTree:\r\n * [{\r\n * folderId,\r\n * folderName,\r\n * subFolders: [{}] // recursive\r\n * subFoldersCount,\r\n * }]\r\n *\r\n */\r\n\r\nexport const useFolderPathTree = ({ repository, defaultPerfMetricDateRange }) => {\r\n const [folderPathTree, setFolderPathTree] = useState([]);\r\n\r\n const updateFolderPathTree = useCallback((currentFolderPathTree, folderIdArr, subFoldersArr, totalSubfoldersCount = [], reload = false) => {\r\n const recursiveUpdate = items => items.map((item) => {\r\n if (folderIdArr.includes(item.folderId)) {\r\n const index = folderIdArr.indexOf(item.folderId);\r\n if (reload) {\r\n return {\r\n ...item,\r\n subFolders: subFoldersArr[index],\r\n subFoldersCount: totalSubfoldersCount[index],\r\n };\r\n }\r\n const newSubFloders = [...item.subFolders, ...subFoldersArr[index]];\r\n return {\r\n ...item,\r\n subFolders: newSubFloders,\r\n };\r\n }\r\n return {\r\n ...item,\r\n subFolders: item.subFolders.length > 0 ? recursiveUpdate(item.subFolders) : item.subFolders,\r\n };\r\n });\r\n\r\n return recursiveUpdate(currentFolderPathTree);\r\n }, []);\r\n\r\n const loadFolderPathTreeItemImp = useCallback(({\r\n folderId,\r\n skip,\r\n // eslint-disable-next-line arrow-body-style\r\n }) => {\r\n return repository.getFolderData({\r\n perfMetricDateRange: defaultPerfMetricDateRange,\r\n sortBy: CSMLSortBy.ImageName,\r\n skip: skip || 0,\r\n count: DEFAULT_PAGE_SIZE,\r\n folderId,\r\n includeAssets: false,\r\n includeSubfolders: true,\r\n includeParentHierarchy: true,\r\n assetsToLoadForSubfolders: false,\r\n isAssetPickerScenario: false,\r\n withBIData: false,\r\n }).then((res) => {\r\n const { folder } = res;\r\n const newFolders = (folder.subfolders || []).map(subFolder => ({\r\n folderId: subFolder.folderId,\r\n folderName: subFolder.folderName,\r\n subFolders: [],\r\n subFoldersCount: subFolder.itemCount.SubFoldersCount,\r\n parentHierarchy: subFolder.parentHierarchy,\r\n }));\r\n const totalSubfoldersCount = folder.itemCount.SubFoldersCount || 0;\r\n return {\r\n subFolders: newFolders,\r\n totalSubfoldersCount,\r\n };\r\n });\r\n }, [defaultPerfMetricDateRange, repository]);\r\n\r\n const initializeFolderPathTree = useCallback(() => loadFolderPathTreeItemImp({\r\n folderId: ROOT_FOLDER_ID,\r\n }).then(({\r\n subFolders,\r\n totalSubfoldersCount,\r\n }) => {\r\n setFolderPathTree([{\r\n folderId: ROOT_FOLDER_ID,\r\n subFolders,\r\n subFoldersCount: totalSubfoldersCount,\r\n folderName: 'Root',\r\n parentHierarchy: [],\r\n }]);\r\n }), [loadFolderPathTreeItemImp]);\r\n\r\n const loadFolderPathTreeItem = useCallback(folderId => loadFolderPathTreeItemImp({\r\n folderId,\r\n }).then(({\r\n subFolders,\r\n }) => {\r\n setFolderPathTree(currentFolderPathTree => updateFolderPathTree(currentFolderPathTree, [folderId], [subFolders]));\r\n }), [loadFolderPathTreeItemImp, updateFolderPathTree]);\r\n\r\n const loadMoreFolderPathTreeItem = useCallback((folderId, currentFolderCount) => loadFolderPathTreeItemImp({\r\n folderId,\r\n skip: currentFolderCount,\r\n }).then(({\r\n subFolders,\r\n }) => {\r\n setFolderPathTree(currentFolderPathTree => updateFolderPathTree(currentFolderPathTree, [folderId], [subFolders]));\r\n }), [loadFolderPathTreeItemImp, updateFolderPathTree]);\r\n\r\n const reloadFolderPathTreeItem = useCallback(folderIdArr => Promise.all(folderIdArr.map(folderId => loadFolderPathTreeItemImp({\r\n folderId,\r\n }).then(({\r\n subFolders,\r\n totalSubfoldersCount,\r\n }) => ({\r\n subFolders, totalSubfoldersCount,\r\n })))).then((result) => {\r\n const subFoldersArr = result.map(({ subFolders }) => subFolders);\r\n const totalSubfoldersCountArr = result.map(({ totalSubfoldersCount }) => totalSubfoldersCount);\r\n setFolderPathTree(currentFolderPathTree => updateFolderPathTree(currentFolderPathTree, folderIdArr, subFoldersArr, totalSubfoldersCountArr, true));\r\n }), [loadFolderPathTreeItemImp, updateFolderPathTree]);\r\n\r\n return {\r\n folderPathTree,\r\n loadFolderPathTreeItem,\r\n loadMoreFolderPathTreeItem,\r\n initializeFolderPathTree,\r\n reloadFolderPathTreeItem,\r\n };\r\n};\r\n","/* istanbul ignore file */\r\n// ut test has been covered by other hook files\r\nimport React from 'react';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport _ from 'underscore';\r\n\r\nimport {\r\n AssetWithFoldersDataServiceProvider,\r\n useAsssetWithFoldersDataService,\r\n} from './asset-with-folders-data-service';\r\n\r\nexport const useAdsStudioServices = useAsssetWithFoldersDataService;\r\n\r\nexport const withAdsStudioServicesConsumer = (Comp, pickedPropNames) => {\r\n const CompWithService = (props) => {\r\n const dataService = useAdsStudioServices();\r\n // explicitly pick these props to keep pages' props clean\r\n let pickedProps = props;\r\n if (pickedPropNames) {\r\n pickedProps = _.pick(props, pickedPropNames);\r\n }\r\n return (<Comp dataService={dataService} {...pickedProps} />);\r\n };\r\n\r\n hoistNonReactStatics(CompWithService, Comp);\r\n\r\n return CompWithService;\r\n};\r\n\r\nexport { AssetWithFoldersDataServiceProvider };\r\nexport { useFolders, getAssetTypeToFetch } from './use-folders';\r\nexport { useAIGeneratedImages } from './use-ai-generated-images';\r\nexport { useFolderPathTree } from './use-folder-path-tree';\r\n\r\n// todo: copilot depends on serverContext, should be move to cmui-shell package\r\n// export { withCopilotDataServiceLoaded } from './copilot-data-service';\r\n","/*\r\n // an AssetWindow is a window of assets, which is a subset of the assets in a repository\r\n // use this to keep track of the loading status of each window\r\n // usually, each call to repository.loadAssets will load a window of assets\r\n type AssetWindow = {\r\n windowIndex: number,\r\n windowSize: number,\r\n // status: string,\r\n ... // any other properties as needed, which will be passed to the repository\r\n }\r\n*/\r\n\r\n//\r\nexport const WindowStatus = {\r\n loading: 'loading',\r\n loaded: 'loaded',\r\n error: 'error',\r\n};\r\n","import _ from 'underscore';\r\n\r\nimport { WindowStatus } from './asset-window';\r\n\r\n// -1 means the total count is unknown (maybe infinite), so the windows count is unknown too\r\nconst INDETERMINATE = -1; // indeterminate\r\n// -2 means the total count is not set yet\r\nconst UNSET = -2;\r\n\r\nconst MAX_ITEM_COUNT = 0x7FFFFFFF;\r\n\r\n// the loading windows manager is used to keep track which pages are loading/loaded or not loaded yet\r\nexport class AssetsWindowManager {\r\n constructor(windowSize) {\r\n this.windowSize = windowSize;\r\n }\r\n\r\n resetWindows() {\r\n this.assetWindows = []; // array of WindowStatus\r\n this.totalAssetCount = UNSET;\r\n this.windowsCount = UNSET;\r\n }\r\n\r\n setTotalItemCount(totalAssetCount) {\r\n if (this.totalAssetCount !== UNSET) {\r\n return;\r\n }\r\n this.totalAssetCount = totalAssetCount >= 0 ? totalAssetCount : INDETERMINATE;\r\n this.windowsCount = totalAssetCount >= 0 && this.windowSize > 0 ? Math.ceil(totalAssetCount / this.windowSize) : INDETERMINATE;\r\n }\r\n\r\n // is any window loading?\r\n get isLoading() {\r\n const ret = _.some(this.assetWindows, w => w === WindowStatus.loading);\r\n return ret;\r\n }\r\n\r\n // all windows are loaded?\r\n get isCompleted() {\r\n // if the total count is not set, it means the loading is not started yet\r\n if (this.totalAssetCount === UNSET) {\r\n return false;\r\n }\r\n\r\n // if the total count is indeterminate, it will never be completed\r\n if (this.totalAssetCount === INDETERMINATE || this.windowsCount === INDETERMINATE) {\r\n return false;\r\n }\r\n\r\n // check status of all windows\r\n for (let i = 0; i < this.windowsCount; i += 1) {\r\n if (!this.assetWindows[i] || this.assetWindows[i] !== WindowStatus.loaded) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n getTotalAssetCount() {\r\n if (this.totalAssetCount === UNSET || this.totalAssetCount === INDETERMINATE) {\r\n return MAX_ITEM_COUNT;\r\n }\r\n return this.totalAssetCount || 0;\r\n }\r\n\r\n // return AssetWindow object, which contains the windowIndex of the next window to load\r\n // and if all windows are loaded, it will return -1\r\n getNextUnloadedWindow() {\r\n // the initial page load, item count is returned with the initial page data\r\n if (this.totalAssetCount === UNSET) {\r\n this.assetWindows = [WindowStatus.loading];\r\n return { windowIndex: 0, windowSize: this.windowSize };\r\n }\r\n\r\n // find the first unloaded window\r\n let windowIndex = -1;\r\n const length = this.windowsCount >= 0 ? this.windowsCount : this.assetWindows.length;\r\n for (let i = 0; i < length; i += 1) {\r\n // for error windows, retry them\r\n if (!this.assetWindows[i] || this.assetWindows[i] === WindowStatus.error) {\r\n this.assetWindows[i] = WindowStatus.loading;\r\n windowIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (windowIndex !== -1) {\r\n return { windowIndex, windowSize: this.windowSize };\r\n }\r\n\r\n // it's maybe a infinite list\r\n if (this.totalAssetCount === INDETERMINATE) {\r\n // add a new loading window\r\n this.assetWindows.push(WindowStatus.loading);\r\n return { windowIndex: this.assetWindows.length - 1, windowSize: this.windowSize };\r\n }\r\n\r\n // no more windows to load\r\n return { windowIndex: -1, windowSize: this.windowSize };\r\n }\r\n\r\n // paremeter is the window object and status to set\r\n setWindowStatus({ windowIndex }, status) {\r\n this.assetWindows[windowIndex] = status;\r\n }\r\n}\r\n\r\n// compose multiple AssetsWindowManager for multiple sources\r\nexport class SequenceAssetsWindowManager {\r\n // sourceNames is an array of source names, like ['assetlibrary', 'stock']\r\n constructor(windowSize, sourceNames) {\r\n this.windowSize = windowSize;\r\n this.sourceNames = sourceNames;\r\n this.winMgrList = _.map(sourceNames, (sourceName) => {\r\n const mgr = new AssetsWindowManager(windowSize);\r\n mgr.sourceName = sourceName;\r\n return mgr;\r\n });\r\n }\r\n\r\n resetWindows() {\r\n _.each(this.winMgrList, (mgr) => {\r\n mgr.resetWindows();\r\n });\r\n }\r\n\r\n setTotalItemCount(totalAssetCount, winObj) {\r\n const { sourceName } = winObj;\r\n const mgr = _.find(this.winMgrList, { sourceName });\r\n if (mgr) {\r\n mgr.setTotalItemCount(totalAssetCount);\r\n }\r\n }\r\n\r\n get isLoading() {\r\n const ret = _.some(this.winMgrList, mgr => mgr.isLoading);\r\n return ret;\r\n }\r\n\r\n get isCompleted() {\r\n const ret = _.every(this.winMgrList, mgr => mgr.isCompleted);\r\n return ret;\r\n }\r\n\r\n getTotalAssetCount() {\r\n let count = 0;\r\n for (let i = 0; i < this.winMgrList.length; i += 1) {\r\n const cnt = this.winMgrList[i].totalAssetCount;\r\n if (cnt === INDETERMINATE || cnt === UNSET) {\r\n return MAX_ITEM_COUNT;\r\n }\r\n count += cnt || 0;\r\n }\r\n return count;\r\n }\r\n\r\n getNextUnloadedWindow() {\r\n // find the first incomplete window\r\n const winMgr = _.find(this.winMgrList, mgr => !mgr.isCompleted);\r\n if (winMgr) {\r\n const { windowIndex } = winMgr.getNextUnloadedWindow();\r\n //\r\n let indexOffset = 0; // sum of previous windows' totalAssetCount\r\n for (let i = 0; i < this.winMgrList.length; i += 1) {\r\n if (this.winMgrList[i] === winMgr) {\r\n break;\r\n }\r\n indexOffset += this.winMgrList[i].totalAssetCount;\r\n }\r\n // append sourceName to the window object\r\n return {\r\n windowIndex,\r\n windowSize: this.windowSize,\r\n sourceName: winMgr.sourceName,\r\n indexOffset, // sum of previous windows' totalAssetCount\r\n };\r\n }\r\n return { windowIndex: -1, windowSize: this.windowSize };\r\n }\r\n\r\n setWindowStatus(winObj, status) {\r\n const { sourceName } = winObj;\r\n const mgr = _.find(this.winMgrList, { sourceName });\r\n if (mgr) {\r\n mgr.setWindowStatus(winObj, status);\r\n }\r\n }\r\n\r\n getAssetCountBySource() {\r\n const ret = {};\r\n _.each(this.winMgrList, (mgr) => {\r\n ret[mgr.sourceName] = mgr.totalAssetCount;\r\n });\r\n return ret;\r\n }\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport const AssetsReducerActionType = {\r\n SetAssetsData: 'ACTION_TYPE_SET_ASSETS_DATA',\r\n AddAssetsData: 'ACTION_TYPE_ADD_ASSETS_DATA',\r\n ResetAssetsData: 'ACTION_TYPE_RESET_ASSETS_DATA',\r\n RenameAssetData: 'ACTION_TYPE_RENAME_ASSET_DATA',\r\n};\r\n\r\nexport const AssetsReducerActions = {\r\n setAssetsData: ({\r\n assets, ...rest\r\n }) => ({\r\n actionType: AssetsReducerActionType.SetAssetsData,\r\n assets,\r\n ...rest,\r\n }),\r\n\r\n addAssetsData: ({\r\n assets, windowIndex, windowSize, ...rest\r\n }) => ({\r\n actionType: AssetsReducerActionType.AddAssetsData,\r\n assets,\r\n pageIndex: windowIndex,\r\n pageSize: windowSize,\r\n ...rest,\r\n }),\r\n\r\n resetAssetData: () => ({\r\n actionType: AssetsReducerActionType.ResetAssetsData,\r\n }),\r\n\r\n renameAssetData: ({\r\n assetId, name,\r\n }) => ({\r\n actionType: AssetsReducerActionType.RenameAssetData,\r\n assetId,\r\n name,\r\n }),\r\n};\r\n\r\nexport const InitialReducerState = {\r\n assets: [],\r\n};\r\n\r\nexport const defaultReducer = (state, action) => {\r\n const { actionType, ...actionData } = action || {};\r\n switch (actionType) {\r\n case AssetsReducerActionType.SetAssetsData:\r\n {\r\n const { assets, ...rest } = actionData;\r\n const newAssets = [...assets];\r\n return { ...state, ...rest, assets: newAssets };\r\n }\r\n\r\n case AssetsReducerActionType.AddAssetsData:\r\n {\r\n const {\r\n assets, pageIndex, pageSize, ...rest\r\n } = actionData;\r\n const newAssets = [...state.assets];\r\n const startIdx = pageIndex * pageSize;\r\n _.forEach(assets, (asset, idx) => {\r\n newAssets[startIdx + idx] = asset;\r\n });\r\n return { ...state, ...rest, assets: newAssets };\r\n }\r\n\r\n case AssetsReducerActionType.ResetAssetsData:\r\n return InitialReducerState;\r\n\r\n case AssetsReducerActionType.RenameAssetData:\r\n {\r\n const { assetId, name } = actionData;\r\n const idx = _.findIndex(state.assets, asset => asset.id === assetId);\r\n if (idx >= 0 && state.assets[idx].name !== name) {\r\n const newAsset = { ...state.assets[idx], name };\r\n const newAssets = [...state.assets];\r\n newAssets.splice(idx, 1, newAsset);\r\n return { ...state, assets: newAssets };\r\n }\r\n return state;\r\n }\r\n\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\n// used with SequenceAssetsWindowManager, which has sourceName and indexOffset in the window object\r\nexport const sequenceWindowReducer = (state, action) => {\r\n const { actionType, ...actionData } = action || {};\r\n switch (actionType) {\r\n case AssetsReducerActionType.AddAssetsData:\r\n {\r\n const {\r\n assets, pageIndex, pageSize, indexOffset = 0, ...rest // sourceName,\r\n } = actionData;\r\n const newAssets = [...state.assets];\r\n const startIdx = indexOffset + (pageIndex * pageSize);\r\n _.forEach(assets, (asset, idx) => {\r\n newAssets[startIdx + idx] = asset;\r\n });\r\n return { ...state, ...rest, assets: newAssets };\r\n }\r\n\r\n default:\r\n return defaultReducer(state, action);\r\n }\r\n};\r\n","import Promise from 'bluebird';\r\nimport { useCallback, useReducer, useRef } from 'react';\r\n\r\nimport { WindowStatus } from './asset-window';\r\nimport { AssetsWindowManager } from './assets-window-manager';\r\nimport { AssetsReducerActions } from './assets-reducer-base';\r\n\r\n/*\r\n @reducer\r\n reducer function, support actions defined in AssetsReducerActions, and its state structure is transparent to this hook\r\n\r\n @reducerInitialArg\r\n initial state for reducer\r\n\r\n @repository\r\n repository object with following methods:\r\n - loadAssets: (...filters, ...params) => Promise<{ assets, totalItemCount }>\r\n filters : a filter object, which will be cached in this hook, and it's internal data is transparent to this hook\r\n params : additional parameters for loading assets, which will be passed to loadAssets\r\n it contains at least windowIndex and windowSize\r\n both filters and params will be passed to repository without any modification\r\n */\r\nexport const useAssetsServiceBase = ({\r\n reducer,\r\n reducerInitialArg,\r\n repository,\r\n pageSize,\r\n assetWindowManager,\r\n}) => {\r\n const filtersRef = useRef(null);\r\n const loadingWindowManagerRef = useRef(assetWindowManager || new AssetsWindowManager(pageSize));\r\n\r\n const [assetState, dispatch] = useReducer(reducer, reducerInitialArg || null);\r\n\r\n const uploadImage = useCallback(({\r\n imageData,\r\n updateCurrentProgress = null,\r\n name = '',\r\n folderId = null,\r\n supportUpscale,\r\n }) => repository.uploadImageToFolder({\r\n imageData,\r\n updateCurrentProgress,\r\n imageName: name,\r\n folderId,\r\n supportUpscale,\r\n }), [repository]);\r\n\r\n /**\r\n * Load assets\r\n * @param {Object} filters\r\n * @param {Object} params\r\n * @returns {Promise}\r\n */\r\n const loadAssets = useCallback((filters, ...params) => {\r\n // reset loading status\r\n loadingWindowManagerRef.current.resetWindows();\r\n const winObj = loadingWindowManagerRef.current.getNextUnloadedWindow();\r\n\r\n // keep filter reference to use in loadMoreAssets\r\n filtersRef.current = filters;\r\n\r\n const ret = repository.loadAssets({\r\n ...filters,\r\n ...params,\r\n ...winObj,\r\n }).then(({ assets, totalItemCount, ...rest }) => {\r\n // update loading status\r\n loadingWindowManagerRef.current.setTotalItemCount(totalItemCount, winObj);\r\n loadingWindowManagerRef.current.setWindowStatus(winObj, WindowStatus.loaded);\r\n // save assets to reducer state\r\n dispatch(AssetsReducerActions.setAssetsData({ assets, ...rest }));\r\n }).catch((error) => {\r\n // upload loading status\r\n loadingWindowManagerRef.current.setWindowStatus(winObj, WindowStatus.error);\r\n throw error;\r\n });\r\n\r\n return ret;\r\n }, [repository]);\r\n\r\n /**\r\n * Load more assets\r\n * @param {Object} params\r\n * @returns {Promise}\r\n */\r\n const loadMoreAssets = useCallback((params) => {\r\n const winObj = loadingWindowManagerRef.current.getNextUnloadedWindow();\r\n\r\n // no more window to load\r\n if (winObj.windowIndex < 0) {\r\n return Promise.resolve({ noMoreData: true });\r\n }\r\n\r\n const ret = repository.loadAssets({\r\n ...filtersRef.current,\r\n ...params,\r\n ...winObj,\r\n }).then(({ assets, totalItemCount, ...rest }) => {\r\n loadingWindowManagerRef.current.setTotalItemCount(totalItemCount, winObj);\r\n loadingWindowManagerRef.current.setWindowStatus(winObj, WindowStatus.loaded);\r\n // save assets to reducer state\r\n dispatch(AssetsReducerActions.addAssetsData({\r\n assets, ...winObj, ...rest,\r\n }));\r\n }).catch((error) => {\r\n // upload loading status\r\n loadingWindowManagerRef.current.setWindowStatus(winObj, WindowStatus.error);\r\n throw error;\r\n });\r\n\r\n return ret;\r\n }, [repository]);\r\n\r\n /**\r\n * Reload assets\r\n * @param {Object} params\r\n * @returns {Promise}\r\n */\r\n const reloadAssets = useCallback((params) => {\r\n const ret = loadAssets(filtersRef.current, params);\r\n return ret;\r\n }, [loadAssets]);\r\n\r\n /**\r\n * Reset assets data\r\n */\r\n const resetAssetsData = useCallback(() => {\r\n dispatch(AssetsReducerActions.resetAssetData());\r\n }, []);\r\n\r\n /**\r\n * Rename asset\r\n */\r\n const renameAsset = useCallback(({\r\n assetId,\r\n folderAssetType,\r\n name,\r\n }) => {\r\n const ret = repository.renameAsset({\r\n assetId,\r\n folderAssetType,\r\n name,\r\n }).then(() => {\r\n dispatch(AssetsReducerActions.renameAssetData({\r\n assetId,\r\n name,\r\n }));\r\n });\r\n return ret;\r\n }, [repository]);\r\n\r\n return {\r\n ...assetState,\r\n uploadImage,\r\n loadAssets,\r\n loadMoreAssets,\r\n reloadAssets,\r\n resetAssetsData,\r\n renameAsset,\r\n //\r\n totalAssetCount: loadingWindowManagerRef.current.getTotalAssetCount(),\r\n isLoading: loadingWindowManagerRef.current.isLoading,\r\n isCompleted: loadingWindowManagerRef.current.isCompleted,\r\n\r\n // for debug/logging only\r\n // loadingWindowManagerRef,\r\n // filtersRef,\r\n };\r\n};\r\n","import { useRef } from 'react';\r\n\r\nimport { DEFAULT_PAGE_SIZE } from '../../model';\r\n\r\nimport { useAssetsServiceBase } from './base/use-assets-service-base';\r\nimport { InitialReducerState, defaultReducer, sequenceWindowReducer } from './base/assets-reducer-base';\r\nimport { SequenceAssetsWindowManager } from './base/assets-window-manager';\r\n\r\nexport const useBasicAssetsService = ({ repository, pageSize = DEFAULT_PAGE_SIZE }) => {\r\n const service = useAssetsServiceBase({\r\n reducer: defaultReducer,\r\n reducerInitialArg: InitialReducerState,\r\n repository,\r\n pageSize,\r\n });\r\n\r\n return service;\r\n};\r\n\r\nexport const useMultiSourceAssetsService = ({ repository, pageSize = DEFAULT_PAGE_SIZE, dataSourceNames }) => {\r\n const assetWindowManagerRef = useRef(new SequenceAssetsWindowManager(pageSize, dataSourceNames));\r\n const service = useAssetsServiceBase({\r\n reducer: sequenceWindowReducer,\r\n reducerInitialArg: InitialReducerState,\r\n repository,\r\n pageSize,\r\n assetWindowManager: assetWindowManagerRef.current,\r\n });\r\n\r\n return {\r\n ...service,\r\n getAssetCountBySource: () => assetWindowManagerRef.current.getAssetCountBySource(),\r\n };\r\n};\r\n","/* eslint-disable arrow-body-style */\r\nimport { useCallback, useState } from 'react';\r\nimport { Promise } from 'bluebird';\r\nimport { get } from 'underscore';\r\nimport { CSMLAssetSource } from '../../model';\r\n\r\nexport const useEditImageService = ({\r\n repository,\r\n logger,\r\n}) => {\r\n const [imagesWithFilter, setImagesWithFilter] = useState([]);\r\n const [imagesWithFilterAndBlur, setImagesWithFilterAndBlur] = useState([]);\r\n\r\n const getImagesWithFilter = useCallback((imageUrl) => {\r\n return repository.generateImageWithSmartEffect({\r\n imageUrl,\r\n smartEffects: [{\r\n smartEffectName: 'design_ideas',\r\n smartEffectOptions: {},\r\n }],\r\n }).then((res = []) => {\r\n const filterRes = res.map(filter => ({\r\n filter: filter.Effect,\r\n url: filter.Resource,\r\n }));\r\n filterRes.unshift({\r\n url: imageUrl,\r\n filter: 'None',\r\n });\r\n setImagesWithFilter(filterRes);\r\n logger.logTrace('edit image services: get image filters successfully');\r\n return filterRes;\r\n }).catch((err) => {\r\n logger.logError('edit image services: get image filters failed', err);\r\n return [];\r\n });\r\n }, [logger, repository]);\r\n\r\n const getImagesWithFilterAndBlurImp = useCallback((imageUrl, blurLevel) => {\r\n return repository.generateImageWithSmartEffect({\r\n imageUrl,\r\n smartEffects: [{\r\n smartEffectName: 'bg_blur',\r\n smartEffectOptions: blurLevel ? {\r\n ManualBgBlurLevel: blurLevel,\r\n } : {},\r\n },\r\n {\r\n smartEffectName: 'design_ideas',\r\n smartEffectOptions: {},\r\n },\r\n ],\r\n }).then((assets = []) => {\r\n return assets;\r\n });\r\n }, [repository]);\r\n\r\n const getOriginalImageWithBlur = useCallback((imageUrl, blurLevel) => {\r\n return repository.generateImageWithSmartEffect({\r\n imageUrl,\r\n smartEffects: [{\r\n smartEffectName: 'bg_blur',\r\n smartEffectOptions: blurLevel ? {\r\n ManualBgBlurLevel: blurLevel,\r\n } : {},\r\n }],\r\n }).then((assets = []) => {\r\n return assets;\r\n });\r\n }, [repository]);\r\n\r\n const getImagesWithFilterAndBlur = useCallback((imageUrl, blurLevel) => {\r\n return Promise.all([getOriginalImageWithBlur(imageUrl, blurLevel), getImagesWithFilterAndBlurImp(imageUrl, blurLevel)]).then(([originalImageWithBlurRes, imagesWithFilterAndBlurRes]) => {\r\n const res = [...originalImageWithBlurRes, ...imagesWithFilterAndBlurRes];\r\n const imagesWithFilterAndBlurInner = res.map((asset) => {\r\n const filter = get(asset, 'Effect', '');\r\n const url = get(asset, 'Resource', '');\r\n return {\r\n filter,\r\n blur: blurLevel,\r\n url,\r\n };\r\n });\r\n setImagesWithFilterAndBlur(imagesWithFilterAndBlurInner);\r\n logger.logTrace('edit image services: get image filters and blur successfully');\r\n return imagesWithFilterAndBlurInner;\r\n });\r\n }, [getImagesWithFilterAndBlurImp, getOriginalImageWithBlur, logger]);\r\n\r\n const removeImageBackground = useCallback((imageUrl) => {\r\n return repository.removeImageBackground(imageUrl);\r\n }, [repository]);\r\n\r\n const generateImageBackground = useCallback(({\r\n prompt,\r\n imageUrl,\r\n maskSetsBase64,\r\n selectedMasks,\r\n outputImageWidth,\r\n outputImageHeight,\r\n }) => {\r\n return repository.generateImageBackground({\r\n prompt,\r\n imageUrl,\r\n maskSetsBase64,\r\n selectedMasks,\r\n outputImageWidth,\r\n outputImageHeight,\r\n }).then((res) => {\r\n const { imageUrl: newImageUrl } = res || {};\r\n logger.logTrace('edit image services: generate image background successfully', { generatedUrl: newImageUrl, prompt });\r\n return res;\r\n });\r\n }, [logger, repository]);\r\n\r\n const getImageSegmentations = useCallback((imageUrl) => {\r\n return repository.getImageSegmentations(imageUrl).then((res) => {\r\n logger.logTrace('edit image services: get image segmentations successfully', { originalUrl: imageUrl });\r\n return res;\r\n });\r\n }, [logger, repository]);\r\n\r\n // Save function for background change generated image\r\n const saveImageCopy = useCallback(({\r\n image,\r\n folderId = null,\r\n }) => {\r\n const imageUrl = image.url;\r\n return repository.saveImageCopy({\r\n imageUrl,\r\n folderId,\r\n sourceType: CSMLAssetSource.BackgroundChangeGenerated,\r\n }).then((res) => {\r\n logger.logTrace('edit image services: image is saved as copy', { imageUrl, folderId });\r\n return res;\r\n });\r\n }, [logger, repository]);\r\n\r\n const saveImage = useCallback(({\r\n id,\r\n type,\r\n url,\r\n }) => {\r\n return repository.saveImage({\r\n imageUrl: url,\r\n imageId: id,\r\n type,\r\n }).then((res) => {\r\n logger.logTrace('edit image services: image is saved directly', { url, id });\r\n return res;\r\n });\r\n }, [logger, repository]);\r\n\r\n const cropImage = useCallback(({ imageId, cropSettings, placementSettings }) => {\r\n return repository.cropImage({ imageId, cropSettings, placementSettings }).then(() => {\r\n logger.logTrace('edit image services: image is cropping', { imageId });\r\n });\r\n }, [logger, repository]);\r\n\r\n const getImageById = useCallback(({ imageId, isImageFittingEnabled }) => {\r\n return repository.getImageById({ imageId, isImageFittingEnabled }).then((res) => {\r\n logger.logTrace('edit image services: get image by id', { imageId });\r\n return res;\r\n });\r\n }, [logger, repository]);\r\n\r\n const uploadImageToFolder = useCallback(({\r\n imageData,\r\n folderId = null,\r\n }) => {\r\n return repository.uploadImageToFolder({\r\n imageData,\r\n folderId,\r\n });\r\n }, [repository]);\r\n\r\n const saveImageWithBaseId = useCallback(({\r\n image,\r\n baseId,\r\n folderId = null,\r\n }) => {\r\n return repository.saveImageWithBaseId({ image, baseId, folderId });\r\n }, [repository]);\r\n\r\n const uploadStockImage = useCallback(({ stockImageId, folderId }) => {\r\n return repository.uploadStockImageToFolder({ stockImageId, folderId }).tap(() => {\r\n logger.logTrace('edit image services: stock image is uploaded to folder', { stockImageId, folderId });\r\n });\r\n }, [logger, repository]);\r\n\r\n const moveImageToFolder = useCallback(({\r\n image,\r\n destFolderId,\r\n }) => {\r\n return repository.moveImageToFolder({\r\n image,\r\n destFolderId,\r\n });\r\n }, [repository]);\r\n\r\n const imageFit = useCallback(({\r\n imageUrl,\r\n placements,\r\n skipOutpainting,\r\n }) => {\r\n return repository.imageFit({\r\n imageUrl,\r\n placements,\r\n skipOutpainting,\r\n });\r\n }, [repository]);\r\n\r\n const addImageWithBaseIdToFolder = useCallback(({\r\n imageSrc, baseId, folderId, metaData,\r\n }) => {\r\n return repository.addImageWithBaseIdToFolder({\r\n imageSrc,\r\n baseId,\r\n folderId,\r\n metaData,\r\n });\r\n }, [repository]);\r\n\r\n return {\r\n getImagesWithFilter,\r\n getImagesWithFilterAndBlur,\r\n imagesWithFilter,\r\n imagesWithFilterAndBlur,\r\n removeImageBackground,\r\n generateImageBackground,\r\n getImageSegmentations,\r\n saveImage,\r\n saveImageCopy,\r\n cropImage,\r\n getImageById,\r\n uploadImageToFolder,\r\n saveImageWithBaseId,\r\n uploadStockImage,\r\n moveImageToFolder,\r\n imageFit,\r\n addImageWithBaseIdToFolder,\r\n };\r\n};\r\n","import { useCallback, useMemo, useRef, useState, useEffect } from 'react';\r\nimport _ from 'underscore';\r\nimport Promise from 'bluebird';\r\n\r\nimport { checkVideosIntermediateStatus, FolderAssetType } from '../../model';\r\nimport { getTaskPoller } from '../task-poller';\r\n\r\n// below fields will be impacted along with status change\r\nconst VideoChangedFieldsWithStatusUpdate = [\r\n 'thumbnailUrl',\r\n 'url',\r\n 'width',\r\n 'height',\r\n 'durationInMS',\r\n 'status',\r\n];\r\n\r\nexport const useVideoTaskPoller = ({\r\n repository,\r\n logger,\r\n assets,\r\n interval,\r\n}) => {\r\n const latestTimestampRef = useRef(0);\r\n const [videoUpdated, setVideoUpdated] = useState({}); // sample: { 123: { .. } }\r\n const getVideoTaskStatus = useCallback((videoTasks) => {\r\n const requestTimestamp = Date.now();\r\n const videosToCheck = _.keys(videoTasks);\r\n\r\n return repository.updateVideoStatusByIds(videosToCheck).then((response) => {\r\n // if multipe requests are sent out, ensure to keep the result from the latest request\r\n let notFinishedTaskList = {};\r\n let newVideoUpdated = {};\r\n if (requestTimestamp > latestTimestampRef.current) {\r\n const responseKeys = [];\r\n\r\n response.forEach((item) => {\r\n responseKeys.push(item.id);\r\n newVideoUpdated = {\r\n ...newVideoUpdated,\r\n [item.id]: _.pick(item, VideoChangedFieldsWithStatusUpdate),\r\n };\r\n\r\n if (item && checkVideosIntermediateStatus(item)) {\r\n notFinishedTaskList = { ...notFinishedTaskList, [item.id]: item.status };\r\n }\r\n });\r\n\r\n // eslint-disable-next-line no-param-reassign\r\n latestTimestampRef.current = requestTimestamp;\r\n }\r\n\r\n setVideoUpdated(newVideoUpdated);\r\n\r\n const taskCount = Object.keys(notFinishedTaskList).length;\r\n\r\n return { totalCount: taskCount };\r\n }).catch(() => {\r\n // log and ignore the error\r\n logger.logError('Failed to get videos task status.');\r\n });\r\n }, [logger, repository]);\r\n\r\n const newVideoTasks = useRef({});\r\n const isPollerRunning = useRef(false);\r\n\r\n const currentTaskPoller = useRef(null);\r\n\r\n const startVideoTaskStatusPoller = useCallback(() => {\r\n const taskPoller = getTaskPoller({\r\n task: () => {\r\n isPollerRunning.current = true;\r\n\r\n const queryPromise = _.isEmpty(newVideoTasks.current)\r\n ? Promise.resolve({ totalCount: 0 })\r\n : getVideoTaskStatus(newVideoTasks.current);\r\n\r\n return queryPromise.then((res) => {\r\n const { totalCount } = res || {};\r\n\r\n const isFinished = totalCount === 0;\r\n\r\n if (isFinished) {\r\n isPollerRunning.current = false;\r\n }\r\n\r\n return { isFinished };\r\n });\r\n },\r\n interval,\r\n });\r\n taskPoller.start();\r\n const stopPoller = () => {\r\n taskPoller.stop();\r\n isPollerRunning.current = false;\r\n };\r\n return { stopPoller };\r\n }, [getVideoTaskStatus, interval]);\r\n\r\n useEffect(() => {\r\n newVideoTasks.current = assets ? assets.reduce((prev, asset) => {\r\n if (asset.folderAssetType === FolderAssetType.Video && checkVideosIntermediateStatus(asset)) {\r\n return { ...prev, [asset.id]: asset.status };\r\n }\r\n return prev;\r\n }, {}) : {};\r\n\r\n // start pollerif there are no running poller\r\n if (!isPollerRunning.current && !_.isEmpty(newVideoTasks.current)) {\r\n const { stopPoller } = startVideoTaskStatusPoller();\r\n currentTaskPoller.current = stopPoller;\r\n }\r\n\r\n // stop poller when component unmount.\r\n return () => {\r\n if (currentTaskPoller.current && isPollerRunning.current) {\r\n currentTaskPoller.current();\r\n }\r\n };\r\n }, [assets, startVideoTaskStatusPoller]);\r\n\r\n const returnVal = useMemo(() => ({\r\n videoUpdated,\r\n }), [videoUpdated]);\r\n\r\n return returnVal;\r\n};\r\n","/* istanbul ignore file */\r\nimport { useCallback, useEffect, } from 'react';\r\nimport { getSessionStorage } from '@bingads-webui/storage';\r\nimport { useAdsStudioServices, getTaskPoller } from '../services';\r\n\r\n// use session storeage to sync the in progress tasks count between\r\n// asset-library pages and summary bar\r\n\r\nconst KEY = 'ASSET_LIBRARY_STORAGE';\r\n\r\nconst updateInProgressTasksStatus = (inProgressTaskCount) => {\r\n const ss = getSessionStorage();\r\n if (ss.supportsStorage()) {\r\n if (inProgressTaskCount > 0) {\r\n ss.set(KEY, { inProgressTaskCount });\r\n } else {\r\n ss.invalidate(KEY);\r\n }\r\n }\r\n};\r\n\r\nconst clearInProgressTaskStatus = () => updateInProgressTasksStatus(0);\r\n\r\nexport const ImageCroppingTaskStatusPoller = ({ interval }) => {\r\n //\r\n const { getImageCroppingTaskStatus, croppingTaskUpdated } = useAdsStudioServices();\r\n\r\n const startImageCroppingTaskStatusPoller = useCallback(() => {\r\n const taskPoller = getTaskPoller({\r\n task: () => getImageCroppingTaskStatus().then((res) => {\r\n const { totalCount } = res || {};\r\n updateInProgressTasksStatus(totalCount || 0);\r\n return { isFinished: totalCount === 0 };\r\n }),\r\n interval,\r\n });\r\n taskPoller.start();\r\n const stopPoller = () => {\r\n taskPoller.stop();\r\n clearInProgressTaskStatus();\r\n };\r\n return { stopPoller };\r\n }, [getImageCroppingTaskStatus, interval]);\r\n\r\n // query in progress task stasus, and update summary-bar status accordingly\r\n useEffect(() => {\r\n const { stopPoller } = startImageCroppingTaskStatusPoller();\r\n return () => stopPoller();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [croppingTaskUpdated]);\r\n\r\n return null;\r\n};\r\n","/* istanbul ignore file */\r\nimport { useCallback, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport Promise from 'bluebird';\r\nimport _ from 'underscore';\r\n\r\nimport { getSessionStorage } from '@bingads-webui/storage';\r\nimport { useAdsStudioServices, getTaskPoller } from '../services';\r\nimport { FolderAssetType, checkVideosIntermediateStatus } from '../model';\r\n\r\n// use session storeage to sync the in progress tasks count between\r\n// asset-library pages and summary bar\r\n\r\nconst KEY = 'ASSET_LIBRARY_STORAGE';\r\n\r\nconst updateInProgressTasksStatus = (inProgressTaskCount) => {\r\n const ss = getSessionStorage();\r\n if (ss.supportsStorage()) {\r\n if (inProgressTaskCount > 0) {\r\n ss.set(KEY, { inProgressTaskCount });\r\n } else {\r\n ss.invalidate(KEY);\r\n }\r\n }\r\n};\r\n\r\nexport const VideoTaskStatusPoller = ({ interval }) => {\r\n const {\r\n getVideoTaskStatus,\r\n assets,\r\n } = useAdsStudioServices();\r\n\r\n const newVideoTasks = useRef({});\r\n const isPollerRunning = useRef(false);\r\n\r\n const currentTaskPoller = useRef(null);\r\n\r\n const startVideoTaskStatusPoller = useCallback(() => {\r\n const taskPoller = getTaskPoller({\r\n task: () => {\r\n isPollerRunning.current = true;\r\n\r\n const queryPromise = _.isEmpty(newVideoTasks.current)\r\n ? Promise.resolve({ totalCount: 0 })\r\n : getVideoTaskStatus(newVideoTasks.current);\r\n\r\n return queryPromise.then((res) => {\r\n const { totalCount } = res || {};\r\n\r\n updateInProgressTasksStatus(totalCount || 0);\r\n\r\n const isFinished = totalCount === 0;\r\n\r\n if (isFinished) {\r\n isPollerRunning.current = false;\r\n }\r\n\r\n return { isFinished };\r\n });\r\n },\r\n interval,\r\n });\r\n taskPoller.start();\r\n const stopPoller = () => {\r\n taskPoller.stop();\r\n isPollerRunning.current = false;\r\n };\r\n return { stopPoller };\r\n }, [getVideoTaskStatus, interval]);\r\n\r\n useEffect(() => {\r\n newVideoTasks.current = assets ? assets.reduce((prev, asset) => {\r\n if (asset.folderAssetType === FolderAssetType.Video && checkVideosIntermediateStatus(asset)) {\r\n return { ...prev, [asset.id]: asset.status };\r\n }\r\n return prev;\r\n }, {}) : {};\r\n\r\n // start pollerif there are no running poller\r\n if (!isPollerRunning.current && !_.isEmpty(newVideoTasks.current)) {\r\n const { stopPoller } = startVideoTaskStatusPoller();\r\n currentTaskPoller.current = stopPoller;\r\n }\r\n\r\n // stop poller when component unmount.\r\n return () => {\r\n if (currentTaskPoller.current && isPollerRunning.current) {\r\n currentTaskPoller.current();\r\n }\r\n };\r\n }, [assets, startVideoTaskStatusPoller]);\r\n\r\n return null;\r\n};\r\n\r\nVideoTaskStatusPoller.propTypes = {\r\n interval: PropTypes.number.isRequired,\r\n};\r\n","/* istanbul ignore file */\r\nimport React from 'react';\r\nimport hoistNonReactStatics from 'hoist-non-react-statics';\r\nimport { ImageCroppingTaskStatusPoller } from './image-cropping-task-status-poller';\r\nimport { VideoTaskStatusPoller } from './video-task-status-poller';\r\n\r\nexport const withAssetTaskStatusPoller = (Component) => {\r\n const Wrapper = props => (\r\n <>\r\n <Component {...props} />\r\n <ImageCroppingTaskStatusPoller interval={10000} />\r\n <VideoTaskStatusPoller interval={10000} />\r\n </>\r\n );\r\n\r\n Wrapper.displayName = `withAssetTaskStatusPoller(${Component.displayName || Component.name})`;\r\n hoistNonReactStatics(Wrapper, Component);\r\n\r\n return Wrapper;\r\n};\r\n","import React, { useState, useMemo, useCallback, useRef, useEffect } from 'react';\r\nimport {\r\n Menu,\r\n Button,\r\n MenuButton,\r\n MenuList,\r\n MenuDivider,\r\n MenuPopover,\r\n MenuTrigger,\r\n MenuItemRadio,\r\n makeStyles,\r\n tokens,\r\n shorthands,\r\n Label,\r\n Input,\r\n useId,\r\n mergeClasses,\r\n Popover,\r\n PopoverTrigger,\r\n PopoverSurface,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n ChevronRight20Filled,\r\n ChevronRight20Regular,\r\n CalendarLtr20Regular,\r\n bundleIcon,\r\n} from '@fluentui/react-icons';\r\nimport {\r\n SimpleDateRangePicker,\r\n} from './simple-date-range-picker';\r\nimport {\r\n CSMLTimeFrame,\r\n} from '../../model';\r\nimport {\r\n civilDateRangeEqual,\r\n} from '../../utils';\r\n\r\n\r\nconst ChevronRightIcon = bundleIcon(ChevronRight20Filled, ChevronRight20Regular);\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '240px',\r\n ...shorthands.padding('4px'),\r\n },\r\n menuButton: {\r\n // This is a known fluent ui issue between Popover and MenuButton: https://github.com/microsoft/fluentui/issues/31804\r\n // This bug has been fixed in the latest version, but as we use legacy version, update the style as a workaround.\r\n backgroundColor: 'transparent',\r\n '&[aria-expanded=\"true\"]': {\r\n backgroundColor: '#EBEBEB',\r\n },\r\n },\r\n unselectedMenuButton: {\r\n '&[aria-expanded=\"false\"]': {\r\n fontWeight: 'unset',\r\n },\r\n },\r\n enabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n },\r\n disabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n});\r\n\r\nconst useCustomItemStyles = makeStyles({\r\n menuPopover: {\r\n maxWidth: 'unset',\r\n '& .compared-date-range-picker-dialog': {\r\n top: 'auto !important',\r\n left: 'auto !important',\r\n right: 'auto !important',\r\n width: 'auto !important',\r\n height: 'auto !important',\r\n paddingLeft: '14px',\r\n paddingRight: '14px',\r\n paddingTop: '14px',\r\n position: 'relative',\r\n boxShadow: 'none',\r\n ...shorthands.border('0px', 'none'),\r\n },\r\n },\r\n item: {\r\n '& .fui-MenuItem__content': {\r\n display: 'flex',\r\n paddingRight: '0px',\r\n },\r\n },\r\n text: {\r\n flexGrow: '1',\r\n },\r\n icon: {\r\n },\r\n startDate: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n maxWidth: '160px',\r\n },\r\n endDate: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n marginBottom: '6px',\r\n maxWidth: '160px',\r\n },\r\n input: {\r\n paddingRight: '0px',\r\n height: '32px',\r\n lineHeight: '32px',\r\n overflowX: 'hidden',\r\n overflowY: 'hidden',\r\n },\r\n contentAfter: {\r\n paddingRight: '6px',\r\n paddingLeft: '8px',\r\n '& svg': {\r\n display: 'block',\r\n },\r\n },\r\n contentLabel: {\r\n marginBottom: '6px',\r\n marginTop: '8px',\r\n },\r\n});\r\n\r\nconst CustomItem = (props) => {\r\n const {\r\n i18n,\r\n isCustomSelected,\r\n timeZone,\r\n customDateRange,\r\n setCustomDateRange,\r\n customRangeStartStr,\r\n customRangeEndStr,\r\n name,\r\n customOption,\r\n } = props;\r\n\r\n const classes = useCustomItemStyles();\r\n const menuItemRef = useRef(null);\r\n const startDateId = useId('startDate');\r\n const afterStartDateId = useId('afterStartDateId');\r\n const startDateRef = useRef(null);\r\n const endDateId = useId('endDate');\r\n const afterEndDateId = useId('afterEndDateId');\r\n const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);\r\n const isOpen = useMemo(() => isDatePickerOpen && isCustomSelected, [isDatePickerOpen, isCustomSelected]);\r\n const onOpenChange = (e, data) => {\r\n setIsDatePickerOpen(data.open);\r\n };\r\n\r\n // date range picker related handling\r\n // selecting 'start' or 'end' on date range picker\r\n const isSelectingStartDate = useRef(true);\r\n\r\n const onSelectedDateRangeChange = useCallback((newRange) => {\r\n setCustomDateRange(newRange);\r\n }, [setCustomDateRange]);\r\n\r\n const openDatePickerForStart = useCallback(() => {\r\n setIsDatePickerOpen(true);\r\n isSelectingStartDate.current = true;\r\n }, []);\r\n\r\n const openDatePickerForEnd = useCallback(() => {\r\n setIsDatePickerOpen(true);\r\n isSelectingStartDate.current = false;\r\n }, []);\r\n\r\n const onStartKeyDown = useCallback((event) => {\r\n if (event.code === 'Enter') {\r\n openDatePickerForStart();\r\n event.preventDefault();\r\n } else if (event.code === 'ArrowUp') {\r\n if (menuItemRef.current) {\r\n menuItemRef.current.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n }, [openDatePickerForStart]);\r\n\r\n const onEndKeyDown = useCallback((event) => {\r\n if (event.code === 'Enter') {\r\n openDatePickerForEnd();\r\n event.preventDefault();\r\n } else if (event.code === 'ArrowUp') {\r\n if (startDateRef.current) {\r\n startDateRef.current.focus();\r\n event.preventDefault();\r\n }\r\n }\r\n }, [openDatePickerForEnd]);\r\n\r\n return (\r\n <>\r\n <Menu open={isOpen} onOpenChange={onOpenChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuItemRadio ref={menuItemRef} name={name} value={customOption.key} hasSubmenu className={classes.item}>\r\n <span className={classes.text}>\r\n {customOption.text}\r\n </span>\r\n <span className={classes.icon}>\r\n <ChevronRightIcon />\r\n </span>\r\n </MenuItemRadio>\r\n </MenuTrigger>\r\n\r\n <MenuPopover className={classes.menuPopover}>\r\n <MenuList>\r\n <SimpleDateRangePicker\r\n i18n={i18n}\r\n defaultSelectedDateRange={customDateRange}\r\n defaultIsSelectingStartDate={isSelectingStartDate.current}\r\n onDateRangeChange={onSelectedDateRangeChange}\r\n timeZone={timeZone}\r\n />\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n {isCustomSelected && (\r\n <div className=\"custom-date-range\">\r\n <div className={classes.startDate}>\r\n <Label className={classes.contentLabel} htmlFor={startDateId}>{i18n.getString(_TL_('Start date'))}</Label>\r\n <Input\r\n className={mergeClasses(classes.input, 'start-date-input')}\r\n ref={startDateRef}\r\n onClick={() => openDatePickerForStart()}\r\n onKeyDown={onStartKeyDown}\r\n readOnly\r\n contentAfter={\r\n <div className={classes.contentAfter} id={afterStartDateId}>\r\n <CalendarLtr20Regular />\r\n </div>\r\n }\r\n value={customRangeStartStr}\r\n aria-labelledby={`${startDateId} ${afterStartDateId}`}\r\n id={startDateId}\r\n />\r\n </div>\r\n <div className={classes.endDate}>\r\n <Label className={classes.contentLabel} htmlFor={endDateId}>{i18n.getString(_TL_('End date'))}</Label>\r\n <Input\r\n className={mergeClasses(classes.input, 'end-date-input')}\r\n onClick={() => openDatePickerForEnd()}\r\n onKeyDown={onEndKeyDown}\r\n readOnly\r\n contentAfter={\r\n <div className={classes.contentAfter} id={afterEndDateId}>\r\n <CalendarLtr20Regular />\r\n </div>\r\n }\r\n value={customRangeEndStr}\r\n aria-labelledby={`${endDateId} ${afterEndDateId}`}\r\n id={endDateId}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport const DateAddedFilter = (props) => {\r\n const {\r\n i18n,\r\n dateFormat,\r\n timeZone,\r\n defaultTimeFrame,\r\n defaultCustomDateRange,\r\n options,\r\n onChange,\r\n forceClear,\r\n onDismiss,\r\n defaultOpen = false,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const name = 'date';\r\n const [checkedValues, setCheckedValues] = useState({\r\n [name]: [defaultTimeFrame],\r\n });\r\n const isCustomSelected = useMemo(() => checkedValues[name].includes(CSMLTimeFrame.Custom), [checkedValues]);\r\n const customOption = useMemo(() => options.find(option => option.key === CSMLTimeFrame.Custom), [options]);\r\n const optionsWithoutCustom = useMemo(() => options.filter(option => option.key !== CSMLTimeFrame.Custom), [options]);\r\n // date range user selected for 'Custom'\r\n const [customDateRange, setCustomDateRange] = useState(defaultCustomDateRange);\r\n\r\n // dropdown related handling\r\n const formatDate = useCallback(\r\n date => i18n.formatCivilDate(date, { raw: dateFormat, timeZone }),\r\n [dateFormat, i18n, timeZone]\r\n );\r\n\r\n const customRangeStartStr = useMemo(\r\n () => formatDate(customDateRange.start),\r\n [formatDate, customDateRange.start]\r\n );\r\n\r\n const customRangeEndStr = useMemo(\r\n () => formatDate(customDateRange.end),\r\n [formatDate, customDateRange.end]\r\n );\r\n\r\n const selectedChoice = useMemo(\r\n () => options.find(r => r.key === checkedValues[name][0]),\r\n [checkedValues, options]\r\n );\r\n\r\n // the string shown on dropdown title\r\n const dropdownTitle = useMemo(() => {\r\n if (!selectedChoice) {\r\n return null;\r\n }\r\n if (selectedChoice.key === CSMLTimeFrame.Custom) {\r\n return `${customRangeStartStr} - ${customRangeEndStr}`;\r\n }\r\n return selectedChoice.text;\r\n }, [customRangeEndStr, customRangeStartStr, selectedChoice]);\r\n\r\n // when the X button on dropdown title is clicked\r\n const onDropdownClear = useCallback(() => {\r\n if (onChange && defaultTimeFrame !== CSMLTimeFrame.Anytime) {\r\n onChange({ timeframe: CSMLTimeFrame.Anytime, customDateRange });\r\n }\r\n if (onDismiss) {\r\n onDismiss();\r\n }\r\n }, [customDateRange, defaultTimeFrame, onChange, onDismiss]);\r\n\r\n // when dropdown list is dismissed\r\n const onDropdownDismiss = useCallback(() => {\r\n const timeframe = checkedValues[name][0];\r\n if (timeframe && onChange) {\r\n if (defaultTimeFrame !== timeframe\r\n || !civilDateRangeEqual(defaultCustomDateRange, customDateRange)) {\r\n onChange({ timeframe, customDateRange }, dropdownTitle);\r\n }\r\n }\r\n }, [checkedValues, customDateRange, defaultCustomDateRange, defaultTimeFrame, dropdownTitle, onChange]);\r\n\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n const clear = useCallback(() => {\r\n setIsOpen(false);\r\n setCheckedValues(() => ({\r\n [name]: [],\r\n }));\r\n onDropdownClear();\r\n }, [onDropdownClear]);\r\n\r\n const onCheckedValueChange = (e, data) => {\r\n const {\r\n checkedItems,\r\n } = data;\r\n setCheckedValues(s => ({\r\n ...s,\r\n [name]: checkedItems,\r\n }));\r\n if (checkedItems && checkedItems.length > 0 && checkedItems[0] !== CSMLTimeFrame.Custom) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n const isSelected = useMemo(() => checkedValues[name].length > 0 && checkedValues[name][0] !== CSMLTimeFrame.Anytime, [checkedValues]);\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n useEffect(() => {\r\n if (forceClear) {\r\n clear();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [forceClear]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n onDropdownDismiss();\r\n }\r\n }, [isOpen, onDropdownDismiss]);\r\n\r\n return (\r\n <Popover trapFocus open={isOpen} onOpenChange={onOpenChange} positioning=\"below-start\">\r\n <PopoverTrigger disableButtonEnhancement>\r\n <MenuButton appearance=\"subtle\" className={isSelected ? mergeClasses(classes.menuButton, 'date-filter-button') : mergeClasses(classes.menuButton, classes.unselectedMenuButton, 'date-filter-button')}>\r\n {isSelected ? dropdownTitle : i18n.getString(_TL_('Date added'))}\r\n </MenuButton>\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface className={mergeClasses(classes.menuPopover, 'date-filter-menu')}>\r\n <MenuList checkedValues={checkedValues} onCheckedValueChange={onCheckedValueChange} hasCheckmarks>\r\n {optionsWithoutCustom.map(option => (\r\n <MenuItemRadio key={option.key} name={name} value={option.key}>\r\n {option.text}\r\n </MenuItemRadio>\r\n ))}\r\n {customOption &&\r\n <CustomItem\r\n i18n={i18n}\r\n checkedValues={checkedValues}\r\n isCustomSelected={isCustomSelected}\r\n customDateRange={customDateRange}\r\n timeZone={timeZone}\r\n setCustomDateRange={setCustomDateRange}\r\n customOption={customOption}\r\n customRangeStartStr={customRangeStartStr}\r\n customRangeEndStr={customRangeEndStr}\r\n name={name}\r\n />}\r\n <MenuDivider />\r\n </MenuList>\r\n <div>\r\n <Button\r\n className={isSelected ? classes.enabledClearButton : classes.disabledClearButton}\r\n disabled={!isSelected}\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => clear()}\r\n >\r\n {i18n.getString(_TL_('Clear'))}\r\n </Button>\r\n </div>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\n","import React from 'react';\r\nimport { SearchBox } from '@fluentui/react-search';\r\nimport {\r\n makeStyles,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\n\r\nconst useStyles = makeStyles({\r\n searchBox: {\r\n minWidth: '300px',\r\n '& input[type=\"search\"]': {\r\n backgroundImage: 'none',\r\n backgroundSize: 'unset',\r\n paddingLeft: '4px',\r\n },\r\n '& input[type=\"search\"]::placeholder ': {\r\n color: '#707070',\r\n },\r\n },\r\n});\r\n\r\nexport const SearchBoxFilter = (props) => {\r\n const {\r\n i18n,\r\n className,\r\n onSearchTextChanging,\r\n onSearchTextChange,\r\n onSearchTextBlur,\r\n onSearchTextClear,\r\n defaultSearchText,\r\n searchboxPlaceHolder,\r\n autoFocus,\r\n ariaLabel,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={className}>\r\n <SearchBox\r\n autoFocus={autoFocus}\r\n className={mergeClasses('search-box', classes.searchBox)}\r\n aria-label={ariaLabel || ''}\r\n placeholder={searchboxPlaceHolder || i18n.getString(_TL_('Search by asset and folder name or ID'))}\r\n defaultValue={defaultSearchText}\r\n onChange={(e, data) => {\r\n if (data.value === '' && e.type === 'click') {\r\n onSearchTextClear(data);\r\n } else {\r\n onSearchTextChanging(e, data.value);\r\n }\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n onSearchTextChange(e.target.value);\r\n }\r\n }}\r\n onBlur={() => {\r\n onSearchTextBlur();\r\n }}\r\n />\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n makeStyles,\r\n mergeClasses,\r\n shorthands,\r\n} from '@fluentui/react-components';\r\nimport { ToggleButtons } from '@bingads-webui-campaign-react/ads-studio-shared-components';\r\n\r\nconst useStyles = makeStyles({\r\n toggleButton: {\r\n minWidth: 'unset',\r\n fontWeight: 'unset',\r\n },\r\n toggleButtons: {\r\n display: 'flex',\r\n columnGap: '8px',\r\n },\r\n selectedButton: {\r\n minWidth: 'unset',\r\n backgroundColor: '#EBF3FC',\r\n ...shorthands.border('1px', 'solid', '#B4D6FA'),\r\n color: '#115EA3',\r\n },\r\n});\r\n\r\nexport const AssetTypeToggleButtonsFilter = (props) => {\r\n const {\r\n className,\r\n options,\r\n optionsState,\r\n toggleSelectedOption,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={className}>\r\n <div className={mergeClasses('asset-type-filter', classes.toggleButtons)}>\r\n <ToggleButtons\r\n options={options}\r\n classes={classes}\r\n optionsState={optionsState}\r\n toggleSelectedOption={toggleSelectedOption}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useMemo, useEffect } from 'react';\r\nimport {\r\n Menu,\r\n MenuButton,\r\n MenuList,\r\n MenuPopover,\r\n MenuTrigger,\r\n MenuItemRadio,\r\n makeStyles,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n ArrowSort20Regular,\r\n ArrowSortUp20Regular,\r\n ArrowSortDown20Regular,\r\n} from '@fluentui/react-icons';\r\nimport {\r\n CSMLSortIcon,\r\n CSMLSortBy,\r\n} from '../../model';\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '180px',\r\n },\r\n item: {\r\n '& .fui-MenuItem__content': {\r\n display: 'flex',\r\n },\r\n },\r\n});\r\n\r\nexport const SortByFilter = (props) => {\r\n const {\r\n className,\r\n options,\r\n sortBy,\r\n onChange,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const name = 'sortBy';\r\n const [checkedValues, setCheckedValues] = useState({\r\n [name]: [sortBy || CSMLSortBy.MostRecent],\r\n });\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const onCheckedValueChange = (e, data) => {\r\n const {\r\n checkedItems,\r\n } = data;\r\n setCheckedValues(s => ({\r\n ...s,\r\n [name]: checkedItems,\r\n }));\r\n onChange(e, {\r\n key: checkedItems[0],\r\n });\r\n };\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n const selectedOptionMemo = useMemo(() => {\r\n const selectedOption = options.find(option => option.key === checkedValues[name][0]);\r\n return selectedOption ?\r\n <>\r\n {selectedOption.text}\r\n {selectedOption.icon && selectedOption.icon === CSMLSortIcon.SortUp && <ArrowSortUp20Regular />}\r\n {selectedOption.icon && selectedOption.icon === CSMLSortIcon.SortDown && <ArrowSortDown20Regular />}\r\n </> : '';\r\n }, [checkedValues, options]);\r\n\r\n // As, this could be modified by the parent component, we need to update the checkedValues\r\n useEffect(() => {\r\n if (sortBy === checkedValues[name][0]) {\r\n return;\r\n }\r\n if (sortBy == null) {\r\n return;\r\n }\r\n setCheckedValues({\r\n [name]: [sortBy],\r\n });\r\n }, [checkedValues, sortBy]);\r\n\r\n return (\r\n <div className={mergeClasses(className, 'sort-by-filter')}>\r\n <Menu open={isOpen} checkedValues={checkedValues} onCheckedValueChange={onCheckedValueChange} hasCheckmarks onOpenChange={onOpenChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuButton icon={<ArrowSort20Regular />}>\r\n {selectedOptionMemo}\r\n </MenuButton>\r\n </MenuTrigger>\r\n\r\n <MenuPopover className={mergeClasses('sort-filter-list', classes.menuPopover)}>\r\n <MenuList>\r\n {\r\n options.map((option, index) => (\r\n <MenuItemRadio key={option.key} name={name} value={option.key} className={option.icon ? mergeClasses(classes.item, `option${index}`) : `option${index}`}>\r\n {option.text}\r\n {option.icon && option.icon === CSMLSortIcon.SortUp && <ArrowSortUp20Regular />}\r\n {option.icon && option.icon === CSMLSortIcon.SortDown && <ArrowSortDown20Regular />}\r\n </MenuItemRadio>\r\n ))\r\n }\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n </div>\r\n );\r\n};\r\n\r\n","import React, { useState, useCallback, useMemo, useEffect } from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n Menu,\r\n Button,\r\n MenuButton,\r\n MenuList,\r\n MenuDivider,\r\n MenuPopover,\r\n MenuTrigger,\r\n makeStyles,\r\n tokens,\r\n Checkbox,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n} from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '180px',\r\n },\r\n unselectedMenuButton: {\r\n '&[aria-expanded=\"false\"]': {\r\n fontWeight: 'unset',\r\n },\r\n },\r\n enabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n },\r\n disabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n checkbox: {\r\n '& label': {\r\n paddingLeft: '0px',\r\n fontWeight: 'unset',\r\n },\r\n },\r\n});\r\n\r\nexport const AssetSourceFilter = (props) => {\r\n const {\r\n i18n,\r\n defaultSelectedAssetSources,\r\n options,\r\n onChange,\r\n forceClear,\r\n onDismiss,\r\n defaultOpen = false,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const [selectedAssetSources, setSelectedAssetSources] = useState(defaultSelectedAssetSources);\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n const selectedOptions = useMemo(\r\n () => _.filter(options, ({ key }) => _.contains(selectedAssetSources, key)) || [],\r\n [selectedAssetSources, options]\r\n );\r\n\r\n const onChangeCallback = useCallback((key, checked) => {\r\n const selectedSources = checked ? _.sortBy([...selectedAssetSources, key]) : _.without(selectedAssetSources, key);\r\n setSelectedAssetSources(selectedSources || []);\r\n }, [selectedAssetSources]);\r\n\r\n // the string shown on dropdown title\r\n const dropdownTitle = useMemo(() => {\r\n if (_.isEmpty(selectedOptions)) return null;\r\n const title = _.uniq(selectedOptions.map(({ text }) => text)).join('; ');\r\n return title;\r\n }, [selectedOptions]);\r\n\r\n const isSelected = useMemo(() => !_.isEmpty(selectedAssetSources), [selectedAssetSources]);\r\n\r\n // when the X button on dropdown title is clicked\r\n const onDropdownClear = useCallback(() => {\r\n setSelectedAssetSources([]);\r\n if (onChange && !_.isEmpty(defaultSelectedAssetSources)) {\r\n onChange([]);\r\n }\r\n if (onDismiss) {\r\n onDismiss();\r\n }\r\n }, [defaultSelectedAssetSources, onChange, onDismiss]);\r\n\r\n // when dropdown list is dismissed\r\n const onDropdownDismiss = useCallback(() => {\r\n if (onChange && !_.isEqual(defaultSelectedAssetSources, selectedAssetSources)) {\r\n onChange(selectedAssetSources, dropdownTitle);\r\n }\r\n }, [defaultSelectedAssetSources, dropdownTitle, selectedAssetSources, onChange]);\r\n\r\n const clear = () => {\r\n setIsOpen(false);\r\n onDropdownClear();\r\n };\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n useEffect(() => {\r\n if (forceClear) {\r\n clear();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [forceClear]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n onDropdownDismiss();\r\n }\r\n }, [isOpen, onDropdownDismiss]);\r\n\r\n return (\r\n <Menu open={isOpen} hasCheckmarks onOpenChange={onOpenChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuButton appearance=\"subtle\" className={isSelected ? 'asset-source-button' : mergeClasses(classes.unselectedMenuButton, 'asset-source-button')}>\r\n {dropdownTitle || i18n.getString(_TL_('Source'))}\r\n </MenuButton>\r\n </MenuTrigger>\r\n\r\n <MenuPopover className={mergeClasses(classes.menuPopover, 'asset-source-menu')}>\r\n <MenuList>\r\n <div className=\"custom-source\">\r\n {options.map(option => (\r\n <div key={option.key}>\r\n <Checkbox\r\n label={option.title}\r\n className={mergeClasses(option.key, classes.checkbox)}\r\n checked={_.contains(selectedAssetSources, option.key)}\r\n onChange={(evt, data) => onChangeCallback(option.key, data.checked)}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n <MenuDivider />\r\n <div>\r\n <Button\r\n className={isSelected ? classes.enabledClearButton : classes.disabledClearButton}\r\n disabled={!isSelected}\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => clear()}\r\n >\r\n {i18n.getString(_TL_('Clear'))}\r\n </Button>\r\n </div>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n );\r\n};\r\n\r\n","import React, { useMemo, useEffect, useState, useRef, useCallback } from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n Button,\r\n MenuButton,\r\n MenuList,\r\n MenuDivider,\r\n Popover,\r\n PopoverSurface,\r\n PopoverTrigger,\r\n makeStyles,\r\n shorthands,\r\n tokens,\r\n Label,\r\n Input,\r\n useId,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n} from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '180px',\r\n ...shorthands.padding('4px'),\r\n },\r\n menuButton: {\r\n // This is a known fluent ui issue between Popover and MenuButton: https://github.com/microsoft/fluentui/issues/31804\r\n // This bug has been fixed in the latest version, but as we use legacy version, update the style as a workaround.\r\n backgroundColor: 'transparent',\r\n '&[aria-expanded=\"true\"]': {\r\n backgroundColor: '#EBEBEB',\r\n },\r\n },\r\n unselectedMenuButton: {\r\n '&[aria-expanded=\"false\"]': {\r\n fontWeight: 'unset',\r\n },\r\n },\r\n enabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n },\r\n disabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n});\r\n\r\nconst useCustomItemStyles = makeStyles({\r\n minDuration: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n maxWidth: '124px',\r\n },\r\n customDuration: {\r\n '& .invalidInput': {\r\n '&:focus-within': {\r\n '::after': {\r\n ...shorthands.borderBottom('2px', 'solid', 'rgb(164, 38, 44)'),\r\n },\r\n },\r\n ...shorthands.borderBottom('1px', 'solid', 'rgb(164, 38, 44)'),\r\n },\r\n },\r\n maxDuration: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginLeft: '28px',\r\n marginRight: '28px',\r\n marginBottom: '6px',\r\n maxWidth: '124px',\r\n },\r\n input: {\r\n paddingRight: '0px',\r\n height: '32px',\r\n lineHeight: '32px',\r\n overflowX: 'hidden',\r\n overflowY: 'hidden',\r\n },\r\n contentAfter: {\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n paddingRight: '6px',\r\n paddingLeft: '8px',\r\n },\r\n contentLabel: {\r\n marginBottom: '6px',\r\n marginTop: '8px',\r\n },\r\n});\r\n\r\nexport const VideoDurationFilter = (props) => {\r\n const {\r\n i18n,\r\n defaultMaxDuration,\r\n defaultMinDuration,\r\n onChange,\r\n forceClear,\r\n } = props;\r\n\r\n const minDurationId = useId('minDuration');\r\n const afterMinDurationId = useId('afterMinDurationId');\r\n const maxDurationId = useId('maxDuration');\r\n const afterMaxDurationId = useId('afterMaxDurationId');\r\n const customClasses = useCustomItemStyles();\r\n const classes = useStyles();\r\n\r\n // use ref to handle focus switching when pressing tab key\r\n const minDurationRef = useRef(null);\r\n const maxDurationRef = useRef(null);\r\n\r\n const [minDuration, setMinDuration] = useState(defaultMinDuration);\r\n const [maxDuration, setMaxDuration] = useState(defaultMaxDuration);\r\n\r\n const [minDurationInvalid, setMinDurationInvalid] = useState(false);\r\n const [maxDurationInvalid, setMaxDurationInvalid] = useState(false);\r\n\r\n const onChangeCallback = useCallback((setter, newValue) => {\r\n const val = parseInt(newValue, 10);\r\n if (_.isEmpty(newValue) || _.isNaN(val)) {\r\n setter(null);\r\n return;\r\n }\r\n if (!_.isNaN(val) && val >= 0 && val <= 1000000) {\r\n setter(val);\r\n }\r\n }, []);\r\n\r\n const onMinDurationChange = useCallback((event, newValue) => {\r\n onChangeCallback(setMinDuration, newValue);\r\n if (_.isEmpty(newValue) || maxDuration > newValue) {\r\n setMinDurationInvalid(false);\r\n setMaxDurationInvalid(false);\r\n } else if ((maxDuration && newValue >= maxDuration)) {\r\n setMinDurationInvalid(true);\r\n } else {\r\n setMinDurationInvalid(false);\r\n }\r\n }, [maxDuration, onChangeCallback]);\r\n\r\n const onMaxDurationChange = useCallback((event, newValue) => {\r\n onChangeCallback(setMaxDuration, newValue);\r\n if (_.isEmpty(newValue) || newValue > minDuration) {\r\n setMinDurationInvalid(false);\r\n setMaxDurationInvalid(false);\r\n } else if (newValue <= minDuration) {\r\n setMaxDurationInvalid(true);\r\n } else {\r\n setMaxDurationInvalid(false);\r\n }\r\n }, [onChangeCallback, minDuration]);\r\n\r\n const onClear = useCallback(() => {\r\n setMinDuration(null);\r\n setMaxDuration(null);\r\n if (!(defaultMinDuration || defaultMaxDuration)) {\r\n // trigger onchange only when dropdown list is closed\r\n onChange({ newMinDuration: null, newMaxDuration: null });\r\n }\r\n if (minDurationRef.current) {\r\n minDurationRef.current.focus();\r\n }\r\n }, [defaultMinDuration, defaultMaxDuration, onChange]);\r\n\r\n const title = useMemo(() => {\r\n if (minDuration && maxDuration && !minDurationInvalid && !maxDurationInvalid) {\r\n return `${minDuration}s < ${i18n.getString(_TL_('Duration'))} < ${maxDuration}s`;\r\n }\r\n if (minDuration && !minDurationInvalid) {\r\n return `${i18n.getString(_TL_('Duration'))} > ${minDuration}s`;\r\n }\r\n if (maxDuration && !maxDurationInvalid) {\r\n return `${i18n.getString(_TL_('Duration'))} < ${maxDuration}s`;\r\n }\r\n return '';\r\n }, [minDuration, maxDuration, minDurationInvalid, maxDurationInvalid, i18n]);\r\n\r\n const focusTextField = useCallback(textFieldRef => (event) => {\r\n if (event.key === 'Tab') {\r\n if (textFieldRef.current) {\r\n textFieldRef.current.focus();\r\n }\r\n if (event.stopPropagation) { event.stopPropagation(); }\r\n if (event.preventDefault) { event.preventDefault(); }\r\n }\r\n }, []);\r\n\r\n const onMinDurationKeyUp = useMemo(() => focusTextField(maxDurationRef), [focusTextField]);\r\n const onMaxDurationKeyUp = useMemo(() => focusTextField(minDurationRef), [focusTextField]);\r\n\r\n const onDropdownDismiss = useCallback(() => {\r\n if (defaultMinDuration !== minDuration || defaultMaxDuration !== maxDuration) {\r\n onChange({ newMinDuration: minDurationInvalid ? null : minDuration, newMaxDuration: maxDurationInvalid ? null : maxDuration });\r\n }\r\n }, [defaultMinDuration, minDuration, defaultMaxDuration, maxDuration, onChange, minDurationInvalid, maxDurationInvalid]);\r\n\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [menuList, setMenuList] = useState(null);\r\n\r\n const isSelected = useMemo(() => minDuration || maxDuration, [minDuration, maxDuration]);\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n const clear = () => {\r\n setIsOpen(false);\r\n onClear();\r\n };\r\n\r\n useEffect(() => {\r\n if (forceClear) {\r\n clear();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [forceClear]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n onDropdownDismiss();\r\n }\r\n }, [isOpen, onDropdownDismiss]);\r\n\r\n useEffect(() => {\r\n if (menuList) {\r\n // as we are using custom input, we need to remove menu role for accessibility\r\n menuList.removeAttribute('role');\r\n }\r\n }, [menuList]);\r\n\r\n return (\r\n <Popover trapFocus open={isOpen} onOpenChange={onOpenChange} positioning=\"below-start\">\r\n <PopoverTrigger disableButtonEnhancement>\r\n <MenuButton appearance=\"subtle\" className={isSelected ? mergeClasses(classes.menuButton, 'video-duration-button') : mergeClasses(classes.menuButton, classes.unselectedMenuButton, 'video-duration-button')}>\r\n {isSelected ? title : i18n.getString(_TL_('Video duration'))}\r\n </MenuButton>\r\n </PopoverTrigger>\r\n\r\n <PopoverSurface className={mergeClasses(classes.menuPopover, 'video-duration-menu')}>\r\n <MenuList ref={setMenuList}>\r\n <div className={mergeClasses('custom-duration', customClasses.customDuration)}>\r\n <div className={mergeClasses(customClasses.minDuration, 'min-duration')}>\r\n <Label className={customClasses.contentLabel} htmlFor={minDurationId}>{i18n.getString(_TL_('Min. duration'))}</Label>\r\n <Input\r\n ref={minDurationRef}\r\n className={minDurationInvalid ? mergeClasses(customClasses.input, 'invalidInput') : customClasses.input}\r\n value={minDuration ? minDuration.toString() : ''}\r\n onChange={(ev, data) => onMinDurationChange(ev, data.value)}\r\n contentAfter={\r\n <div className={customClasses.contentAfter} id={afterMinDurationId}>\r\n {i18n.getString(_TL_('s'))}\r\n </div>\r\n }\r\n aria-labelledby={`${minDurationId} ${afterMinDurationId}`}\r\n id={minDurationId}\r\n onKeyDown={onMinDurationKeyUp}\r\n />\r\n </div>\r\n <div className={mergeClasses(customClasses.maxDuration, 'max-duration')}>\r\n <Label className={customClasses.contentLabel} htmlFor={maxDurationId}>{i18n.getString(_TL_('Max. duration'))}</Label>\r\n <Input\r\n ref={maxDurationRef}\r\n className={maxDurationInvalid ? mergeClasses(customClasses.input, 'invalidInput') : customClasses.input}\r\n value={maxDuration ? maxDuration.toString() : ''}\r\n onChange={(ev, data) => onMaxDurationChange(ev, data.value)}\r\n contentAfter={\r\n <div className={customClasses.contentAfter} id={afterMaxDurationId}>\r\n {i18n.getString(_TL_('s'))}\r\n </div>\r\n }\r\n aria-labelledby={`${maxDurationId} ${afterMaxDurationId}`}\r\n id={maxDurationId}\r\n onKeyDown={onMaxDurationKeyUp}\r\n />\r\n </div>\r\n </div>\r\n <MenuDivider />\r\n </MenuList>\r\n <div>\r\n <Button\r\n className={isSelected ? mergeClasses('clear-button', classes.enabledClearButton) : classes.disabledClearButton}\r\n disabled={!isSelected}\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => clear()}\r\n >\r\n {i18n.getString(_TL_('Clear'))}\r\n </Button>\r\n </div>\r\n </PopoverSurface>\r\n </Popover>\r\n );\r\n};\r\n\r\n","import React, { useState, useMemo, useCallback, useEffect } from 'react';\r\nimport {\r\n Menu,\r\n MenuButton,\r\n MenuList,\r\n MenuPopover,\r\n Button,\r\n MenuTrigger,\r\n MenuItemRadio,\r\n makeStyles,\r\n MenuDivider,\r\n tokens,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n} from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n menuPopover: {\r\n minWidth: '180px',\r\n },\r\n unselectedMenuButton: {\r\n '&[aria-expanded=\"false\"]': {\r\n fontWeight: 'unset',\r\n },\r\n },\r\n enabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n },\r\n disabledClearButton: {\r\n float: 'right',\r\n color: tokens.colorNeutralForegroundDisabled,\r\n },\r\n});\r\n\r\nexport const ImportSourceFilter = (props) => {\r\n const {\r\n className,\r\n options,\r\n defaultImportSource,\r\n onChange,\r\n forceClear,\r\n i18n,\r\n onDismiss,\r\n defaultOpen = false,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const name = 'importSource';\r\n const [checkedValues, setCheckedValues] = useState({\r\n [name]: [defaultImportSource],\r\n });\r\n const [isOpen, setIsOpen] = useState(defaultOpen);\r\n\r\n const onCheckedValueChange = (e, data) => {\r\n const {\r\n checkedItems,\r\n } = data;\r\n setCheckedValues(s => ({\r\n ...s,\r\n [name]: checkedItems,\r\n }));\r\n };\r\n\r\n const selectedChoice = useMemo(\r\n () => options.find(r => r.key === checkedValues[name][0]),\r\n [checkedValues, options]\r\n );\r\n\r\n // the string shown on dropdown title\r\n const dropdownTitle = selectedChoice ? selectedChoice.title : null;\r\n\r\n // when the X button on dropdown title is clicked\r\n const onDropdownClear = useCallback(() => {\r\n if (onChange && defaultImportSource !== null) {\r\n onChange(null);\r\n }\r\n }, [defaultImportSource, onChange]);\r\n\r\n // when dropdown list is dismissed\r\n const onDropdownDismiss = useCallback(() => {\r\n const importSource = checkedValues[name][0];\r\n if (importSource && onChange && defaultImportSource !== importSource) {\r\n onChange(importSource);\r\n }\r\n }, [checkedValues, defaultImportSource, onChange]);\r\n\r\n const isSelected = checkedValues[name][0] != null;\r\n\r\n const onOpenChange = (e, data) => {\r\n setIsOpen(data.open);\r\n };\r\n\r\n const clear = useCallback(() => {\r\n setIsOpen(false);\r\n setCheckedValues(() => ({\r\n [name]: [],\r\n }));\r\n onDropdownClear();\r\n if (onDismiss) {\r\n onDismiss();\r\n }\r\n }, [onDropdownClear, onDismiss]);\r\n\r\n useEffect(() => {\r\n if (forceClear) {\r\n clear();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [forceClear]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) {\r\n onDropdownDismiss();\r\n }\r\n }, [isOpen, onDropdownDismiss]);\r\n\r\n return (\r\n <div className={className}>\r\n <Menu open={isOpen} checkedValues={checkedValues} onCheckedValueChange={onCheckedValueChange} hasCheckmarks onOpenChange={onOpenChange}>\r\n <MenuTrigger disableButtonEnhancement>\r\n <MenuButton appearance=\"subtle\" className={isSelected ? 'import-source-button' : mergeClasses(classes.unselectedMenuButton, 'import-source-button')}>\r\n {isSelected ? dropdownTitle : i18n.getString(_TL_('Import source'))}\r\n </MenuButton>\r\n </MenuTrigger>\r\n\r\n <MenuPopover className={mergeClasses(classes.menuPopover, 'import-source-menu')}>\r\n <MenuList>\r\n {\r\n options.map(option => (\r\n <MenuItemRadio key={option.key} name={name} value={option.key} className={option.icon ? classes.item : ''}>\r\n {option.text}\r\n </MenuItemRadio>\r\n ))\r\n }\r\n <MenuDivider />\r\n <div>\r\n <Button\r\n className={isSelected ? classes.enabledClearButton : classes.disabledClearButton}\r\n disabled={!isSelected}\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => clear()}\r\n >\r\n {i18n.getString(_TL_('Clear'))}\r\n </Button>\r\n </div>\r\n </MenuList>\r\n </MenuPopover>\r\n </Menu>\r\n </div>\r\n );\r\n};\r\n\r\n","/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n/* eslint-disable jsx-a11y/interactive-supports-focus */\r\nimport React, { useRef, useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useId, makeStyles, mergeClasses, tokens, shorthands } from '@fluentui/react-components';\r\n\r\n\r\nconst thumbSizeVar = '--thumb-size';\r\nconst railSizeVar = '--rail-size';\r\nconst railColorVar = '--rail-color';\r\nconst progressColorVar = '--progress-color';\r\nconst thumbColorVar = '--thumb-color';\r\n\r\nexport const sliderCSSVars = {\r\n sliderMinProgressVar: '--slider-min-progress',\r\n sliderMaxProgressVar: '--slider-max-progress',\r\n};\r\n\r\nconst {\r\n sliderMinProgressVar,\r\n sliderMaxProgressVar,\r\n} = sliderCSSVars;\r\n\r\nconst useStyles = makeStyles({\r\n videoDuration: {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'left',\r\n },\r\n videoDurationScrollbar: {\r\n position: 'relative',\r\n display: 'inline-grid',\r\n touchAction: 'none',\r\n alignItems: 'center',\r\n justifyItems: 'center',\r\n minWidth: '240px',\r\n // 3x3 grid with the rail and thumb in the center cell [2,2] and the hidden input stretching across all cells\r\n gridTemplateRows: `1fr var(${thumbSizeVar}) 1fr`,\r\n gridTemplateColumns: `1fr calc(100% - var(${thumbSizeVar})) 1fr`,\r\n [thumbSizeVar]: '20px',\r\n [railSizeVar]: '4px',\r\n minHeight: '32px',\r\n marginRight: '8px',\r\n },\r\n colors: {\r\n [railColorVar]: tokens.colorNeutralStrokeAccessible,\r\n [progressColorVar]: tokens.colorCompoundBrandBackground,\r\n [thumbColorVar]: tokens.colorCompoundBrandBackground,\r\n ':hover': {\r\n [thumbColorVar]: tokens.colorCompoundBrandBackgroundHover,\r\n [progressColorVar]: tokens.colorCompoundBrandBackgroundHover,\r\n },\r\n ':active': {\r\n [thumbColorVar]: tokens.colorCompoundBrandBackgroundPressed,\r\n [progressColorVar]: tokens.colorCompoundBrandBackgroundPressed,\r\n },\r\n '@media (forced-colors: active)': {\r\n [railColorVar]: 'CanvasText',\r\n [thumbColorVar]: 'Highlight',\r\n [progressColorVar]: 'Highlight',\r\n ':hover': {\r\n [thumbColorVar]: 'Highlight',\r\n [progressColorVar]: 'Highlight',\r\n },\r\n },\r\n },\r\n rail: {\r\n ...shorthands.borderRadius(tokens.borderRadiusXLarge),\r\n gridRowStart: '2',\r\n gridRowEnd: '2',\r\n gridColumnStart: '2',\r\n gridColumnEnd: '2',\r\n position: 'relative',\r\n forcedColorAdjust: 'none',\r\n // Background gradient represents the progress of the slider\r\n backgroundImage: `linear-gradient(90deg,\r\n var(${railColorVar}) 0%,\r\n var(${railColorVar}) var(${sliderMinProgressVar}),\r\n var(${progressColorVar}) var(${sliderMinProgressVar}),\r\n var(${progressColorVar}) var(${sliderMaxProgressVar}),\r\n var(${railColorVar}) var(${sliderMaxProgressVar})\r\n )`,\r\n outlineWidth: '1px',\r\n outlineStyle: 'solid',\r\n outlineColor: tokens.colorTransparentStroke,\r\n width: '100%',\r\n height: `var(${railSizeVar})`,\r\n },\r\n thumb: {\r\n gridRowStart: '2',\r\n gridRowEnd: '2',\r\n gridColumnStart: '2',\r\n gridColumnEnd: '2',\r\n position: 'absolute',\r\n width: `var(${thumbSizeVar})`,\r\n height: `var(${thumbSizeVar})`,\r\n cursor: 'pointer',\r\n outlineStyle: 'none',\r\n forcedColorAdjust: 'none',\r\n ...shorthands.borderRadius(tokens.borderRadiusCircular),\r\n boxShadow: `0 0 0 calc(var(${thumbSizeVar}) * .2) ${tokens.colorNeutralBackground1} inset`,\r\n backgroundColor: `var(${thumbColorVar})`,\r\n '::before': {\r\n position: 'absolute',\r\n top: '0px',\r\n left: '0px',\r\n bottom: '0px',\r\n right: '0px',\r\n ...shorthands.borderRadius(tokens.borderRadiusCircular),\r\n boxSizing: 'border-box',\r\n content: \"''\",\r\n ...shorthands.border(`calc(var(${thumbSizeVar}) * .05)`, 'solid', tokens.colorNeutralStroke1),\r\n },\r\n transform: 'translateX(-50%)',\r\n },\r\n rangeInput: {\r\n gridRowStart: '2',\r\n gridRowEnd: '-2',\r\n gridColumnStart: '2',\r\n gridColumnEnd: '-2',\r\n pointerEvents: 'none',\r\n opacity: '0',\r\n ...shorthands.margin(0),\r\n ...shorthands.padding(0),\r\n },\r\n minRangeInput: {\r\n '&:focus ~ .video-duration-scrollbar__minThumb::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n pointerEvents: 'none',\r\n zIndex: 1,\r\n\r\n ...shorthands.border('2px', 'solid', tokens.colorStrokeFocus2),\r\n ...shorthands.borderRadius(tokens.borderRadiusMedium),\r\n\r\n top: '-4px',\r\n right: '-4px',\r\n bottom: '-4px',\r\n left: '-4px',\r\n },\r\n },\r\n maxRangeInput: {\r\n '&:focus ~ .video-duration-scrollbar__maxThumb::after': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n pointerEvents: 'none',\r\n zIndex: 1,\r\n\r\n ...shorthands.border('2px', 'solid', tokens.colorStrokeFocus2),\r\n ...shorthands.borderRadius(tokens.borderRadiusMedium),\r\n\r\n top: '-4px',\r\n right: '-4px',\r\n bottom: '-4px',\r\n left: '-4px',\r\n },\r\n },\r\n minThumb: {\r\n left: `var(${sliderMinProgressVar})`,\r\n },\r\n maxThumb: {\r\n left: `var(${sliderMaxProgressVar})`,\r\n },\r\n});\r\n\r\nconst getPercent = (value, min, max) => (max === min ? 0 : ((value - min) / (max - min)) * 100);\r\n\r\nconst Slider = (props) => {\r\n const {\r\n setValue,\r\n getRelatedValue,\r\n className,\r\n } = props;\r\n\r\n const [isDragging, setIsDragging] = useState(false);\r\n\r\n const onMouseDown = (e) => {\r\n if (e.button !== 0) {\r\n return;\r\n }\r\n setIsDragging(true);\r\n const newValue = getRelatedValue(e);\r\n setValue(newValue);\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n useEffect(() => {\r\n if (isDragging) {\r\n const onMouseMove = (e) => {\r\n const newValue = getRelatedValue(e);\r\n setValue(newValue);\r\n };\r\n const onMouseUp = (e) => {\r\n setIsDragging(false);\r\n const newValue = getRelatedValue(e);\r\n setValue(newValue, true);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }\r\n return () => {};\r\n }, [getRelatedValue, isDragging, setValue]);\r\n\r\n return (\r\n <div\r\n role=\"presentation\"\r\n className={className}\r\n onMouseDown={(e) => {\r\n console.log(e);\r\n onMouseDown(e);\r\n }}\r\n />\r\n );\r\n};\r\n\r\n// input slider for video duration\r\n// two thumbs for min and max duration\r\n// one rail for the range\r\nexport const VideoDurationScrollbarFilter = (props) => {\r\n const minInputId = useId('min-input');\r\n const maxInputId = useId('max-input');\r\n const {\r\n min,\r\n max,\r\n unlimited,\r\n i18n,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onChange,\r\n } = props;\r\n\r\n const [minValue, setMinValue] = useState(minDurationFilter);\r\n const [maxValue, setMaxValue] = useState(maxDurationFilter);\r\n const classes = useStyles();\r\n const scrollbarRef = useRef();\r\n\r\n const styleVariables = {\r\n [sliderMinProgressVar]: (minValue == null ? '0%' : `${getPercent(minValue, min, unlimited)}%`),\r\n [sliderMaxProgressVar]: (maxValue == null ? '100%' : `${getPercent(maxValue, min, unlimited)}%`),\r\n };\r\n\r\n const wrappedSetMinValue = (value, shouldCallOnChange) => {\r\n const newValue = Math.min(Math.min(maxValue || unlimited, max), Math.max(min, value));\r\n setMinValue(newValue);\r\n if (shouldCallOnChange) {\r\n onChange({ newMinDuration: newValue, newMaxDuration: maxValue });\r\n }\r\n };\r\n\r\n const wrappedSetMaxValue = (value, shouldCallOnChange) => {\r\n const newValue = Math.min(unlimited, Math.max(minValue || 0, value));\r\n setMaxValue(newValue);\r\n if (shouldCallOnChange) {\r\n onChange({ newMinDuration: minValue, newMaxDuration: newValue });\r\n }\r\n };\r\n\r\n const getRelatedValue = ({\r\n clientX,\r\n }) => {\r\n if (!scrollbarRef.current) {\r\n return null;\r\n }\r\n const scrollbarBox = scrollbarRef.current.getBoundingClientRect();\r\n const {\r\n left,\r\n width,\r\n } = scrollbarBox;\r\n\r\n const x = clientX - left;\r\n return parseInt(Math.min(unlimited, Math.max(min, ((x / width) * (unlimited - min)) + min)), 10);\r\n };\r\n\r\n const onClickRail = (e) => {\r\n const value = getRelatedValue(e);\r\n if (value != null) {\r\n // set the min value if the click is closer to the min thumb\r\n // set the max value if the click is closer to the max thumb\r\n const minDistance = Math.abs((minValue || 0) - value);\r\n const maxDistance = Math.abs((maxValue || unlimited) - value);\r\n if (minDistance < maxDistance) {\r\n wrappedSetMinValue(value, true);\r\n } else {\r\n wrappedSetMaxValue(value, true);\r\n }\r\n }\r\n };\r\n\r\n\r\n return (\r\n <div className={mergeClasses('video-duration', classes.videoDuration)}>\r\n <div ref={scrollbarRef} className={mergeClasses('video-duration-scrollbar', classes.videoDurationScrollbar, classes.colors)} style={styleVariables}>\r\n <input\r\n type=\"range\"\r\n min={min}\r\n max={unlimited}\r\n value={minValue}\r\n id={minInputId}\r\n className={mergeClasses(classes.rangeInput, classes.minRangeInput, 'min-value')}\r\n onChange={(e) => {\r\n wrappedSetMinValue(parseInt(e.target.value, 10), true);\r\n }}\r\n aria-label={i18n.getString(_TL_('Min value: {{ value }}'), { value: minValue })}\r\n />\r\n <input\r\n type=\"range\"\r\n min={min}\r\n max={unlimited}\r\n value={maxValue}\r\n id={maxInputId}\r\n className={mergeClasses(classes.rangeInput, classes.maxRangeInput, 'max-value')}\r\n onChange={(e) => {\r\n wrappedSetMaxValue(parseInt(e.target.value, 10), true);\r\n }}\r\n aria-label={i18n.getString(_TL_('Max value: {{ value }}'), { value: maxValue > max ? 'unlimited' : maxValue })}\r\n />\r\n <div\r\n role=\"presentation\"\r\n className={mergeClasses('video-duration-scrollbar__rail', classes.rail)}\r\n onClick={(e) => {\r\n onClickRail(e);\r\n }}\r\n />\r\n <Slider\r\n value={minValue}\r\n setValue={wrappedSetMinValue}\r\n getRelatedValue={getRelatedValue}\r\n className={mergeClasses('video-duration-scrollbar__minThumb', classes.minThumb, classes.thumb)}\r\n />\r\n <Slider\r\n value={maxValue}\r\n setValue={wrappedSetMaxValue}\r\n getRelatedValue={getRelatedValue}\r\n className={mergeClasses('video-duration-scrollbar__maxThumb', classes.maxThumb, classes.thumb)}\r\n />\r\n </div>\r\n <div className=\"range-text\">\r\n {maxValue > max || maxValue == null ? `≥${i18n.getString(_TL_('{{ min }} seconds'), {\r\n min: minValue,\r\n })}` : i18n.getString(_TL_('{{ min }}-{{ max }} seconds'), {\r\n min: minValue,\r\n max: maxValue,\r\n })}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n\r\nVideoDurationScrollbarFilter.propTypes = {\r\n min: PropTypes.number,\r\n max: PropTypes.number,\r\n unlimited: PropTypes.number,\r\n i18n: PropTypes.shape({}).isRequired,\r\n};\r\n\r\nVideoDurationScrollbarFilter.defaultProps = {\r\n min: 0,\r\n max: 120,\r\n unlimited: 121,\r\n};\r\n","import React from 'react';\r\nimport {\r\n ToggleButton,\r\n makeStyles,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Filter20Regular,\r\n} from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n toggleButton: {\r\n minWidth: 'unset',\r\n },\r\n});\r\n\r\nexport const FilterToggleButton = (props) => {\r\n const {\r\n i18n,\r\n className,\r\n onClick,\r\n checked,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n const text = i18n.getString(_TL_('Filter'));\r\n\r\n return (\r\n <div className={className}>\r\n <ToggleButton\r\n key=\"filter\"\r\n className={mergeClasses('filter-toggle-button', classes.toggleButton)}\r\n checked={checked}\r\n icon={<Filter20Regular />}\r\n onClick={() => {\r\n onClick();\r\n }}\r\n >\r\n {text}\r\n </ToggleButton>\r\n </div>\r\n );\r\n};\r\n","import { useCallback, useState, useMemo } from 'react';\r\nimport { getCivilDateToday } from '@bingads-webui-universal/temporal-utitlities';\r\nimport {\r\n getDateAddedChoiceOptions,\r\n CSMLTimeFrame,\r\n} from '../../../model';\r\nimport {\r\n civilDateRangeEqual,\r\n civilDateRangeToDebugString,\r\n} from '../../../utils';\r\n\r\nconst yesterday = getCivilDateToday().plus({ days: -1 });\r\nconst DEFAULT_RANGE = { start: yesterday, end: yesterday };\r\n\r\nexport const useDateAddedState = ({\r\n logger,\r\n i18n,\r\n ianaTimeZone,\r\n handleUsage,\r\n}) => {\r\n const [dateAddedFilter, setDateAddedFilter] = useState(CSMLTimeFrame.Anytime);\r\n // date range user selected for 'Custom'\r\n const [dateAddedFilterCustomDateRange, setDateAddedFilterCustomDateRange] = useState(DEFAULT_RANGE);\r\n\r\n const dateAddedChoiceOptions = useMemo(\r\n () => getDateAddedChoiceOptions(i18n, ianaTimeZone),\r\n [i18n, ianaTimeZone]\r\n );\r\n\r\n const onDateAddedFilterChange = useCallback(({ timeframe: tf, customDateRange: cdr }) => {\r\n if (tf !== dateAddedFilter) {\r\n logger.logTrace('onDateAddedFilterChange', { dateAddedFilter: tf });\r\n setDateAddedFilter(tf);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n if (!civilDateRangeEqual(cdr, dateAddedFilterCustomDateRange)) {\r\n logger.logTrace('onDateAddedFilterChange', { customDateRange: civilDateRangeToDebugString(cdr) });\r\n setDateAddedFilterCustomDateRange(cdr);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n }, [dateAddedFilter, dateAddedFilterCustomDateRange, handleUsage, logger]);\r\n\r\n return {\r\n dateAddedChoiceOptions,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n onDateAddedFilterChange,\r\n };\r\n};\r\n","import React from 'react';\r\n\r\nexport const FilterContext = React.createContext({});\r\n\r\n","import { useMemo, useContext, useEffect } from 'react';\r\nimport {\r\n useAdditionalFilterBarState,\r\n useAssetTypeState,\r\n useSearchBoxState,\r\n useSortByState,\r\n useDateAddedState,\r\n useImportSourceState,\r\n useAssetSourcesState,\r\n useImageSizeState,\r\n useVideoDurationState,\r\n} from './components/state';\r\nimport {\r\n FilterContext,\r\n} from './context/filter-context';\r\nimport {\r\n CSMLTimeFrame,\r\n} from '../model';\r\n\r\nexport const useFilterBarState = ({\r\n logger,\r\n i18n,\r\n userPreference,\r\n defaultSearchText,\r\n defaultMinVideoDuration,\r\n defaultMaxVideoDuration,\r\n}) => {\r\n const {\r\n setFilterBar,\r\n } = useContext(FilterContext);\r\n\r\n const {\r\n toggleFilterBar,\r\n showAdditionalFilterBar,\r\n } = useAdditionalFilterBarState({ logger });\r\n\r\n const {\r\n toggleAssetType,\r\n assetTypesState,\r\n assetTypes,\r\n isImageSelected,\r\n isVideoSelected,\r\n } = useAssetTypeState({ logger, i18n });\r\n\r\n const {\r\n searchText,\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n } = useSearchBoxState({ logger, defaultSearchText });\r\n\r\n const {\r\n sortBy,\r\n sortingOptions,\r\n setSortBy,\r\n onSortByChange,\r\n } = useSortByState({ logger, i18n, userPreference });\r\n\r\n const {\r\n dateAddedChoiceOptions,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n onDateAddedFilterChange,\r\n } = useDateAddedState({ logger, i18n });\r\n\r\n const {\r\n assetSources,\r\n assetSourceOptions,\r\n onAssetSourceFilterChange,\r\n } = useAssetSourcesState({ logger, i18n });\r\n\r\n const {\r\n importSource,\r\n importSourceOptions,\r\n onImportSourceFilterChange,\r\n } = useImportSourceState({ logger, i18n });\r\n\r\n const {\r\n minWidthFilter,\r\n minHeightFilter,\r\n onImageSizeFilterChange,\r\n } = useImageSizeState({ logger, i18n });\r\n\r\n const {\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n } = useVideoDurationState({\r\n logger,\r\n i18n,\r\n defaultMinVideoDuration,\r\n defaultMaxVideoDuration,\r\n });\r\n\r\n const isDateAddedFilterActive = dateAddedFilter !== CSMLTimeFrame.Anytime;\r\n const isImportSourceFilterActive = importSource !== null;\r\n const isAssetSourceFilterActive = assetSources.length > 0;\r\n\r\n const isAdditionalFilterActive = useMemo(\r\n () => {\r\n if (isImageSelected) {\r\n if (minWidthFilter || minHeightFilter) {\r\n return true;\r\n }\r\n }\r\n if (isVideoSelected) {\r\n if (minDurationFilter || maxDurationFilter) {\r\n return true;\r\n }\r\n }\r\n return isDateAddedFilterActive || isImportSourceFilterActive || isAssetSourceFilterActive;\r\n },\r\n [isAssetSourceFilterActive,\r\n isDateAddedFilterActive,\r\n isImageSelected,\r\n isImportSourceFilterActive, isVideoSelected, maxDurationFilter, minDurationFilter, minHeightFilter, minWidthFilter]\r\n );\r\n\r\n useEffect(() => {\r\n setFilterBar({\r\n getFilters: () =>\r\n ({\r\n isImageSelected,\r\n isVideoSelected,\r\n assetTypesState,\r\n searchText,\r\n sortBy,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n importSource,\r\n assetSources,\r\n minWidthFilter,\r\n minHeightFilter,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n }),\r\n });\r\n }, [assetSources, assetTypesState, dateAddedFilter, dateAddedFilterCustomDateRange, importSource,\r\n isImageSelected, isVideoSelected, maxDurationFilter, minDurationFilter, minHeightFilter, minWidthFilter, searchText, setFilterBar, sortBy]);\r\n\r\n return {\r\n toggleFilterBar,\r\n showAdditionalFilterBar,\r\n isAdditionalFilterActive,\r\n toggleAssetType,\r\n isImageSelected,\r\n isVideoSelected,\r\n assetTypesState,\r\n assetTypes,\r\n // Search box state\r\n searchText,\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n // Sort by state\r\n sortBy,\r\n sortingOptions,\r\n setSortBy,\r\n onSortByChange,\r\n // Date added state\r\n dateAddedChoiceOptions,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n onDateAddedFilterChange,\r\n // Import source state\r\n importSource,\r\n importSourceOptions,\r\n onImportSourceFilterChange,\r\n // Asset source state\r\n assetSources,\r\n assetSourceOptions,\r\n onAssetSourceFilterChange,\r\n // Image size state\r\n minWidthFilter,\r\n minHeightFilter,\r\n onImageSizeFilterChange,\r\n // Video duration state\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n };\r\n};\r\n","import { useState } from 'react';\r\n\r\nexport const useAdditionalFilterBarState = ({ logger, handleUsage }) => {\r\n const [showAdditionalFilterBar, setShowAdditionalFilterBar] = useState(false);\r\n const toggleFilterBar = () => {\r\n logger.logTrace('toggle the filter bar', { showAdditionalFilterBar: !showAdditionalFilterBar });\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n setShowAdditionalFilterBar(!showAdditionalFilterBar);\r\n };\r\n\r\n return {\r\n toggleFilterBar,\r\n showAdditionalFilterBar,\r\n };\r\n};\r\n","import { useState, } from 'react';\r\nimport { getAssetTypeOptions } from '../../../model/get-asset-type-options';\r\nimport { FolderAssetType } from '../../../model/constants';\r\n\r\nexport const useAssetTypeState = ({ i18n, logger, handleUsage }) => {\r\n const assetTypes = getAssetTypeOptions(i18n);\r\n\r\n const [assetTypesState, setAssetTypesState] = useState(() => {\r\n const initialState = {};\r\n assetTypes.forEach((option) => {\r\n initialState[option.key] = false;\r\n });\r\n initialState[FolderAssetType.All] = true;\r\n return initialState;\r\n });\r\n\r\n const toggleAssetType = (key) => {\r\n const newAssetTypesState = {};\r\n assetTypes.forEach((option) => {\r\n const { key: optionKey } = option;\r\n if (optionKey === key) {\r\n newAssetTypesState[optionKey] = !assetTypesState[optionKey];\r\n } else {\r\n newAssetTypesState[optionKey] = false;\r\n }\r\n });\r\n if (newAssetTypesState[key] === false) {\r\n newAssetTypesState[FolderAssetType.All] = true;\r\n }\r\n logger.logTrace('toggle the media type assetTypes', { assetTypesState: newAssetTypesState });\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n setAssetTypesState(newAssetTypesState);\r\n };\r\n\r\n const isImageSelected = assetTypesState[FolderAssetType.Image];\r\n const isVideoSelected = assetTypesState[FolderAssetType.Video];\r\n\r\n return {\r\n toggleAssetType,\r\n assetTypesState,\r\n assetTypes,\r\n isImageSelected,\r\n isVideoSelected,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { useCallback, useState, useRef, } from 'react';\r\n\r\nexport const useSearchBoxState = ({ logger, handleUsage, defaultSearchText = '' }) => {\r\n const [searchText, setSearchText] = useState(defaultSearchText);\r\n const searchTextValueRef = useRef('');\r\n const onSearchTextChanging = useCallback((evt, newValue) => {\r\n searchTextValueRef.current = newValue || '';\r\n }, []);\r\n\r\n const onSearchTextBlur = useCallback(() => {\r\n setSearchText(searchTextValueRef.current);\r\n }, []);\r\n\r\n const onSearchTextChange = useCallback((newValue) => {\r\n if (newValue !== searchText) {\r\n logger.logTrace('start searching text', { searchText: newValue });\r\n setSearchText(newValue);\r\n }\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }, [logger, searchText, handleUsage]);\r\n\r\n const onSearchTextClear = useCallback(() => {\r\n if (!_.isEmpty(searchText)) {\r\n logger.logTrace('start searching text', { searchText: '<empty>' });\r\n setSearchText('');\r\n searchTextValueRef.current = '';\r\n }\r\n }, [logger, searchText]);\r\n\r\n return {\r\n searchText,\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n };\r\n};\r\n","import _ from 'underscore';\r\nimport { useCallback, useState, useMemo, useEffect } from 'react';\r\nimport {\r\n CSMLSortBy, getSortingOptions,\r\n} from '../../../model';\r\n\r\nexport const useSortByState = ({\r\n logger,\r\n i18n,\r\n handleUsage,\r\n userPreference,\r\n}) => {\r\n const [sortBy, setSortBy] = useState(() => {\r\n if (userPreference && userPreference.sortBy) {\r\n return userPreference.sortBy;\r\n }\r\n return CSMLSortBy.MostRecent;\r\n });\r\n\r\n useEffect(() => {\r\n if (userPreference && userPreference.sortBy) {\r\n setSortBy(userPreference.sortBy);\r\n }\r\n }, [setSortBy, userPreference]);\r\n\r\n const sortingOptions = useMemo(\r\n () => getSortingOptions(i18n),\r\n [i18n]\r\n );\r\n\r\n const safeSetSortBy = useCallback((newVal) => {\r\n const allSortByOptions = Object.values(CSMLSortBy);\r\n let safeNewValue = CSMLSortBy.MostRecent; // default value\r\n if (_.contains(allSortByOptions, newVal)) {\r\n safeNewValue = newVal;\r\n }\r\n setSortBy(safeNewValue);\r\n return safeNewValue;\r\n }, []);\r\n\r\n const onSortByChange = useCallback((_evt, item) => {\r\n if (item) {\r\n const newVal = safeSetSortBy(item.key);\r\n logger.logTrace('onSortByChange', { sortby: newVal });\r\n if (userPreference) {\r\n // save preferences\r\n userPreference.setSortBy(newVal);\r\n }\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n } else {\r\n // shouldn't happen\r\n logger.logError('onSortByChange, invalid key');\r\n }\r\n }, [safeSetSortBy, logger, userPreference, handleUsage]);\r\n\r\n return {\r\n sortBy,\r\n sortingOptions,\r\n setSortBy: safeSetSortBy,\r\n onSortByChange,\r\n };\r\n};\r\n\r\n","import _ from 'underscore';\r\nimport { useCallback, useState, useMemo } from 'react';\r\nimport {\r\n getAssetSourceOptions,\r\n} from '../../../model';\r\n\r\nexport const useAssetSourcesState = ({\r\n logger,\r\n i18n,\r\n handleUsage,\r\n disabledAssetSources = [],\r\n}) => {\r\n const [assetSources, setAssetSources] = useState([]);\r\n\r\n const assetSourceOptions = useMemo(() => {\r\n const options = getAssetSourceOptions(i18n);\r\n if (!_.isEmpty(disabledAssetSources)) {\r\n return options.filter(({ key }) => !disabledAssetSources.includes(key));\r\n }\r\n\r\n return options;\r\n }, [disabledAssetSources, i18n]);\r\n\r\n const onAssetSourceFilterChange = useCallback((newAssetSources) => {\r\n if (!_.isEqual(assetSources, newAssetSources)) {\r\n setAssetSources(newAssetSources);\r\n logger.logTrace('onAssetSourceFilterChange', { assetSources: (assetSources || []).join(',') });\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n }, [assetSources, handleUsage, logger]);\r\n\r\n return {\r\n assetSources,\r\n assetSourceOptions,\r\n onAssetSourceFilterChange,\r\n };\r\n};\r\n","import { useCallback, useState, useMemo } from 'react';\r\nimport {\r\n getImportSourceOptions,\r\n} from '../../../model';\r\n\r\nexport const useImportSourceState = ({\r\n logger,\r\n i18n,\r\n handleUsage,\r\n}) => {\r\n const [importSource, setImportSource] = useState(null);\r\n\r\n const importSourceOptions = useMemo(() => getImportSourceOptions(i18n), [i18n]);\r\n\r\n const onImportSourceFilterChange = useCallback((newImportSource) => {\r\n if (importSource !== newImportSource) {\r\n setImportSource(newImportSource);\r\n logger.logTrace('onImportSourceFilterChange', { importSource: newImportSource });\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n }, [handleUsage, importSource, logger]);\r\n\r\n return {\r\n importSource,\r\n importSourceOptions,\r\n onImportSourceFilterChange,\r\n };\r\n};\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport const useImageSizeState = ({\r\n logger, handleUsage,\r\n}) => {\r\n const [minWidthFilter, setMinWidthFilter] = useState(null);\r\n const [minHeightFilter, setMinHeightFilter] = useState(null);\r\n\r\n const onImageSizeFilterChange = useCallback(({ newMinWidth, newMinHeight }) => {\r\n if (newMinWidth !== minWidthFilter) {\r\n logger.logTrace('onImageSizeFilterChange', { minWidth: newMinWidth });\r\n setMinWidthFilter(newMinWidth);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n if (newMinHeight !== minHeightFilter) {\r\n logger.logTrace('onImageSizeFilterChange', { minHeight: newMinHeight });\r\n setMinHeightFilter(newMinHeight);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n }, [handleUsage, logger, minHeightFilter, minWidthFilter]);\r\n\r\n return {\r\n minWidthFilter,\r\n minHeightFilter,\r\n onImageSizeFilterChange,\r\n };\r\n};\r\n","import { useCallback, useState } from 'react';\r\n\r\nexport const useVideoDurationState = ({\r\n logger,\r\n handleUsage,\r\n defaultMinVideoDuration = null,\r\n defaultMaxVideoDuration = null,\r\n}) => {\r\n const [minDurationFilter, setMinDurationFilter] = useState(defaultMinVideoDuration);\r\n const [maxDurationFilter, setMaxDurationFilter] = useState(defaultMaxVideoDuration);\r\n\r\n const onVideoDurationFilterChange = useCallback(({ newMinDuration, newMaxDuration }) => {\r\n if (newMinDuration !== minDurationFilter) {\r\n logger.logTrace('onVideoDurationFilterChange', { minDuration: newMinDuration });\r\n setMinDurationFilter(newMinDuration);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n if (newMaxDuration !== maxDurationFilter) {\r\n logger.logTrace('onVideoDurationFilterChange', { maxDuration: newMaxDuration });\r\n setMaxDurationFilter(newMaxDuration);\r\n if (handleUsage) {\r\n handleUsage();\r\n }\r\n }\r\n }, [handleUsage, logger, maxDurationFilter, minDurationFilter]);\r\n\r\n return {\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n };\r\n};\r\n","// Two level of filter bars\r\nimport React, { useState } from 'react';\r\nimport {\r\n FluentProvider,\r\n Label,\r\n webLightTheme,\r\n makeResetStyles,\r\n makeStyles,\r\n shorthands,\r\n useId,\r\n tokens,\r\n Button,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport {\r\n Dismiss20Regular,\r\n} from '@fluentui/react-icons';\r\nimport {\r\n CSMLVideoDuration,\r\n} from '../model';\r\nimport {\r\n NewDropDown,\r\n AssetTypeToggleButtonsFilter,\r\n SearchBoxFilter,\r\n FilterToggleButton,\r\n ImageSizeFilter,\r\n VideoDurationFilter,\r\n AssetSourceFilter,\r\n ImportSourceFilter,\r\n DateAddedFilter,\r\n SortByFilter,\r\n VideoDurationScrollbarFilter,\r\n} from './components';\r\nimport {\r\n useFilterBarState,\r\n} from './filter-bar-state';\r\n\r\nconst useFilterBarStyles = makeStyles({\r\n filterBar: {\r\n display: 'flex',\r\n columnGap: '8px',\r\n rowGap: '8px',\r\n flexWrap: 'wrap',\r\n '& button': {\r\n whiteSpace: 'nowrap',\r\n },\r\n },\r\n remaining: {\r\n flexGrow: 1,\r\n },\r\n});\r\n\r\nconst useBaseAdditionalFilterBarStyles = makeResetStyles({\r\n marginTop: '12px',\r\n display: 'flex',\r\n columnGap: '8px',\r\n rowGap: '8px',\r\n flexWrap: 'wrap',\r\n '& button': {\r\n whiteSpace: 'nowrap',\r\n color: tokens.colorNeutralForeground2,\r\n },\r\n ...shorthands.borderRadius('4px'),\r\n ...shorthands.border('1px', 'solid', '#F1F1F1'),\r\n ...shorthands.padding('8px', '16px'),\r\n boxShadow: '0px 1px 4px 0px rgba(0, 0, 0, 0.15)',\r\n alignItems: 'center',\r\n '& button.clearButton': {\r\n '&:hover': {\r\n fontWeight: tokens.fontWeightSemibold,\r\n },\r\n color: tokens.colorNeutralForeground2BrandHover,\r\n fontWeight: 'unset',\r\n },\r\n});\r\n\r\nconst useAdditionalFilterBarStyles = makeStyles({\r\n hide: {\r\n display: 'none',\r\n },\r\n remaining: {\r\n flexGrow: 1,\r\n },\r\n filterText: {\r\n width: '60px',\r\n },\r\n});\r\n\r\nconst AdditionalFilterBar = (props) => {\r\n const {\r\n i18n,\r\n isSelected,\r\n isImageSelected,\r\n isVideoSelected,\r\n logger,\r\n timeZone,\r\n dateFormat,\r\n dateAddedChoiceOptions,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n onDateAddedFilterChange,\r\n showAdditionalFilterBar,\r\n isAdsStudioAIGCMVPEnabled,\r\n importSource,\r\n importSourceOptions,\r\n onImportSourceFilterChange,\r\n assetSources,\r\n assetSourceOptions,\r\n onAssetSourceFilterChange,\r\n minWidthFilter,\r\n minHeightFilter,\r\n onImageSizeFilterChange,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n } = props;\r\n\r\n const baseClasses = useBaseAdditionalFilterBarStyles();\r\n const classes = useAdditionalFilterBarStyles();\r\n const filterId = useId('filter');\r\n const [forceClear, setForceClear] = useState(0);\r\n\r\n return (\r\n <div\r\n className={showAdditionalFilterBar ? mergeClasses('additional-filter-bar', baseClasses) : mergeClasses('hided-additional-filter-bar', baseClasses, classes.hide)}\r\n role=\"group\"\r\n aria-labelledby={filterId}\r\n >\r\n <Label className={classes.filterText} id={filterId}>{i18n.getString(_TL_('Filters'))}</Label>\r\n <div className={isImageSelected ? 'image-size-filter' : classes.hide}>\r\n <ImageSizeFilter\r\n i18n={i18n}\r\n logger={logger}\r\n defaultMinWidth={minWidthFilter}\r\n defaultMinHeight={minHeightFilter}\r\n onChange={onImageSizeFilterChange}\r\n forceClear={forceClear}\r\n />\r\n </div>\r\n <div className={isVideoSelected ? 'video-duration-filter' : classes.hide}>\r\n <VideoDurationFilter\r\n i18n={i18n}\r\n logger={logger}\r\n defaultMaxDuration={maxDurationFilter}\r\n defaultMinDuration={minDurationFilter}\r\n onChange={onVideoDurationFilterChange}\r\n forceClear={forceClear}\r\n />\r\n </div>\r\n <DateAddedFilter\r\n i18n={i18n}\r\n logger={logger}\r\n timeZone={timeZone}\r\n dateFormat={dateFormat}\r\n defaultTimeFrame={dateAddedFilter}\r\n defaultCustomDateRange={dateAddedFilterCustomDateRange}\r\n options={dateAddedChoiceOptions}\r\n onChange={onDateAddedFilterChange}\r\n forceClear={forceClear}\r\n />\r\n {isAdsStudioAIGCMVPEnabled &&\r\n <AssetSourceFilter\r\n i18n={i18n}\r\n logger={logger}\r\n defaultSelectedAssetSources={assetSources}\r\n options={assetSourceOptions}\r\n onChange={onAssetSourceFilterChange}\r\n forceClear={forceClear}\r\n />}\r\n {!isAdsStudioAIGCMVPEnabled &&\r\n <ImportSourceFilter\r\n i18n={i18n}\r\n logger={logger}\r\n forceClear={forceClear}\r\n importSource={importSource}\r\n options={importSourceOptions}\r\n onChange={onImportSourceFilterChange}\r\n />}\r\n {isSelected &&\r\n <Button\r\n className=\"clearButton\"\r\n appearance=\"transparent\"\r\n icon={<Dismiss20Regular />}\r\n onClick={() => {\r\n setForceClear(forceClear + 1);\r\n }}\r\n >\r\n {i18n.getString(_TL_('Clear all'))}\r\n </Button>}\r\n <div className={classes.remaining} />\r\n </div>\r\n );\r\n};\r\n\r\nexport const VideosFilterBar = (props) => {\r\n const {\r\n i18n,\r\n logger,\r\n defaultSearchText,\r\n searchboxPlaceHolder,\r\n userPreference,\r\n defaultMinVideoDuration,\r\n defaultMaxVideoDuration,\r\n } = props;\r\n\r\n const classes = useFilterBarStyles();\r\n const {\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n sortBy,\r\n sortingOptions,\r\n onSortByChange,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n } = useFilterBarState({\r\n logger,\r\n i18n,\r\n userPreference,\r\n defaultSearchText,\r\n defaultMinVideoDuration,\r\n defaultMaxVideoDuration,\r\n });\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classes.filterBar}>\r\n <SearchBoxFilter\r\n i18n={i18n}\r\n logger={logger}\r\n onSearchTextChanging={onSearchTextChanging}\r\n onSearchTextChange={onSearchTextChange}\r\n onSearchTextBlur={onSearchTextBlur}\r\n onSearchTextClear={onSearchTextClear}\r\n defaultSearchText={defaultSearchText}\r\n searchboxPlaceHolder={searchboxPlaceHolder}\r\n />\r\n <VideoDurationScrollbarFilter\r\n i18n={i18n}\r\n min={CSMLVideoDuration.min}\r\n max={CSMLVideoDuration.max}\r\n minDurationFilter={minDurationFilter}\r\n maxDurationFilter={maxDurationFilter}\r\n onChange={onVideoDurationFilterChange}\r\n unlimited={CSMLVideoDuration.unlimited}\r\n />\r\n <div className={classes.remaining} />\r\n <SortByFilter\r\n i18n={i18n}\r\n logger={logger}\r\n options={sortingOptions}\r\n onChange={onSortByChange}\r\n sortBy={sortBy}\r\n />\r\n </div>\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nexport const ImagesFilterBar = (props) => {\r\n const {\r\n i18n,\r\n logger,\r\n defaultSearchText,\r\n userPreference,\r\n searchboxPlaceHolder,\r\n } = props;\r\n\r\n const classes = useFilterBarStyles();\r\n const {\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n sortBy,\r\n sortingOptions,\r\n onSortByChange,\r\n } = useFilterBarState({\r\n logger,\r\n i18n,\r\n userPreference,\r\n defaultSearchText,\r\n });\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classes.filterBar}>\r\n <SearchBoxFilter\r\n i18n={i18n}\r\n logger={logger}\r\n onSearchTextChanging={onSearchTextChanging}\r\n onSearchTextChange={onSearchTextChange}\r\n onSearchTextBlur={onSearchTextBlur}\r\n onSearchTextClear={onSearchTextClear}\r\n defaultSearchText={defaultSearchText}\r\n searchboxPlaceHolder={searchboxPlaceHolder}\r\n />\r\n <div className={classes.remaining} />\r\n <SortByFilter\r\n i18n={i18n}\r\n logger={logger}\r\n options={sortingOptions}\r\n onChange={onSortByChange}\r\n sortBy={sortBy}\r\n />\r\n </div>\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nexport const LibraryFilterBar = (props) => {\r\n const {\r\n i18n,\r\n logger,\r\n ianaTimeZone,\r\n dateFormat,\r\n defaultSearchText,\r\n searchboxPlaceHolder,\r\n isAdsStudioAIGCMVPEnabled,\r\n onUploadLocalFileClick,\r\n onUploadLocalFolderClick,\r\n onUploadImageClick,\r\n onUploadVideoClick,\r\n onAIGenerateClick,\r\n onCreateFolderClick,\r\n userPreference,\r\n } = props;\r\n\r\n const classes = useFilterBarStyles();\r\n // Filter state change will trigger useEffect reload\r\n const {\r\n assetTypes,\r\n assetTypesState,\r\n toggleAssetType,\r\n toggleFilterBar,\r\n showAdditionalFilterBar,\r\n isAdditionalFilterActive,\r\n isImageSelected,\r\n isVideoSelected,\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n sortBy,\r\n sortingOptions,\r\n onSortByChange,\r\n dateAddedChoiceOptions,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n onDateAddedFilterChange,\r\n importSource,\r\n importSourceOptions,\r\n onImportSourceFilterChange,\r\n assetSources,\r\n assetSourceOptions,\r\n onAssetSourceFilterChange,\r\n minWidthFilter,\r\n minHeightFilter,\r\n onImageSizeFilterChange,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n onVideoDurationFilterChange,\r\n } = useFilterBarState({\r\n logger,\r\n i18n,\r\n userPreference,\r\n defaultSearchText,\r\n });\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={classes.filterBar}>\r\n <NewDropDown\r\n onUploadLocalFileClick={onUploadLocalFileClick}\r\n onUploadLocalFolderClick={onUploadLocalFolderClick}\r\n onUploadImageClick={onUploadImageClick}\r\n onUploadVideoClick={onUploadVideoClick}\r\n onAIGenerateClick={onAIGenerateClick}\r\n onCreateFolderClick={onCreateFolderClick}\r\n i18n={i18n}\r\n logger={logger}\r\n />\r\n <AssetTypeToggleButtonsFilter\r\n i18n={i18n}\r\n className={classes.assetTypeToggleButtons}\r\n options={assetTypes}\r\n optionsState={assetTypesState}\r\n toggleSelectedOption={toggleAssetType}\r\n logger={logger}\r\n />\r\n <div className={classes.remaining} />\r\n <SearchBoxFilter\r\n i18n={i18n}\r\n logger={logger}\r\n onSearchTextChanging={onSearchTextChanging}\r\n onSearchTextChange={onSearchTextChange}\r\n onSearchTextBlur={onSearchTextBlur}\r\n onSearchTextClear={onSearchTextClear}\r\n defaultSearchText={defaultSearchText}\r\n searchboxPlaceHolder={searchboxPlaceHolder}\r\n />\r\n <FilterToggleButton\r\n i18n={i18n}\r\n onClick={() => toggleFilterBar()}\r\n checked={showAdditionalFilterBar}\r\n logger={logger}\r\n />\r\n <SortByFilter\r\n i18n={i18n}\r\n logger={logger}\r\n options={sortingOptions}\r\n onChange={onSortByChange}\r\n sortBy={sortBy}\r\n />\r\n </div>\r\n <AdditionalFilterBar\r\n i18n={i18n}\r\n showAdditionalFilterBar={showAdditionalFilterBar}\r\n isSelected={isAdditionalFilterActive}\r\n optionsState={assetTypesState}\r\n isImageSelected={isImageSelected}\r\n isVideoSelected={isVideoSelected}\r\n timeZone={ianaTimeZone}\r\n dateFormat={dateFormat}\r\n dateAddedChoiceOptions={dateAddedChoiceOptions}\r\n dateAddedFilter={dateAddedFilter}\r\n dateAddedFilterCustomDateRange={dateAddedFilterCustomDateRange}\r\n isAdsStudioAIGCMVPEnabled={isAdsStudioAIGCMVPEnabled}\r\n onDateAddedFilterChange={onDateAddedFilterChange}\r\n importSource={importSource}\r\n importSourceOptions={importSourceOptions}\r\n onImportSourceFilterChange={onImportSourceFilterChange}\r\n assetSources={assetSources}\r\n assetSourceOptions={assetSourceOptions}\r\n onAssetSourceFilterChange={onAssetSourceFilterChange}\r\n minWidthFilter={minWidthFilter}\r\n minHeightFilter={minHeightFilter}\r\n onImageSizeFilterChange={onImageSizeFilterChange}\r\n minDurationFilter={minDurationFilter}\r\n maxDurationFilter={maxDurationFilter}\r\n onVideoDurationFilterChange={onVideoDurationFilterChange}\r\n logger={logger}\r\n />\r\n </FluentProvider>\r\n );\r\n};\r\n\r\nexport const SearchResultFilterBar = (props) => {\r\n const {\r\n i18n,\r\n logger,\r\n defaultSearchText,\r\n searchboxPlaceHolder,\r\n } = props;\r\n\r\n const classes = useFilterBarStyles();\r\n const {\r\n onSearchTextChanging,\r\n onSearchTextBlur,\r\n onSearchTextChange,\r\n onSearchTextClear,\r\n } = useFilterBarState({ logger, i18n, defaultSearchText });\r\n\r\n return (\r\n <FluentProvider theme={webLightTheme}>\r\n <div className={mergeClasses('search-filter-bar', classes.filterBar)}>\r\n <SearchBoxFilter\r\n i18n={i18n}\r\n logger={logger}\r\n onSearchTextChanging={onSearchTextChanging}\r\n onSearchTextChange={onSearchTextChange}\r\n onSearchTextBlur={onSearchTextBlur}\r\n onSearchTextClear={onSearchTextClear}\r\n defaultSearchText={defaultSearchText}\r\n searchboxPlaceHolder={searchboxPlaceHolder}\r\n />\r\n <div className={classes.remaining} />\r\n </div>\r\n </FluentProvider>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { FilterContext } from './filter-context';\r\n\r\nexport const FilterContextProvider = (props) => {\r\n const [filterBar, setFilterBar] = useState({\r\n getFilters: () => ({}),\r\n });\r\n\r\n return (\r\n <FilterContext.Provider\r\n value={{\r\n filterBar,\r\n setFilterBar,\r\n }}\r\n >\r\n {props.children}\r\n </FilterContext.Provider>\r\n );\r\n};\r\n\r\nexport const withFilterContext = Component => props => (<FilterContextProvider><Component {...props} /></FilterContextProvider>);\r\n","import _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport React, { useCallback, useRef, useMemo } from 'react';\r\n// import { SearchBox } from '@bingads-webui-react/fabric-control';\r\n\r\nimport {\r\n // AssetTypeToggleButtonsFilter,\r\n ImportSourceFilter,\r\n AssetSourceFilter,\r\n ImageSizeFilter,\r\n // VideoDurationFilter,\r\n DateAddedFilter,\r\n SearchBoxFilter,\r\n} from './components';\r\nimport {\r\n CSMLTimeFrame,\r\n FilterType,\r\n // getAssetTypeOptions,\r\n getImportSourceOptions,\r\n getAssetSourceOptions,\r\n getDateAddedChoiceOptions,\r\n} from '../model';\r\nimport { civilDateRangeEqual, getDefaultDateRange } from '../utils';\r\n\r\n// export const AssetTypeFilterComponent = React.memo(({\r\n// filter, focused, onValueChange, onDropdownDismiss, i18n,\r\n// }) => {\r\n// const { value } = filter || {};\r\n// const { assetTypeFilter } = value || {};\r\n// const dropdownOptions = useMemo(() => getAssetTypeOptions(i18n), [i18n]);\r\n\r\n// const onChange = useCallback((newValue, newHumanizedVaue) => {\r\n// if (newValue !== assetTypeFilter) {\r\n// onValueChange(filter, { assetTypeFilter: newValue }, newHumanizedVaue);\r\n// }\r\n// }, [assetTypeFilter, filter, onValueChange]);\r\n\r\n// return (\r\n// <div className={classNames('dropdown-filter-container', 'asset-type-filter')}>\r\n// <AssetTypeToggleButtonsFilter\r\n// defaultAssetType={assetTypeFilter}\r\n// assetTypeFilterOptions={dropdownOptions}\r\n// dropdownWidth=\"auto\"\r\n// onChange={onChange}\r\n// onDismiss={(newValue, newHumanizedValue) => onDropdownDismiss(filter, { assetTypeFilter: newValue }, newHumanizedValue)}\r\n// focused={focused}\r\n// i18n={i18n}\r\n// />\r\n// </div>\r\n// );\r\n// });\r\n\r\nexport const ImportSourceFilterComponent = React.memo(({\r\n filter, i18n, onValueChange, onDropdownDismiss, defaultOpen,\r\n}) => {\r\n const { value } = filter || {};\r\n const { importSource } = value || {};\r\n const dropdownOptions = useMemo(() => getImportSourceOptions(i18n), [i18n]);\r\n\r\n const onChange = useCallback((newValue, newHumanizedVaue) => {\r\n const option = _.find(dropdownOptions, { key: newValue }) || {};\r\n if (newValue !== importSource) {\r\n onValueChange(filter, { importSource: newValue }, option.text || newHumanizedVaue);\r\n }\r\n }, [dropdownOptions, filter, importSource, onValueChange]);\r\n\r\n const onDismiss = useCallback((newValue, newHumanizedValue) => {\r\n const option = _.find(dropdownOptions, { key: newValue }) || {};\r\n onDropdownDismiss(filter, { importSource: newValue }, option.text || newHumanizedValue);\r\n }, [dropdownOptions, filter, onDropdownDismiss]);\r\n\r\n return (\r\n <div className={classNames('dropdown-filter-container', 'ads-studio-import-source-filter')}>\r\n <ImportSourceFilter\r\n defaultOpen={defaultOpen}\r\n defaultImportSource={importSource}\r\n options={dropdownOptions}\r\n onChange={onChange}\r\n onDismiss={onDismiss}\r\n i18n={i18n}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nexport const AssetSourceFilterComponent = React.memo(({\r\n filter, i18n, onValueChange, onDropdownDismiss, defaultOpen,\r\n}) => {\r\n const { value } = filter || {};\r\n const { assetSources } = value || {};\r\n const assetSourceOptions = useMemo(() => getAssetSourceOptions(i18n), [i18n]);\r\n const onChange = useCallback((newAssetSources, newHumanizedVaue) => {\r\n if (!_.isEqual(assetSources, newAssetSources)) {\r\n onValueChange(filter, { assetSources: newAssetSources }, newHumanizedVaue);\r\n }\r\n }, [assetSources, filter, onValueChange]);\r\n\r\n const onDismiss = useCallback((newValue, newHumanizedValue) => {\r\n onDropdownDismiss(filter, { assetSources: newValue }, newHumanizedValue);\r\n }, [filter, onDropdownDismiss]);\r\n\r\n return (\r\n <div className={classNames('dropdown-filter-container', 'ads-studio-asset-source-filter')}>\r\n <AssetSourceFilter\r\n defaultOpen={defaultOpen}\r\n defaultSelectedAssetSources={assetSources || []}\r\n options={assetSourceOptions}\r\n onChange={onChange}\r\n onDismiss={onDismiss}\r\n i18n={i18n}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nexport const ImageSizeFilterComponent = React.memo(({\r\n filter, i18n, onValueChange, onDropdownDismiss, defaultOpen,\r\n}) => {\r\n const { value } = filter || {};\r\n const { minImageWidth, minImageHeight } = value || {};\r\n\r\n const onImageSizeChange = useCallback((newValue, newHumanizedVaue) => {\r\n const { newMinWidth, newMinHeight } = newValue || {};\r\n if (minImageWidth !== newMinWidth || minImageHeight !== newMinHeight) {\r\n onValueChange(filter, { minImageWidth: newMinWidth, minImageHeight: newMinHeight }, newHumanizedVaue);\r\n }\r\n }, [filter, minImageHeight, minImageWidth, onValueChange]);\r\n\r\n const onDismiss = useCallback((newValue, newHumanizedValue) => {\r\n const { newMinWidth, newMinHeight } = newValue || {};\r\n onDropdownDismiss(filter, { minImageWidth: newMinWidth, minImageHeight: newMinHeight }, newHumanizedValue);\r\n }, [filter, onDropdownDismiss]);\r\n\r\n return (\r\n <div className={classNames('dropdown-filter-container', 'ads-studio-image-size-filter')}>\r\n <ImageSizeFilter\r\n defaultOpen={defaultOpen}\r\n defaultMinWidth={minImageWidth}\r\n defaultMinHeight={minImageHeight}\r\n onChange={onImageSizeChange}\r\n onDismiss={onDismiss}\r\n i18n={i18n}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\n// export const VideoDurationFilterComponent = React.memo(({\r\n// filter, focused, i18n, onValueChange, onDropdownDismiss,\r\n// }) => {\r\n// const { value } = filter || {};\r\n// const { minVideoDuration, maxVideoDuration } = value || {};\r\n\r\n// const onChange = useCallback((newValue, newHumanizedVaue) => {\r\n// const { newMinDuration, newMaxDuration } = newValue || {};\r\n// if (minVideoDuration !== newMinDuration || maxVideoDuration !== newMaxDuration) {\r\n// onValueChange(filter, { minVideoDuration: newMinDuration, maxVideoDuration: newMaxDuration }, newHumanizedVaue);\r\n// }\r\n// }, [filter, maxVideoDuration, minVideoDuration, onValueChange]);\r\n\r\n// const onDismiss = useCallback((newValue, newHumanizedValue) => {\r\n// const { newMinDuration, newMaxDuration } = newValue || {};\r\n// onDropdownDismiss(filter, { minVideoDuration: newMinDuration, maxVideoDuration: newMaxDuration }, newHumanizedValue);\r\n// }, [filter, onDropdownDismiss]);\r\n\r\n// return (\r\n// <div className={classNames('dropdown-filter-container', 'video-duration-filter')}>\r\n// <VideoDurationFilter\r\n// defaultMinDuration={minVideoDuration}\r\n// defaultMaxDuration={maxVideoDuration}\r\n// dropdownWidth=\"auto\"\r\n// onChange={onChange}\r\n// onDismiss={onDismiss}\r\n// focused={focused}\r\n// i18n={i18n}\r\n// />\r\n// </div>\r\n// );\r\n// });\r\n\r\nexport const AL_DATE_ADDED_FILTER_DEFAULT_RANGE = getDefaultDateRange();\r\nexport const DateAddedFilterComponent = React.memo(({\r\n filter, i18n, onValueChange, onDropdownDismiss, ianaTimeZone, dateFormat, defaultOpen,\r\n}) => {\r\n const { value } = filter || {};\r\n const { dateAddedFilter, dateAddedFilterCustomDateRange = AL_DATE_ADDED_FILTER_DEFAULT_RANGE } = value || {};\r\n const dateAddedChoiceOptions = useMemo(() => getDateAddedChoiceOptions(i18n, ianaTimeZone), [i18n, ianaTimeZone]);\r\n\r\n const onChange = useCallback((newValue, newHumanizedVaue) => {\r\n const { timeframe: tf, customDateRange: cdr } = newValue || {};\r\n if (tf !== dateAddedFilter || !civilDateRangeEqual(cdr, dateAddedFilterCustomDateRange)) {\r\n onValueChange(filter, { dateAddedFilter: tf, dateAddedFilterCustomDateRange: cdr }, newHumanizedVaue);\r\n }\r\n }, [dateAddedFilter, dateAddedFilterCustomDateRange, filter, onValueChange]);\r\n\r\n const onDismiss = useCallback((newValue, newHumanizedValue) => {\r\n const { timeframe: tf, customDateRange: cdr } = newValue || {};\r\n onDropdownDismiss(filter, { dateAddedFilter: tf, dateAddedFilterCustomDateRange: cdr }, newHumanizedValue);\r\n }, [filter, onDropdownDismiss]);\r\n\r\n return (\r\n <div className={classNames('dropdown-filter-container', 'ads-studio-date-added-filter')}>\r\n <DateAddedFilter\r\n defaultOpen={defaultOpen}\r\n defaultTimeFrame={dateAddedFilter || CSMLTimeFrame.Anytime}\r\n defaultCustomDateRange={dateAddedFilterCustomDateRange}\r\n options={dateAddedChoiceOptions}\r\n onChange={onChange}\r\n onDismiss={onDismiss}\r\n timeZone={ianaTimeZone}\r\n dateFormat={dateFormat}\r\n i18n={i18n}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nexport const PerformanceSearchTextFilterComponent = React.memo(({ i18n, filter, onValueChange }) => {\r\n const { value, title } = filter || {};\r\n const { searchText } = value || {};\r\n\r\n const searchTextValueRef = useRef('');\r\n const onSearchTextChanging = useCallback((evt, newValue) => {\r\n searchTextValueRef.current = newValue || '';\r\n }, []);\r\n\r\n const onSearchTextChange = useCallback((newValue) => {\r\n if (newValue !== searchText) {\r\n onValueChange(filter, { searchText: newValue }, newValue);\r\n }\r\n }, [filter, onValueChange, searchText]);\r\n\r\n const onSearchTextBlur = useCallback(() => {\r\n onSearchTextChange(searchTextValueRef.current);\r\n }, [onSearchTextChange]);\r\n\r\n\r\n const onSearchTextClear = useCallback(() => {\r\n onSearchTextChange('');\r\n }, [onSearchTextChange]);\r\n\r\n return (\r\n <div className={classNames('asset-library-search')}>\r\n <SearchBoxFilter\r\n i18n={i18n}\r\n ariaLabel={i18n.getString(_TL_('toolbar area search'))}\r\n // logger={logger}\r\n onSearchTextChanging={onSearchTextChanging}\r\n onSearchTextChange={onSearchTextChange}\r\n onSearchTextBlur={onSearchTextBlur}\r\n onSearchTextClear={onSearchTextClear}\r\n defaultSearchText={searchText || ''}\r\n searchboxPlaceHolder={i18n.getString(title)}\r\n />\r\n {/* <SearchBox\r\n placeholder={i18n.getString(title)}\r\n showIcon\r\n defaultValue={searchText || ''}\r\n onSearch={onSearchTextChange}\r\n onClear={onSearchTextClear}\r\n onChange={onSearchTextChanging}\r\n onBlur={onSearchTextBlur}\r\n /> */}\r\n </div>\r\n );\r\n});\r\n\r\nexport const getPerformanceFilterComponents = ({ isAdsStudioAIGCMVPEnabled }) => {\r\n const ComponentMap = {\r\n // [FilterType.AssetType]: AssetTypeFilterComponent,\r\n [FilterType.ImportSource]: !isAdsStudioAIGCMVPEnabled ? ImportSourceFilterComponent : undefined,\r\n [FilterType.AssetSource]: isAdsStudioAIGCMVPEnabled ? AssetSourceFilterComponent : undefined,\r\n [FilterType.ImageSize]: ImageSizeFilterComponent,\r\n // [FilterType.VideoDuration]: VideoDurationFilterComponent,\r\n [FilterType.DateAdded]: DateAddedFilterComponent,\r\n [FilterType.SearchText]: PerformanceSearchTextFilterComponent,\r\n };\r\n return ComponentMap;\r\n};\r\n","import { makeStyles } from '@fluentui/react-components';\r\n\r\nexport const useBreadcrumbStyles = makeStyles({\r\n breadcrumbButton: {\r\n '&.fui-BreadcrumbButton': {\r\n color: '#0F6CBD',\r\n },\r\n },\r\n breadcrumbButtonCurrent: {\r\n '&.fui-BreadcrumbButton': {\r\n color: '#424242',\r\n fontWeight: 400,\r\n },\r\n },\r\n breadcrumbContainer: {\r\n marginBottom: '24px',\r\n },\r\n});\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\nimport { AdsStudioBreadcrumb } from '../ads-studio-breadcrumb';\r\n\r\nimport { useBreadcrumbStyles } from './style';\r\n\r\nexport const FolderPathBreadcrumb = ({\r\n folderPath,\r\n onItemClick,\r\n visibleForRootFolder,\r\n}) => {\r\n const items = useMemo(() => folderPath.map(item => ({\r\n key: item.folderId,\r\n text: item.folderName,\r\n })), [folderPath]);\r\n\r\n const classes = useBreadcrumbStyles();\r\n\r\n return (\r\n items.length > 1 || visibleForRootFolder ? (\r\n <div className={classNames('folder-path-breadcrumb', classes.breadcrumbContainer)}>\r\n <AdsStudioBreadcrumb\r\n items={items}\r\n onItemClick={onItemClick}\r\n customItemStyle={{\r\n breadcrumbButton: classNames('parent-folder-path', classes.breadcrumbButton),\r\n breadcrumbButtonCurrent: classNames('current-folder-path', classes.breadcrumbButtonCurrent),\r\n }}\r\n />\r\n </div>\r\n ) : null\r\n );\r\n};\r\n\r\nFolderPathBreadcrumb.propTypes = {\r\n folderPath: PropTypes.arrayOf(PropTypes.shape({\r\n folderId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\r\n folderName: PropTypes.string,\r\n })),\r\n onItemClick: PropTypes.func.isRequired,\r\n visibleForRootFolder: PropTypes.bool,\r\n};\r\n\r\nFolderPathBreadcrumb.defaultProps = {\r\n folderPath: [],\r\n visibleForRootFolder: false,\r\n};\r\n","import { makeStyles, shorthands } from '@fluentui/react-components';\r\n\r\nexport const useAdsStudioLibraryPageContentStyle = makeStyles({\r\n container: {\r\n '& .ads-studio-grid-container': {\r\n marginTop: '12px',\r\n position: 'relative',\r\n ...shorthands.overflow('hidden'),\r\n // to show the shadow\r\n paddingLeft: '15px',\r\n paddingRight: '15px',\r\n },\r\n '& .library-page-header': {\r\n position: 'sticky',\r\n paddingBottom: '12px',\r\n paddingTop: '24px',\r\n paddingLeft: '36px',\r\n paddingRight: '36px',\r\n marginLeft: '-21px',\r\n marginRight: '-21px',\r\n top: 0,\r\n zIndex: 10,\r\n backgroundColor: 'white',\r\n height: 'auto',\r\n '& .library-page-header-top-wrapper': {\r\n visibility: 'visible',\r\n },\r\n '&.show-bulk-toolbar': {\r\n paddingTop: '12px',\r\n height: '80px',\r\n '& .library-page-header-top-wrapper': {\r\n visibility: 'hidden',\r\n },\r\n },\r\n },\r\n '& .library-page-header-toolbar': {\r\n position: 'absolute',\r\n top: '12px',\r\n left: '36px',\r\n right: '36px',\r\n zIndex: 11,\r\n backgroundColor: 'white',\r\n },\r\n },\r\n});\r\n\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nexport const HiddenDivForAnnounce = ({\r\n toAnnounce,\r\n}) => {\r\n const [announce, setAnnounce] = useState('');\r\n\r\n useEffect(() => {\r\n if (toAnnounce && announce !== toAnnounce) {\r\n setAnnounce(toAnnounce);\r\n }\r\n }, [announce, toAnnounce]);\r\n\r\n return (\r\n <div\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n style={{\r\n position: 'absolute',\r\n width: 1,\r\n height: 1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n margin: '-1px',\r\n clip: 'rect(0,0,0,0)',\r\n border: 0,\r\n }}\r\n >\r\n {announce}\r\n </div>\r\n );\r\n};\r\n","import _ from 'underscore';\r\nimport { DEFAULT_CONFIG as DEFAULT_GRID_CONFIG } from '../ads-studio-tile-grid';\r\n\r\nexport const FOLDER_GRID_CONFIG = { ...DEFAULT_GRID_CONFIG, aspectRatio: undefined, rowHeight: 100 };\r\n\r\n// null means loading\r\nexport const isSectionDataLoadingStatus =\r\n sectionData => _.every(sectionData, ({ items }) => items == null);\r\n\r\n// [] means loaded, but no data\r\nexport const isSectionDataEmptyStatus =\r\n (sectionData) => {\r\n const anySectionLoaded = _.any(sectionData, ({ items }) => !!items);\r\n\r\n return anySectionLoaded && _.every(sectionData, ({ items }) => _.isEmpty(items));\r\n };\r\n","import _ from 'underscore';\r\nimport React, { useCallback, useEffect, useMemo, useState, useContext, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classnames from 'classnames';\r\nimport { Overlay } from '@bingads-webui-react/fabric-control';\r\nimport { setClarityTag } from '@bingads-webui-universal/clarity';\r\nimport { useJsData } from '@bingads-webui-cc-react/js-data-rest';\r\n\r\nimport { LibraryEmptyView } from '../empty-view/library-page-empty-view';\r\nimport { LibraryFilterBar, FilterContext } from '../../filter-bar';\r\n\r\nimport { SectionTilesGrid, DEFAULT_CONFIG as DEFAULT_GRID_CONFIG } from '../ads-studio-tile-grid';\r\n\r\nimport {\r\n GridSectionName,\r\n DEFAULT_PAGE_SIZE,\r\n AdsStudioPageName,\r\n FolderAssetType,\r\n CSMLTimeFrame,\r\n getDateAddedChoiceOptions,\r\n getUpdatedAssets,\r\n AIGCHandler,\r\n isValidXandrAccount,\r\n} from '../../model';\r\n\r\nimport { FolderPathBreadcrumb } from '../folder-path-breadcrumb';\r\nimport { AdsStudioSpinner } from '../ads-studio-spinner';\r\n\r\nimport { useAdsStudioLibraryPageContentStyle } from './styles/library-page-style';\r\nimport {\r\n isSectionDataLoadingStatus,\r\n isSectionDataEmptyStatus,\r\n} from './sections-utils';\r\nimport { HiddenDivForAnnounce } from '../hidden-div-for-announce';\r\n\r\nconst overlaySpinnerStyles = { margin: 200 };\r\n// const bottomSpinnerStyles = { marginTop: 20, marginBottom: 100 };\r\n\r\nconst FOLDER_GRID_CONFIG = {\r\n ...DEFAULT_GRID_CONFIG,\r\n aspectRatio: undefined,\r\n rowHeight: 110,\r\n // width: 320,\r\n};\r\n\r\nconst AdsStudioLibraryPageContentInternal = ({\r\n dataService,\r\n renderHeader,\r\n renderGridCell,\r\n onFailedToLoadData,\r\n dateFormat,\r\n ianaTimeZone,\r\n // assetLibraryUserPreferences,\r\n // assetLibraryAccountPreferences,\r\n adsStudioUserPreferences,\r\n reload,\r\n logger,\r\n i18n,\r\n aid,\r\n cid,\r\n oDataConfig,\r\n dataLoaded,\r\n perfMarker,\r\n displayFolderPath,\r\n reloadingFolders,\r\n assetsToLoadForSubfolders,\r\n renderToolbar,\r\n renderEmptyView,\r\n\r\n // multi-selection props\r\n multiSelectionEnabled,\r\n onSelectionChange,\r\n // onFolderNavigationChange,\r\n sectionSelectedItems,\r\n //\r\n // searchLocationFilterState,\r\n // setSearchLocationFilterState,\r\n\r\n // realUsedFlagSuffix,\r\n isAssetLibraryAIGCMVPEnabled,\r\n isAdsStudioAIGCMVPEnabled,\r\n isAIGCRegionRestricted,\r\n notificationApi,\r\n // isClickableOutsideFocusTrap,\r\n\r\n preDefinedAssetSources,\r\n // disabledAssetSources,\r\n onCreateFolderClick,\r\n navigation,\r\n\r\n gridScrollContainer,\r\n permissions,\r\n}) => {\r\n const isXandrIntEnabled = useMemo(() => permissions.dynamic.XandrIntegrationEnabled, [permissions]);\r\n // eslint-disable-next-line no-restricted-globals\r\n const { data: account } = useJsData(jsData => (isXandrIntEnabled ? jsData.Account.find(aid) : Promise.resolve()), [aid, isXandrIntEnabled]);\r\n const isXandrIntegrationEnabled = useMemo(() => (isXandrIntEnabled ? isValidXandrAccount(account) : false), [account, isXandrIntEnabled]);\r\n\r\n const classes = useAdsStudioLibraryPageContentStyle();\r\n const [announcedText, setAnnouncedText] = useState('');\r\n\r\n const { filterBar } = useContext(FilterContext);\r\n const {\r\n isImageSelected,\r\n isVideoSelected,\r\n searchText: searchBoxText,\r\n sortBy,\r\n dateAddedFilter,\r\n dateAddedFilterCustomDateRange,\r\n importSource,\r\n assetSources,\r\n minWidthFilter,\r\n minHeightFilter,\r\n minDurationFilter,\r\n maxDurationFilter,\r\n } = useMemo(() => filterBar.getFilters(), [filterBar]);\r\n\r\n const isAnyFilterSet = searchBoxText || importSource || isImageSelected || isVideoSelected\r\n || minWidthFilter || minHeightFilter || minDurationFilter || maxDurationFilter\r\n || (dateAddedFilter && dateAddedFilter !== CSMLTimeFrame.Anytime) || !_.isEmpty(assetSources);\r\n\r\n const {\r\n assets,\r\n totalAssetCount,\r\n totalSubfoldersCount,\r\n imageCroppingTasks,\r\n loadData,\r\n loadMoreData,\r\n folderPath,\r\n navigateToFolderInPath,\r\n folders,\r\n currentFolderId,\r\n videoUpdated,\r\n dataOwnerPageName,\r\n } = dataService || {};\r\n\r\n const openSystemUploadRef = useRef(null);\r\n\r\n const onUploadLocalFileClick = useCallback(() => {\r\n openSystemUploadRef.current = {};\r\n navigation.gotoUploadFilesPanelPage({\r\n aid, cid, oDataConfig, i18n, openSystemUpload: openSystemUploadRef.current,\r\n });\r\n }, [aid, cid, i18n, navigation, oDataConfig]);\r\n\r\n const onStockButtonClick = useCallback((props) => {\r\n if (logger && logger.logTrace) {\r\n logger.logTrace('Add asset from shutterstock');\r\n }\r\n navigation.gotoStockImagePanelPage(props);\r\n }, [logger, navigation]);\r\n\r\n const onInvestButtonClick = useCallback((props) => {\r\n if (logger && logger.logTrace) {\r\n logger.logTrace('Add asset from invest');\r\n }\r\n navigation.gotoInvestImagePanelPage(props);\r\n }, [logger, navigation]);\r\n\r\n const onWebsiteButtonClick = useCallback((props) => {\r\n if (logger && logger.logTrace) {\r\n logger.logTrace('Add asset from website');\r\n }\r\n navigation.gotoWebsiteImagePanelPage(props);\r\n }, [logger, navigation]);\r\n\r\n const onUploadLocalFolderClick = useCallback(() => {\r\n openSystemUploadRef.current = {};\r\n navigation.gotoUploadFolderPanelPage({\r\n aid, cid, oDataConfig, i18n, openSystemUpload: openSystemUploadRef.current,\r\n });\r\n }, [aid, cid, i18n, navigation, oDataConfig]);\r\n\r\n const onUploadVideoClick = useCallback(() => {\r\n if (logger && logger.logTrace) {\r\n logger.logTrace('Add video from URl');\r\n }\r\n\r\n if (isXandrIntegrationEnabled) {\r\n navigation.gotoMixedVideoPanelPage({\r\n aid, cid, oDataConfig, i18n,\r\n });\r\n } else {\r\n navigation.gotoAddVideoPanelPage({\r\n aid, cid, oDataConfig, i18n,\r\n });\r\n }\r\n }, [aid, cid, i18n, logger, navigation, oDataConfig, isXandrIntegrationEnabled]);\r\n\r\n const onUploadImageClick = useCallback(() => {\r\n navigation.gotoMixedImagePanelPage({\r\n aid, cid, oDataConfig, i18n,\r\n });\r\n }, [aid, cid, i18n, navigation, oDataConfig]);\r\n\r\n // // load assets for initial page load, or after any filters are changed\r\n const loadedAssetList = useMemo(() => getUpdatedAssets({\r\n assets,\r\n updates: {\r\n imageCroppingTasks,\r\n videoUpdated,\r\n },\r\n }), [assets, imageCroppingTasks, videoUpdated]);\r\n\r\n const onRenderCell = useCallback(({ item, sectionName, ...others }) => {\r\n if (renderGridCell) {\r\n const cell = renderGridCell({\r\n item, searchText: searchBoxText, sectionName, ...others,\r\n });\r\n if (cell) return cell;\r\n }\r\n return null;\r\n }, [renderGridCell, searchBoxText]);\r\n\r\n const [isPageInited, setPageInited] = useState(false);\r\n // const [isGridInited, setGridInited] = useState(false);\r\n const [loadingData, setLoadingData] = useState(false);\r\n\r\n const loadDataAsync = useCallback(() => {\r\n // get selected date range for date added filter\r\n let dateAddedDateRange;\r\n if (dateAddedFilter === CSMLTimeFrame.Custom) {\r\n dateAddedDateRange = dateAddedFilterCustomDateRange;\r\n } else {\r\n const dateAddedChoiceOptions = getDateAddedChoiceOptions(i18n, ianaTimeZone);\r\n const { range } = _.find(dateAddedChoiceOptions, o => o.key === dateAddedFilter) || {};\r\n dateAddedDateRange = range;\r\n }\r\n\r\n const usePreDefinedAssetSources = preDefinedAssetSources.length > 0 && assetSources.length === 0;\r\n let assetTypeFilter = null;\r\n if (isImageSelected || isVideoSelected) {\r\n assetTypeFilter = isImageSelected ? FolderAssetType.Image : FolderAssetType.Video;\r\n }\r\n let libraryPageLoadDataPerfMarker;\r\n if (perfMarker) {\r\n libraryPageLoadDataPerfMarker = perfMarker.createChild('libraryPageLoadData');\r\n }\r\n return loadData({\r\n searchText: searchBoxText,\r\n minImageWidth: minWidthFilter,\r\n minImageHeight: minHeightFilter,\r\n minVideoDuration: minDurationFilter,\r\n maxVideoDuration: maxDurationFilter,\r\n dateAddedDateRange,\r\n sortBy,\r\n importSource,\r\n assetSources: usePreDefinedAssetSources ? preDefinedAssetSources : assetSources,\r\n assetsToLoadForSubfolders,\r\n assetTypeFilter,\r\n isGlobalSearch: false,\r\n includeParentHierarchy: false, // include parent hierarchy when global searching\r\n pageName: AdsStudioPageName.LibraryPage,\r\n perfMarker: libraryPageLoadDataPerfMarker,\r\n });\r\n }, [assetSources, assetsToLoadForSubfolders, dateAddedFilter, dateAddedFilterCustomDateRange, i18n, ianaTimeZone, importSource, isImageSelected, isVideoSelected, loadData, maxDurationFilter, minDurationFilter, minHeightFilter, minWidthFilter, preDefinedAssetSources, searchBoxText, sortBy]);\r\n\r\n const bulkTookbar = useMemo(() => (renderToolbar ? renderToolbar() : null), [renderToolbar]);\r\n\r\n const onFolderPathClicked = useCallback((item) => {\r\n logger.logTrace('Navigate to folder in path', { folderId: item.key });\r\n navigateToFolderInPath({ id: item.key });\r\n }, [navigateToFolderInPath, logger]);\r\n\r\n const onRenderHeader = useCallback(() => (\r\n !renderHeader ? (\r\n <div className={classnames('library-page-header', bulkTookbar && 'show-bulk-toolbar')}>\r\n <div className={classnames('library-page-header-top-wrapper')}>\r\n {/* display folder path */}\r\n {displayFolderPath &&\r\n <FolderPathBreadcrumb\r\n folderPath={folderPath}\r\n onItemClick={onFolderPathClicked}\r\n />\r\n }\r\n <LibraryFilterBar\r\n i18n={i18n}\r\n logger={logger}\r\n ianaTimeZone={ianaTimeZone}\r\n dateFormat={dateFormat}\r\n isAdsStudioAIGCMVPEnabled={isAdsStudioAIGCMVPEnabled && !isAIGCRegionRestricted}\r\n onUploadLocalFileClick={onUploadLocalFileClick}\r\n onUploadLocalFolderClick={onUploadLocalFolderClick}\r\n onUploadImageClick={onUploadImageClick}\r\n onUploadVideoClick={onUploadVideoClick}\r\n onAIGenerateClick={() => {\r\n AIGCHandler(isAdsStudioAIGCMVPEnabled, isAIGCRegionRestricted, notificationApi, i18n, () => {\r\n navigation.gotoAIGenerationPanelPage({ folderId: currentFolderId });\r\n });\r\n }}\r\n onCreateFolderClick={onCreateFolderClick}\r\n userPreference={adsStudioUserPreferences}\r\n />\r\n </div>\r\n <div className=\"library-page-header-toolbar\">\r\n {bulkTookbar}\r\n </div>\r\n </div>\r\n\r\n ) : (\r\n renderHeader()\r\n )\r\n ), [adsStudioUserPreferences, bulkTookbar, currentFolderId, dateFormat, displayFolderPath, folderPath, i18n, ianaTimeZone, isAIGCRegionRestricted, isAdsStudioAIGCMVPEnabled, logger, navigation, notificationApi, onCreateFolderClick, onFolderPathClicked, onUploadImageClick, onUploadLocalFileClick, onUploadLocalFolderClick, onUploadVideoClick, renderHeader]);\r\n\r\n const foldersGridSection = useMemo(() => ({\r\n sectionName: GridSectionName.Folder,\r\n sectionTitle: i18n.getString(_TL_('Folders')),\r\n sectionClassName: 'ads-studio-folders-section',\r\n itemKey: 'folderId',\r\n items: folders,\r\n totalItemCount: totalSubfoldersCount,\r\n config: {\r\n ...FOLDER_GRID_CONFIG,\r\n scrollContainer: gridScrollContainer,\r\n },\r\n selectedItems: sectionSelectedItems && sectionSelectedItems[GridSectionName.Folder],\r\n }), [folders, gridScrollContainer, i18n, sectionSelectedItems, totalSubfoldersCount]);\r\n\r\n const assetsGridSection = useMemo(() => ({\r\n sectionName: GridSectionName.Asset,\r\n sectionTitle: i18n.getString(_TL_('Assets')),\r\n sectionClassName: 'ads-studio-assets-section',\r\n itemKey: 'id',\r\n items: loadedAssetList,\r\n totalItemCount: totalAssetCount,\r\n selectedItems: sectionSelectedItems && sectionSelectedItems[GridSectionName.Asset],\r\n config: {\r\n scrollContainer: gridScrollContainer,\r\n minItemHeight: 42,\r\n },\r\n }), [gridScrollContainer, i18n, loadedAssetList, sectionSelectedItems, totalAssetCount]);\r\n\r\n const sectionGridData = useMemo(\r\n () => ([foldersGridSection, assetsGridSection]),\r\n [assetsGridSection, foldersGridSection]\r\n );\r\n\r\n // init page\r\n useEffect(() => {\r\n if (!isPageInited) {\r\n setPageInited(true);\r\n }\r\n }, [isPageInited]);\r\n\r\n useEffect(() => {\r\n if (isAssetLibraryAIGCMVPEnabled) {\r\n setClarityTag({ AssetLibraryCopilot: 'true' });\r\n }\r\n }, [isAssetLibraryAIGCMVPEnabled]);\r\n\r\n // load data for initial page load\r\n useEffect(() => {\r\n if (!isPageInited) {\r\n // wait until page is initialized\r\n return;\r\n }\r\n\r\n if (reload) { // Important! Add a trivial log so that reload will be an explicit dep.\r\n logger.logTrace('force to reload');\r\n }\r\n if (perfMarker) {\r\n perfMarker.willFetchData();\r\n }\r\n setLoadingData(true);\r\n loadDataAsync()\r\n .tapCatch((err) => { // throw out so that this error will be shown in console for easy debugging\r\n onFailedToLoadData(err);\r\n }).finally(() => {\r\n setLoadingData(false);\r\n if (perfMarker) {\r\n perfMarker.willRender();\r\n }\r\n dataLoaded();\r\n // setGridInited(true);\r\n });\r\n }, [isPageInited, loadDataAsync, onFailedToLoadData, reload, logger]);\r\n\r\n const loadNextPage = useCallback(() => {\r\n loadMoreData({ count: DEFAULT_PAGE_SIZE }).catch((err) => {\r\n onFailedToLoadData(err);\r\n });\r\n }, [loadMoreData, onFailedToLoadData]);\r\n\r\n const isPageLoading = !isPageInited\r\n || loadingData || isSectionDataLoadingStatus(sectionGridData) || reloadingFolders;\r\n\r\n const hadNoData = isSectionDataEmptyStatus(sectionGridData);\r\n\r\n useEffect(() => {\r\n if (!isPageLoading && hadNoData && !_.isFunction(renderEmptyView) && isAnyFilterSet) {\r\n setAnnouncedText(i18n.getString(_TL_('No assets match your search. Please try again.')));\r\n } else {\r\n setAnnouncedText('');\r\n }\r\n }, [hadNoData, i18n, isAnyFilterSet, isPageLoading, renderEmptyView]);\r\n\r\n return (\r\n <div className={classnames('ads-studio-page', classes.container, classes.injectedContentContainer)}>\r\n {/* grid header or toolbar */}\r\n {onRenderHeader()}\r\n\r\n {/* grid content */}\r\n <div className=\"ads-studio-grid-container\">\r\n {(!dataOwnerPageName || dataOwnerPageName === AdsStudioPageName.LibraryPage) && (\r\n <SectionTilesGrid\r\n sectionData={sectionGridData}\r\n onRenderCell={onRenderCell}\r\n loadNextPage={loadNextPage}\r\n multiSelectionEnabled={multiSelectionEnabled}\r\n onSelectionChange={onSelectionChange}\r\n />\r\n )}\r\n </div>\r\n {/* show loading indicator */}\r\n {isPageLoading && (\r\n <Overlay>\r\n <AdsStudioSpinner className=\"page-load-spinner\" useCustomSize customStyle={overlaySpinnerStyles} />\r\n </Overlay>\r\n )}\r\n\r\n {/* no content */}\r\n {(!isPageLoading && hadNoData) && (\r\n <div className={classnames('ads-studio-no-data', classes.emptyViewContainer)}>\r\n {\r\n renderEmptyView ? renderEmptyView() : (\r\n <LibraryEmptyView\r\n i18n={i18n}\r\n isInSubfolder={!!(folderPath && folderPath.length > 1)}\r\n isAnyFilterSet={isAnyFilterSet}\r\n onClickCreate={() => {\r\n AIGCHandler(isAdsStudioAIGCMVPEnabled, isAIGCRegionRestricted, notificationApi, i18n, () => {\r\n navigation.gotoAIGenerationPanelPage({ folderId: currentFolderId });\r\n });\r\n }}\r\n onClickUpload={onUploadLocalFileClick}\r\n onClickStock={onStockButtonClick}\r\n onClickWebsite={onWebsiteButtonClick}\r\n onClickInvest={onInvestButtonClick}\r\n isXandrIntegrationEnabled={isXandrIntegrationEnabled}\r\n />\r\n )\r\n }\r\n </div>\r\n )}\r\n <HiddenDivForAnnounce toAnnounce={announcedText} />\r\n </div>\r\n );\r\n};\r\n\r\nAdsStudioLibraryPageContentInternal.propTypes = {\r\n dataService: PropTypes.shape({\r\n assets: PropTypes.arrayOf(PropTypes.shape({})),\r\n totalAssetCount: PropTypes.number,\r\n imageCroppingTasks: PropTypes.shape({}),\r\n loadData: PropTypes.func,\r\n loadMoreData: PropTypes.func,\r\n }).isRequired,\r\n onFailedToLoadData: PropTypes.func,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func,\r\n logError: PropTypes.func,\r\n }).isRequired,\r\n ianaTimeZone: PropTypes.string.isRequired,\r\n dateFormat: PropTypes.string.isRequired,\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func,\r\n getToday: PropTypes.func,\r\n formatCivilDate: PropTypes.func,\r\n }).isRequired,\r\n assetLibraryUserPreferences: PropTypes.shape({\r\n sortBy: PropTypes.string,\r\n setSortBy: PropTypes.func,\r\n }),\r\n assetLibraryAccountPreferences: PropTypes.shape({}),\r\n reload: PropTypes.shape({}), // if changed, force to reload\r\n renderHeader: PropTypes.func,\r\n renderGridCell: PropTypes.func,\r\n renderToolbar: PropTypes.func,\r\n\r\n dataLoaded: PropTypes.func,\r\n displayFolderPath: PropTypes.bool,\r\n reloadingFolders: PropTypes.bool,\r\n assetsToLoadForSubfolders: PropTypes.number,\r\n\r\n // multi selection\r\n multiSelectionEnabled: PropTypes.bool,\r\n onSelectionChange: PropTypes.func,\r\n // onFolderNavigationChange: PropTypes.func,\r\n sectionSelectedItems: PropTypes.shape({}),\r\n\r\n // searchLocationFilterState: PropTypes.string,\r\n // setSearchLocationFilterState: PropTypes.func,\r\n\r\n // realUsedFlagSuffix: PropTypes.string,\r\n isAssetLibraryAIGCMVPEnabled: PropTypes.bool,\r\n isAdsStudioAIGCMVPEnabled: PropTypes.bool,\r\n // isClickableOutsideFocusTrap: PropTypes.bool,\r\n\r\n // custom filter\r\n preDefinedAssetSources: PropTypes.arrayOf(PropTypes.shape({})),\r\n // disabledAssetSources: PropTypes.arrayOf(PropTypes.string),\r\n onCreateFolderClick: PropTypes.func,\r\n navigation: PropTypes.shape({\r\n gotoUploadFilesPanelPage: PropTypes.func,\r\n gotoUploadFolderPanelPage: PropTypes.func,\r\n gotoWebsiteImagePanelPage: PropTypes.func,\r\n gotoStockImagePanelPage: PropTypes.func,\r\n gotoAddVideoPanelPage: PropTypes.func,\r\n gotoAIGenerationPanelPage: PropTypes.func,\r\n gotoMixedImagePanelPage: PropTypes.func,\r\n gotoMixedVideoPanelPage: PropTypes.func,\r\n gotoInvestImagePanelPage: PropTypes.func,\r\n }),\r\n gridScrollContainer: PropTypes.string,\r\n isAIGCRegionRestricted: PropTypes.bool,\r\n permissions: PropTypes.shape({\r\n dynamic: PropTypes.shape({}),\r\n }),\r\n\r\n};\r\n\r\nAdsStudioLibraryPageContentInternal.defaultProps = {\r\n assetLibraryUserPreferences: null,\r\n assetLibraryAccountPreferences: null,\r\n reload: null,\r\n renderHeader: null,\r\n renderGridCell: null,\r\n renderToolbar: null,\r\n onFailedToLoadData: () => null,\r\n dataLoaded: () => null,\r\n displayFolderPath: false,\r\n reloadingFolders: false,\r\n\r\n multiSelectionEnabled: false,\r\n onSelectionChange: undefined,\r\n // onFolderNavigationChange: _.noop,\r\n sectionSelectedItems: undefined,\r\n\r\n assetsToLoadForSubfolders: 1,\r\n\r\n // searchLocationFilterState: undefined,\r\n // setSearchLocationFilterState: undefined,\r\n\r\n // realUsedFlagSuffix: '',\r\n isAssetLibraryAIGCMVPEnabled: false,\r\n isAdsStudioAIGCMVPEnabled: false,\r\n // isClickableOutsideFocusTrap: false,\r\n\r\n preDefinedAssetSources: [],\r\n // disabledAssetSources: [],\r\n onCreateFolderClick: undefined,\r\n navigation: {},\r\n gridScrollContainer: '[role=\"main\"]',\r\n isAIGCRegionRestricted: false,\r\n permissions: { dynamic: {} },\r\n};\r\n\r\nexport const AdsStudioLibraryPageContent = AdsStudioLibraryPageContentInternal;\r\n","import React, { useMemo } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n DialogBody,\r\n DialogSurface,\r\n Button,\r\n makeStyles,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\nimport { Dismiss20Regular } from '@fluentui/react-icons';\r\n\r\nconst useStyles = makeStyles({\r\n dialog: {\r\n '&.fui-DialogSurface': {\r\n width: '450px',\r\n },\r\n },\r\n title: {\r\n wordBreak: 'break-word',\r\n },\r\n});\r\n\r\nexport const ConfirmDialog = (props) => {\r\n const {\r\n isDisplayed,\r\n title,\r\n errorText,\r\n confirmString,\r\n cancelString,\r\n onClickConfirm,\r\n onClickCancel,\r\n isUiBlocked,\r\n warningMsg,\r\n } = props;\r\n\r\n const classes = useStyles();\r\n\r\n const DismissIcon = useMemo(() => <Dismiss20Regular onClick={onClickCancel} />, [onClickCancel]);\r\n\r\n return (\r\n <Dialog\r\n open={isDisplayed}\r\n >\r\n <DialogSurface id=\"asset-delete-confirmation-dialog\" className={mergeClasses('confirmation-dialog', classes.dialog)}>\r\n <DialogBody>\r\n <DialogTitle className={classes.title} action={DismissIcon}>\r\n {title}\r\n </DialogTitle>\r\n <DialogContent>\r\n {\r\n warningMsg &&\r\n <div className=\"image-delete-warning warning-msg\" style={{ color: 'rgb(168,0,0)' }}>\r\n {warningMsg}\r\n </div>\r\n }\r\n {\r\n errorText &&\r\n <div className=\"image-delete-error delete-error\" style={{ color: 'rgb(168,0,0)' }}>\r\n {errorText}\r\n </div>\r\n }\r\n </DialogContent>\r\n <DialogActions position=\"start\">\r\n <Button\r\n disabled={errorText.length > 0 || isUiBlocked}\r\n className=\"dialog-confirm-button\"\r\n onClick={onClickConfirm}\r\n appearance=\"primary\"\r\n >\r\n {confirmString}\r\n </Button>\r\n <Button\r\n disabled={isUiBlocked}\r\n className=\"dialog-cancel-button\"\r\n onClick={onClickCancel}\r\n appearance=\"secondary\"\r\n >\r\n {cancelString}\r\n </Button>\r\n </DialogActions>\r\n </DialogBody>\r\n </DialogSurface>\r\n </Dialog>\r\n );\r\n};\r\n\r\nConfirmDialog.propTypes = {\r\n isDisplayed: PropTypes.bool.isRequired,\r\n isUiBlocked: PropTypes.bool,\r\n title: PropTypes.string.isRequired,\r\n errorText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\r\n warningMsg: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\r\n confirmString: PropTypes.string.isRequired,\r\n cancelString: PropTypes.string.isRequired,\r\n onClickConfirm: PropTypes.func.isRequired,\r\n onClickCancel: PropTypes.func.isRequired,\r\n customStyle: PropTypes.shape({}),\r\n};\r\n\r\nConfirmDialog.defaultProps = {\r\n errorText: '',\r\n warningMsg: '',\r\n isUiBlocked: false,\r\n customStyle: null,\r\n};\r\n","import React from 'react';\r\n\r\nexport const GenerateImageContext = React.createContext({});\r\n\r\n","import React, { useState } from 'react';\r\nimport { GenerateImageContext } from './generate-image-context';\r\n\r\nexport const GenerateImageContextProvider = (props) => {\r\n const [generateImageExample, setGenerateImageExample] = useState({\r\n prompt: undefined,\r\n imageUrl: undefined,\r\n });\r\n\r\n return (\r\n <GenerateImageContext.Provider\r\n value={{\r\n generateImageExample,\r\n setGenerateImageExample,\r\n }}\r\n >\r\n {props.children}\r\n </GenerateImageContext.Provider>\r\n );\r\n};\r\n\r\nexport const withGenerateImageContext = Component => props => (\r\n <GenerateImageContextProvider>\r\n <Component {...props} />\r\n </GenerateImageContextProvider>\r\n);\r\n","import React from 'react';\r\nimport {\r\n makeResetStyles,\r\n shorthands,\r\n mergeClasses,\r\n} from '@fluentui/react-components';\r\n\r\nconst useLoadingViewStyles = makeResetStyles({\r\n width: '100%',\r\n ...shorthands.borderRadius('2px'),\r\n height: '4px',\r\n background: 'linear-gradient(to right, rgba(0, 120, 212, 0) 0%, #213AD5 50%, rgba(0, 120, 212, 0) 100%)',\r\n backgroundSize: '33%',\r\n backgroundRepeat: 'no-repeat',\r\n animation: 'loading_indicator 3s linear infinite',\r\n animationIterationCount: 'infinite',\r\n animationTimingFunction: 'linear',\r\n animationDuration: '3s',\r\n animationName: [{\r\n from: { backgroundPosition: '-50%' },\r\n to: { backgroundPosition: '150%' },\r\n }],\r\n backgroundColor: '#E6E6E6',\r\n forcedColorAdjust: 'none',\r\n});\r\n\r\nexport const LoadingIndicator = () => {\r\n const loadingViewStyles = useLoadingViewStyles();\r\n return (\r\n <div className={mergeClasses('loading-indicator', loadingViewStyles)} />\r\n );\r\n};\r\n","import ExampleBackground1 from './media/background1.jpg';\r\nimport ExampleBackground2 from './media/background2.jpg';\r\nimport ExampleBackground3 from './media/background3.jpg';\r\nimport ExampleBackground4 from './media/background4.jpg';\r\n\r\nexport const ExamplePromptList = [\r\n {\r\n backgroundImageUrl: ExampleBackground1,\r\n promptText: _TL_('<A bottle of perfume> behind subtle floral patterns, having a fresh and vibrant summer garden atmosphere. Surrounded by soft greenery and natural sunlight.'),\r\n },\r\n {\r\n backgroundImageUrl: ExampleBackground2,\r\n promptText: _TL_('<A bottle of white hand soap> on a sleek marble surface, having a clean and refreshing atmosphere. Surrounded by eucalyptus leaves and soft natural light filtering through a window.'),\r\n },\r\n {\r\n backgroundImageUrl: ExampleBackground3,\r\n promptText: _TL_('<A white vase> is placed under a Christmas tree, with lots of gift boxes besides it, having Christmas atmosphere.'),\r\n },\r\n {\r\n backgroundImageUrl: ExampleBackground4,\r\n promptText: _TL_('<A gift box> on a stone platform, having a serene and coastal atmosphere. Surrounded by beach reflections.'),\r\n },\r\n];\r\n","import _ from 'underscore';\r\nimport classNames from 'classnames';\r\nimport React, { useMemo, useState, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { HiddenDivForAnnounce } from '../hidden-div-for-announce';\r\nimport { ExamplePromptList } from './example-prompt';\r\n\r\nexport const ExampleImageListWithoutStyle = ({\r\n onSelectImage,\r\n classes,\r\n MultiLineEllipsisText,\r\n ExampleImageCell,\r\n i18n,\r\n labelId,\r\n}) => {\r\n const [announcedText, setAnnouncedText] = useState('');\r\n const promptList = useMemo(() => ExamplePromptList.map(x => ({\r\n ...x,\r\n promptText: i18n.getString(x.promptText),\r\n })), [i18n]);\r\n\r\n const wrappedOnSelectImage = useCallback((promptText, index) => {\r\n onSelectImage(promptText, index);\r\n setAnnouncedText(i18n.getString(_TL_('Set the prompt to {{promptText}}'), { promptText }));\r\n }, [onSelectImage, i18n]);\r\n\r\n return (\r\n <div className={classNames('example-image-list', classes.exampleImageList)} aria-labelledby={labelId} role=\"group\">\r\n {_.map(promptList, (template, index) => (\r\n <ExampleImageCell\r\n key={`cell-${index}`}\r\n backgroundImageUrl={template.backgroundImageUrl}\r\n promptText={template.promptText}\r\n index={index}\r\n onSelectImage={wrappedOnSelectImage}\r\n MultiLineEllipsisText={MultiLineEllipsisText}\r\n />\r\n ))}\r\n <HiddenDivForAnnounce toAnnounce={announcedText} />\r\n </div>);\r\n};\r\n\r\nExampleImageListWithoutStyle.propTypes = {\r\n onSelectImage: PropTypes.func.isRequired,\r\n classes: PropTypes.shape({\r\n exampleImageList: PropTypes.string,\r\n }),\r\n labelId: PropTypes.string,\r\n};\r\n\r\nExampleImageListWithoutStyle.defaultProps = {\r\n classes: {},\r\n labelId: '',\r\n};\r\n\r\n","import classNames from 'classnames';\r\nimport React, { useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const ExampleImageCellWithoutStyle = ({\r\n backgroundImageUrl,\r\n promptText,\r\n onSelectImage,\r\n index,\r\n classes,\r\n MultiLineEllipsisText,\r\n}) => {\r\n // when press Enter key, trigger the click event\r\n const onKeyDown = useCallback((event) => {\r\n if (event.key === 'Enter') {\r\n onSelectImage(promptText, index);\r\n }\r\n }, [index, onSelectImage, promptText]);\r\n\r\n const onClick = useCallback(() => {\r\n onSelectImage(promptText, index);\r\n }, [index, onSelectImage, promptText]);\r\n\r\n return (\r\n <div\r\n className={classNames('example-image-list-cell', classes.exampleImageCell)}\r\n onClick={onClick}\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={promptText}\r\n onKeyDown={onKeyDown}\r\n >\r\n <img src={backgroundImageUrl} alt={`Example ${index}`} />\r\n <div className=\"example-image-list-cell-overlay\">\r\n <div className=\"overlay-gradient\" />\r\n <div className=\"overlay-solid\" />\r\n <MultiLineEllipsisText\r\n className=\"example-prompt-template\"\r\n text={promptText}\r\n />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nExampleImageCellWithoutStyle.propTypes = {\r\n backgroundImageUrl: PropTypes.string.isRequired,\r\n promptText: PropTypes.string.isRequired,\r\n onSelectImage: PropTypes.func.isRequired,\r\n index: PropTypes.number.isRequired,\r\n classes: PropTypes.shape({\r\n exampleImageCell: PropTypes.string,\r\n }),\r\n};\r\n\r\nExampleImageCellWithoutStyle.defaultProps = {\r\n classes: {},\r\n};\r\n","import React from 'react';\r\nimport { Button, Textarea, mergeClasses, useId } from '@fluentui/react-components';\r\nimport {\r\n SendRegular,\r\n} from '@fluentui/react-icons';\r\n\r\nexport const MAX_PROMPT_LENGTH = 200;\r\n\r\nexport const PromptEditor = (props) => {\r\n const {\r\n i18n,\r\n prompt,\r\n setPrompt,\r\n disabledText,\r\n disabledButton,\r\n onKeyDownInTextArea,\r\n onClickGenerateButton,\r\n placeholder,\r\n } = props;\r\n\r\n const textAreaId = useId('prompt-editor-textarea');\r\n\r\n return (\r\n <>\r\n <div className={mergeClasses('prompt-title', 'prompt-editor-label')}>{i18n.getString(_TL_('What background do you want to create?'))}</div>\r\n <div className={mergeClasses('prompt-editor', 'prompt-editor-text-container')}>\r\n <Textarea\r\n value={prompt || ''}\r\n onChange={(e, data) => setPrompt(data.value)}\r\n onKeyDown={onKeyDownInTextArea}\r\n className=\"prompt-textarea\"\r\n aria-label={i18n.getString(_TL_('Prompt Editor'))}\r\n aria-describedby={textAreaId}\r\n placeholder={placeholder}\r\n disabled={disabledText}\r\n />\r\n <div id={textAreaId} style={{ display: 'none' }}>{i18n.getString(_TL_('{{prompt}}'), { prompt })}</div>\r\n <div className={mergeClasses('action-bar', 'prompt-editor-actions-container')}>\r\n <Button\r\n icon={<SendRegular />}\r\n appearance=\"transparent\"\r\n onClick={onClickGenerateButton}\r\n disabled={disabledButton}\r\n className={mergeClasses('generate-button', disabledButton ? 'disabled' : 'enabled')}\r\n aria-label={i18n.getString(_TL_('Expand background'))}\r\n />\r\n </div>\r\n </div>\r\n </>\r\n );\r\n};\r\n","import React, { useRef, useEffect, useCallback, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nexport const ObjectSelectionImageView = ({\r\n i18n,\r\n originalImageUrl,\r\n originalImageHeight,\r\n originalImageWidth,\r\n getMaskValueAtPoint,\r\n updateHighlightedImage,\r\n isFetchingSegmentations,\r\n toggleSelectedMask,\r\n borderImageSrc,\r\n workingSelectedImageSrc,\r\n highlightedImageSrc,\r\n maskValues,\r\n logger,\r\n}) => {\r\n // get image from offscreen canvas\r\n // draw the canvas in the front\r\n const imageContainer = useRef(null);\r\n const [maskIndex, setMaskIndex] = useState(undefined);\r\n\r\n const windowToImgPosition = useCallback((x, y) => {\r\n if (imageContainer.current) {\r\n const imageBox = imageContainer.current.getBoundingClientRect();\r\n const targetWidth = imageBox.width;\r\n const targetHeight = imageBox.height;\r\n // calculate the ratio of the original image and the target image for object-fit: contain\r\n const wr = targetWidth / originalImageWidth;\r\n const hr = targetHeight / originalImageHeight;\r\n const ratio = Math.min(wr, hr);\r\n const width = originalImageWidth * ratio;\r\n const height = originalImageHeight * ratio;\r\n const leftToImage = (targetWidth - width) / 2.0;\r\n const topToImage = (targetHeight - height) / 2.0;\r\n const { top, left } = imageBox;\r\n return {\r\n x: ((x - left) - leftToImage) * (originalImageWidth / width),\r\n y: ((y - top) - topToImage) * (originalImageHeight / height),\r\n };\r\n }\r\n return { x: -1, y: -1 };\r\n }, [originalImageHeight, originalImageWidth]);\r\n\r\n const mousemoveHandler = useCallback((e) => {\r\n const { x, y } = windowToImgPosition(e.clientX, e.clientY);\r\n const maskValue = getMaskValueAtPoint(x, y, originalImageWidth);\r\n updateHighlightedImage(maskValue);\r\n }, [getMaskValueAtPoint, originalImageWidth, updateHighlightedImage, windowToImgPosition]);\r\n\r\n const mouseleaveHandler = useCallback(() => {\r\n updateHighlightedImage(undefined);\r\n }, [updateHighlightedImage]);\r\n\r\n const mousedownHandler = useCallback((e) => {\r\n const { x, y } = windowToImgPosition(e.clientX, e.clientY);\r\n const maskValue = getMaskValueAtPoint(x, y, originalImageWidth);\r\n if (maskValue > 0) {\r\n toggleSelectedMask(maskValue);\r\n logger.logTrace('Copilot change image background - object selection view - object selection');\r\n }\r\n }, [getMaskValueAtPoint, logger, originalImageWidth, toggleSelectedMask, windowToImgPosition]);\r\n\r\n const keyHandler = useCallback((e) => {\r\n if (maskValues && maskValues.length > 0) {\r\n if (e.key === 'Tab') {\r\n if (e.shiftKey === true) {\r\n if (maskIndex === undefined) {\r\n setMaskIndex(maskValues.length - 1);\r\n updateHighlightedImage(maskValues[maskValues.length - 1]);\r\n e.preventDefault();\r\n } else if (maskIndex - 1 >= 0) {\r\n setMaskIndex((maskIndex - 1));\r\n updateHighlightedImage(maskValues[(maskIndex - 1)]);\r\n e.preventDefault();\r\n }\r\n } else if (e.shiftKey === false) {\r\n if (maskIndex === undefined) {\r\n setMaskIndex(0);\r\n updateHighlightedImage(maskValues[0]);\r\n e.preventDefault();\r\n } else if ((maskIndex + 1) < maskValues.length - 1) {\r\n setMaskIndex((maskIndex + 1));\r\n updateHighlightedImage(maskValues[(maskIndex + 1)]);\r\n e.preventDefault();\r\n }\r\n }\r\n } else if (e.key === 'Enter' && maskIndex !== undefined) {\r\n toggleSelectedMask(maskValues[maskIndex]);\r\n logger.logTrace('Copilot change image background - object selection view - object selection');\r\n e.preventDefault();\r\n }\r\n }\r\n }, [logger, maskIndex, maskValues, toggleSelectedMask, updateHighlightedImage]);\r\n\r\n const resetMaskHandler = useCallback(() => {\r\n setMaskIndex(undefined);\r\n updateHighlightedImage(undefined);\r\n }, [updateHighlightedImage]);\r\n\r\n useEffect(() => {\r\n const imageBox = imageContainer.current;\r\n if (imageBox) {\r\n imageBox.addEventListener('mousemove', mousemoveHandler);\r\n imageBox.addEventListener('mouseleave', mouseleaveHandler);\r\n imageBox.addEventListener('mousedown', mousedownHandler);\r\n imageBox.addEventListener('keydown', keyHandler);\r\n imageBox.addEventListener('blur', resetMaskHandler);\r\n imageBox.addEventListener('focus', resetMaskHandler);\r\n }\r\n return () => {\r\n if (imageBox) {\r\n imageBox.removeEventListener('mousemove', mousemoveHandler);\r\n imageBox.removeEventListener('mouseleave', mouseleaveHandler);\r\n imageBox.removeEventListener('mousedown', mousedownHandler);\r\n imageBox.removeEventListener('keydown', keyHandler);\r\n imageBox.removeEventListener('blur', resetMaskHandler);\r\n imageBox.addEventListener('focus', resetMaskHandler);\r\n }\r\n };\r\n }, [windowToImgPosition, mousemoveHandler, mouseleaveHandler, mousedownHandler, keyHandler, resetMaskHandler]);\r\n\r\n return (\r\n <div\r\n className=\"image-wrapper\"\r\n ref={imageContainer}\r\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\r\n tabIndex={0}\r\n aria-label={i18n.getString(_TL_('Object Selection Control'))}\r\n >\r\n {originalImageUrl && (\r\n <>\r\n <img className=\"original-image\" src={originalImageUrl} alt={i18n.getString(_TL_('Original image layer'))} />\r\n <div className=\"cover-original-image\" />\r\n {isFetchingSegmentations && (<div className=\"loading-segmentations-image\" />)}\r\n {!isFetchingSegmentations && (\r\n <>\r\n {(borderImageSrc && <img className=\"border-image\" src={borderImageSrc} alt={i18n.getString(_TL_('Border image layer'))} />)}\r\n {(workingSelectedImageSrc && <img className=\"selected-image\" src={workingSelectedImageSrc} alt={i18n.getString(_TL_('Selected image layer'))} />)}\r\n {(highlightedImageSrc && <img className=\"highlighted-image\" src={highlightedImageSrc} alt={i18n.getString(_TL_('Highlighted image layer'))} />)}\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n\r\nObjectSelectionImageView.propTypes = {\r\n i18n: PropTypes.shape({\r\n getString: PropTypes.func.isRequired,\r\n }).isRequired,\r\n originalImageUrl: PropTypes.string.isRequired,\r\n originalImageHeight: PropTypes.number.isRequired,\r\n originalImageWidth: PropTypes.number.isRequired,\r\n getMaskValueAtPoint: PropTypes.func.isRequired,\r\n logger: PropTypes.shape({\r\n logTrace: PropTypes.func,\r\n }).isRequired,\r\n maskValues: PropTypes.arrayOf(PropTypes.number),\r\n isFetchingSegmentations: PropTypes.bool.isRequired,\r\n};\r\n\r\nObjectSelectionImageView.defaultProps = {\r\n maskValues: [],\r\n};\r\n","import { useCallback } from 'react';\r\n\r\nexport const useUploadAsset = ({ dataService, perfMarker, isUploadImageUpscaleEnabled }) => {\r\n let videoUploadPerfMarker;\r\n\r\n const uploadFileAsync = useCallback(({\r\n dataURL,\r\n fileObject,\r\n nameWithoutExt,\r\n updateCurrentProgress,\r\n isVideo,\r\n folderId,\r\n uploadCallback,\r\n }) => {\r\n if (perfMarker) {\r\n videoUploadPerfMarker = perfMarker.createChild('videoUpload');\r\n videoUploadPerfMarker.willInit();\r\n }\r\n\r\n const commonOptions = {\r\n updateCurrentProgress,\r\n name: nameWithoutExt,\r\n folderId,\r\n };\r\n\r\n if (isVideo) {\r\n return dataService.uploadVideo({\r\n ...commonOptions,\r\n fileObject,\r\n perfMarker: videoUploadPerfMarker,\r\n }).then((res) => {\r\n if (uploadCallback) {\r\n uploadCallback(res);\r\n }\r\n });\r\n }\r\n\r\n return dataService.uploadImage({\r\n ...commonOptions,\r\n imageData: dataURL,\r\n supportUpscale: isUploadImageUpscaleEnabled ? true : undefined,\r\n }).then((res) => {\r\n if (uploadCallback) {\r\n uploadCallback(res);\r\n }\r\n });\r\n }, [dataService, isUploadImageUpscaleEnabled, videoUploadPerfMarker]);\r\n\r\n return {\r\n uploadFileAsync,\r\n };\r\n};\r\n","import { useCallback, useRef } from 'react';\r\nimport {\r\n validateImageAsync as validateImageAsyncInternal,\r\n validateVideoAsync,\r\n readFileAsDataURLAsync,\r\n} from '@bingads-webui-campaign-react/upload-file-picker';\r\nimport { getImageDetailAsync } from '@bingads-webui-campaign/image-experience-utils';\r\nimport { MIN_SIZE, UPSCALE_MIN_SIZE } from '../model';\r\n\r\nconst READ_VIDEO_MAX_TIME = 10000; // 10s\r\n\r\nexport const useReadAsset = () => {\r\n const readFileAsync = useCallback((fileObject, { isVideo } = {}) => {\r\n if (isVideo) {\r\n // for video, data URl is optional to MT request, so here swallow the error to unblock next.\r\n return readFileAsDataURLAsync(fileObject).timeout(READ_VIDEO_MAX_TIME).catch(() => {});\r\n }\r\n\r\n return readFileAsDataURLAsync(fileObject);\r\n }, []);\r\n\r\n return {\r\n readFileAsync,\r\n };\r\n};\r\n\r\nexport const useValidateAsset = () => {\r\n const isImageUpscaledRef = useRef(false);\r\n\r\n const validateImageAsync = useCallback(\r\n ({ dataURL, isUploadImageUpscaleEnabled }) => validateImageAsyncInternal({\r\n imageSource: dataURL,\r\n minimumHeight: isUploadImageUpscaleEnabled ? UPSCALE_MIN_SIZE[1] : MIN_SIZE[1],\r\n minimumWidth: isUploadImageUpscaleEnabled ? UPSCALE_MIN_SIZE[0] : MIN_SIZE[0],\r\n })\r\n .then(() => getImageDetailAsync(dataURL))\r\n .then((img) => {\r\n if (isUploadImageUpscaleEnabled && img &&\r\n ((img.naturalWidth >= UPSCALE_MIN_SIZE[0] && img.naturalWidth < MIN_SIZE[0]) ||\r\n (img.naturalHeight >= UPSCALE_MIN_SIZE[1] && img.naturalHeight < MIN_SIZE[1]))\r\n ) {\r\n isImageUpscaledRef.current = true;\r\n } else {\r\n isImageUpscaledRef.current = false;\r\n }\r\n return {\r\n isImageUpscaled: isImageUpscaledRef.current,\r\n };\r\n })\r\n , []\r\n );\r\n\r\n const validateFileAsync = useCallback(({ dataURL, isVideo, isUploadImageUpscaleEnabled }) => {\r\n if (isVideo) {\r\n return validateVideoAsync();\r\n }\r\n\r\n return validateImageAsync({ dataURL, isUploadImageUpscaleEnabled });\r\n }, [validateImageAsync]);\r\n\r\n return {\r\n validateImageAsync,\r\n validateFileAsync,\r\n };\r\n};\r\n","import { useCallback } from 'react';\r\nimport _ from 'underscore';\r\nimport {\r\n supportedVideoExtensions,\r\n} from '../model/constants';\r\n\r\nconst checkExtension = (supportedList, ext) => {\r\n if (ext && !_.isEmpty(supportedList)) {\r\n const extToCheck = ext.toLowerCase();\r\n\r\n return _.chain(supportedList)\r\n .map(item => item.toLowerCase())\r\n .contains(extToCheck)\r\n .value();\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const useCustomizedHandlerOptions = () => {\r\n const getCustomizedHandlerOptions = useCallback(({ ext } = {}) => ({\r\n isVideo: checkExtension(supportedVideoExtensions, ext),\r\n }), []);\r\n\r\n return {\r\n getCustomizedHandlerOptions,\r\n };\r\n};\r\n","import React, { useCallback, useState } from 'react';\r\nimport classNames from 'classnames';\r\nimport { map, each, get, contains, filter } from 'underscore';\r\nimport Promise from 'bluebird';\r\nimport { makeStyles, shorthands, } from '@fluentui/react-components';\r\nimport { stringifySync } from '@bingads-webui/safe-json';\r\nimport { parseFileName, generatePreviewArray, updateFilePreviewArrayUploadProgress, updateProgress, MaximumImageFileSizeMB, MaximumVideoFileSizeMB, } from '@bingads-webui-campaign-react/upload-file-picker';\r\nimport { runJobsInParallelWithRateLimit } from '@bingads-webui-universal/parallel-job-with-rate-limit';\r\nimport {\r\n getImageValidationErrorMessage,\r\n} from '@bingads-webui-campaign/image-experience-utils';\r\nimport { MaxAddAssetJobInParell, supportedImageExtensions, supportedVideoExtensions } from '../model';\r\nimport { getAssetUploadError } from '../utils';\r\nimport { useUploadAsset } from './use-upload-asset';\r\nimport { useReadAsset, useValidateAsset } from './use-validate-asset';\r\nimport { useCustomizedHandlerOptions } from './use-customized-handler-options';\r\n\r\nconst MAX_UPSCALED_SIZE = 4;\r\n\r\nconst useStyles = makeStyles({\r\n linkButton: {\r\n color: '#337ab7',\r\n fontWeight: 'normal',\r\n backgroundColor: 'transparent',\r\n ...shorthands.borderRadius('0px', '0px', '0px', '0px'),\r\n ...shorthands.border('none'),\r\n },\r\n});\r\n\r\nexport const useUploadFiles = ({\r\n logger, dataService, perfMarker, notificationApi, i18n, onFilesAddedCallback, aid, setErrors, filePickerI18n, uploadCallback, isUploadImageUpscaleEnabled,\r\n}) => {\r\n const [previewArr, setPreviewArr] = useState([]);\r\n const { readFileAsync } = useReadAsset();\r\n const { validateFileAsync } = useValidateAsset();\r\n const { uploadFileAsync } = useUploadAsset({ dataService, perfMarker, isUploadImageUpscaleEnabled });\r\n const { getCustomizedHandlerOptions } = useCustomizedHandlerOptions();\r\n const classes = useStyles();\r\n\r\n const onFileRead = useCallback((selectedFiles, callback) => {\r\n setErrors([]);\r\n\r\n const isMultipleFiles = selectedFiles.length > 1;\r\n const customizedOptions = map(selectedFiles, (file) => {\r\n const { nameWithoutExt, ext } = parseFileName(file.name);\r\n\r\n const passedOptions = getCustomizedHandlerOptions({\r\n nameWithoutExt,\r\n ext,\r\n });\r\n\r\n return {\r\n ...passedOptions,\r\n nameWithoutExt,\r\n };\r\n });\r\n\r\n // there is a perf concern for large video file\r\n // previous design is reading files first and then process\r\n // for video, may need different handling, will address it later\r\n return Promise.map(\r\n selectedFiles,\r\n (fileObj, index) => readFileAsync(fileObj, customizedOptions[index])\r\n ).then((fileSources) => {\r\n const fileAdditionalInfoArr = [];\r\n const validateFilePromise = Promise.map(\r\n fileSources,\r\n (fileSource, index) =>\r\n validateFileAsync({\r\n isUploadImageUpscaleEnabled,\r\n dataURL: fileSource,\r\n ...customizedOptions[index],\r\n }).then((validatedResult) => {\r\n const isImageUpscaled = get(validatedResult, 'isImageUpscaled', false);\r\n const { nameWithoutExt } = customizedOptions[index];\r\n fileAdditionalInfoArr[index] = {\r\n isImageUpscaled,\r\n text: nameWithoutExt,\r\n };\r\n }).catch((e) => {\r\n if (e && e.message === 'SizeValidationError' && logger && logger.logTrace) {\r\n logger.logTrace(`Add Media Panel per file - SizeValidationError: ${stringifySync(e)}`);\r\n logger.logTrace(`Add Media Panel per file - SizeValidationError - ImageSource: ${stringifySync(fileSource)}`);\r\n }\r\n throw e;\r\n })\r\n );\r\n\r\n const doubleValidateFilePromise = validateFilePromise\r\n .then(() => {\r\n const needUpscaledImage = filter(fileAdditionalInfoArr, item => item && item.isImageUpscaled);\r\n if (needUpscaledImage.length > MAX_UPSCALED_SIZE) {\r\n // When the need upscaled image count over the max size, should skip the upscale feature and use original threshold to validate again.\r\n return Promise.map(fileSources, (fileSource, index) => {\r\n if (fileAdditionalInfoArr[index].isImageUpscaled === true) {\r\n return validateFileAsync({\r\n isUploadImageUpscaleEnabled: false,\r\n dataURL: fileSource,\r\n ...customizedOptions[index],\r\n }).catch((e) => {\r\n if (e && e.message === 'SizeValidationError' && logger && logger.logTrace) {\r\n logger.logTrace(`Add Media Panel per file - SizeValidationError: ${stringifySync(e)}`);\r\n logger.logTrace(`Add Media Panel per file - SizeValidationError - ImageSource: ${stringifySync(fileSource)}`);\r\n }\r\n throw e;\r\n });\r\n }\r\n return Promise.resolve();\r\n });\r\n }\r\n return Promise.resolve();\r\n });\r\n\r\n return doubleValidateFilePromise.then(() => {\r\n const sourcesForPreview = generatePreviewArray({\r\n files: selectedFiles,\r\n fileSources,\r\n customizedOptions,\r\n });\r\n\r\n setPreviewArr(sourcesForPreview);\r\n\r\n const setProgress = (index, progress) => {\r\n setPreviewArr((prevArr) => {\r\n const newState =\r\n updateFilePreviewArrayUploadProgress(index, progress)({ previewArr: prevArr });\r\n\r\n return newState.previewArr;\r\n });\r\n };\r\n\r\n const uploadBatchs = [];\r\n\r\n each(fileSources, (fileSource, index) => {\r\n const { nameWithoutExt } = customizedOptions[index];\r\n\r\n uploadBatchs.push(() => uploadFileAsync({\r\n dataURL: fileSource,\r\n fileObject: selectedFiles[index],\r\n updateCurrentProgress: updateProgress({\r\n setProgress,\r\n index,\r\n uploadProgressBoundary: 1,\r\n }),\r\n uploadCallback,\r\n nameWithoutExt,\r\n ...customizedOptions[index],\r\n }));\r\n });\r\n\r\n const uploadErrorCodeArr = [];\r\n const handleJobError = (err) => {\r\n const errorCode = get(err, ['body', 'value', 0, 'Code'], '');\r\n\r\n // when errorCode is empty, it means some server error, e.g. 500 response\r\n uploadErrorCodeArr.push(errorCode);\r\n };\r\n return runJobsInParallelWithRateLimit({\r\n jobsToRateLimit: uploadBatchs,\r\n maxJobsInParallel: MaxAddAssetJobInParell,\r\n handleJobError,\r\n })\r\n .then((uploadResult) => {\r\n const errorMsg = getAssetUploadError({\r\n uploadErrorCodeArr,\r\n filePickerI18n,\r\n aid,\r\n logger,\r\n i18n,\r\n });\r\n\r\n if (errorMsg) {\r\n onFilesAddedCallback();\r\n setPreviewArr([]);\r\n notificationApi.showWarning(errorMsg);\r\n logger.logTrace(`Add Media Panel: failed to upload assets to folder, error: ${errorMsg}`);\r\n } else {\r\n const assetIds = uploadResult && uploadResult.join(',');\r\n logger.logTrace('Add Media Panel: saved uploaded assets to folder', { assetIds });\r\n\r\n const upscaledImagesArr = filter(fileAdditionalInfoArr, item => item && item.isImageUpscaled);\r\n const upscaledImagesArrCount = upscaledImagesArr.length;\r\n\r\n if (upscaledImagesArrCount > 0) {\r\n notificationApi.showInfo(i18n.getString(_TL_('Your assets were uploaded and we upscaled {{fileCount}} image(s) to meet the minimum required file size. You can always upload higher quality images if needed.'), { fileCount: upscaledImagesArrCount }));\r\n } else {\r\n notificationApi.showInfo((\r\n <span>\r\n {i18n.getString(_TL_('Your assets were successfully uploaded.'))}\r\n <button className={classNames(`HelpTopic ${classes.linkButton}`)} query=\"help:app54863\">{i18n.getString(_TL_('Learn more about asset guidelines.'))}</button>\r\n </span>\r\n ));\r\n }\r\n onFilesAddedCallback();\r\n setPreviewArr([]);\r\n }\r\n });\r\n });\r\n }).catch((e) => {\r\n const genericErrorMsg = i18n.getString(_TL_('We\\'ve encountered an error and can\\'t continue.'));\r\n const newErrors = [\r\n getImageValidationErrorMessage(e, filePickerI18n, isMultipleFiles, isUploadImageUpscaleEnabled /* skipDimension */) || genericErrorMsg,\r\n ];\r\n setPreviewArr([]);\r\n setErrors(newErrors);\r\n\r\n logger.logTrace(`Add Media Panel: failed to upload assets to folder, error: ${newErrors[0]}`);\r\n if (e && e.message === 'SizeValidationError' && logger && logger.logTrace) {\r\n logger.logTrace(`Add Media Panel - SizeValidationError: ${stringifySync(e)}`);\r\n }\r\n }).finally(() => {\r\n callback();\r\n });\r\n }, [setErrors, getCustomizedHandlerOptions, readFileAsync, validateFileAsync, logger, uploadFileAsync, uploadCallback, filePickerI18n, aid, onFilesAddedCallback, notificationApi, i18n, classes.linkButton, isUploadImageUpscaleEnabled]);\r\n\r\n return {\r\n onFileRead,\r\n previewArr,\r\n };\r\n};\r\n\r\nexport const isReachFileSizeLimit = ({ ext, fileSizeMB }) => {\r\n let limitMB;\r\n\r\n if (contains(supportedImageExtensions, ext)) {\r\n limitMB = MaximumImageFileSizeMB;\r\n } else if (contains(supportedVideoExtensions, ext)) {\r\n limitMB = MaximumVideoFileSizeMB;\r\n }\r\n\r\n return limitMB > 0 && fileSizeMB > limitMB;\r\n};\r\n\r\nexport const getReachFileSizeLimitErrorMessage = ({ i18n }) =>\r\n i18n.getString(\r\n _TL_('One or more assets exceed the maximum file size. Please upload images that are smaller than {{maximumImageFileSize}} MB and videos that are smaller than {{maximumVideoFileSize}} MB.'),\r\n {\r\n maximumImageFileSize: MaximumImageFileSizeMB,\r\n maximumVideoFileSize: MaximumVideoFileSizeMB,\r\n }\r\n );\r\n","import _ from 'underscore';\r\nimport { GetJsDataInfo } from '@bingads-webui-clientcenter/js-data-cc-rest-base';\r\n\r\nconst ccJSData = {\r\n jsDataCcRest: null,\r\n};\r\n\r\nexport const initCcJsData = ({ serverContext }) => {\r\n if (!ccJSData.jsDataCcRest) {\r\n const options = {\r\n cidFetcher: () => serverContext.CurrentCustomer.Id,\r\n uidFetcher: () => serverContext.CurrentUser.Id,\r\n appendErrorSummary: _.noop,\r\n handleAjaxAuthFailure: _.noop,\r\n willSupportCors: true,\r\n };\r\n\r\n ccJSData.jsDataCcRest = GetJsDataInfo(options, serverContext.ServicesEndpoints.ClientCenterUIAPI, []).jsDataCcRest;\r\n }\r\n\r\n return ccJSData;\r\n};\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { CcJsDataContextProvider } from '@bingads-webui-cc-react/js-data-rest';\r\nimport { withServerContext } from '@bingads-webui-campaign-react/server-context';\r\nimport { initCcJsData } from './init-cc-js-data';\r\n\r\nexport const withCcJsDataContextProvider = (WrappedComponent) => {\r\n const HOC = (props) => {\r\n const { serverContext } = props;\r\n const { jsDataCcRest } = initCcJsData({ serverContext });\r\n\r\n return (\r\n <CcJsDataContextProvider initialJsData={jsDataCcRest}>\r\n <WrappedComponent {...props} />\r\n </CcJsDataContextProvider>\r\n );\r\n };\r\n\r\n HOC.propTypes = {\r\n serverContext: PropTypes.shape({\r\n CurrentUser: PropTypes.shape({ Id: PropTypes.number }).isRequired,\r\n CurrentCustomer: PropTypes.shape({ Id: PropTypes.number }).isRequired,\r\n ServicesEndpoints: PropTypes.shape({\r\n ClientCenterUIAPI: PropTypes.string.isRequired,\r\n }),\r\n }).isRequired,\r\n };\r\n\r\n return withServerContext(HOC);\r\n};\r\n"],"names":["videoIcon","SparkeSVGIcon","_jsxs","xmlns","width","height","viewBox","fill","children","_jsx","d","id","x1","y1","x2","y2","gradientUnits","stopColor","offset","HollowSparkleSVGIcon","BlackSparkleSVGIcon","InfoSparkleSVGIcon","SquareDismissIcon","_ref","i18n","src","squareDismissImage","alt","getString","_TL_","SpinnerIcon","spinnerBase","className","EntryCardSVGIcons","CreateSVGIcon","UploadSVGIcon","StockSVGIcon","InvestSVGIcon","PdfSVGIcon","WebsiteSVGIcon","WarningSVGIcon","CreateManualBrandKitSVGIcon","BrandKitLogoIconSVG","AIWarningIcon","AIWarningIconSource","ChooseImageIcon","ChooseImageSVG","EmptyViewIcons","ImageEmptyViewSVG","LibraryEmptyViewSVG","VideoEmptyViewSVG","CSMLAdType","MMA","Audience","ImageExtension","PMax","CSMLSortIcon","SortUp","SortDown","CSMLSortBy","ImageName","ImageNameDesc","MostRecent","MostRecentAsc","LastCreated","LastCreatedAsc","TopRated","AssetIdAsc","AssetIdDesc","ClickAsc","ClickDesc","ClickPeriodAsc","ClickPeriodDesc","ClickChangeAsc","ClickChangeDesc","ClickChangePercentAsc","ClickChangePercentDesc","CTRAsc","CTRDesc","CTRPeriodAsc","CTRPeriodDesc","CTRChangeAsc","CTRChangeDesc","CTRChangePercentAsc","CTRChangePercentDesc","ImpressionAsc","ImpressionDesc","ImpressionPeriodAsc","ImpressionPeriodDesc","ImpressionChangeAsc","ImpressionChangeDesc","ImpressionChangePercentAsc","ImpressionChangePercentDesc","SpendAsc","SpendDesc","SpendPeriodAsc","SpendPeriodDesc","SpendChangeAsc","SpendChangeDesc","SpendChangePercentAsc","SpendChangePercentDesc","CSMLVideoDuration","min","max","unlimited","CSMLTimeFrame","Anytime","Today","Last7Days","Last30Days","Custom","CSMLImportSource","Google","Facebook","CSMLAssetSource","UserUploaded","AIGenerated","Website","Shutterstock","BackgroundChangeGenerated","AIGeneratedByRecraft","ManualAddedImageSource","Library","ShutterStock","AIModelSource","Dalle","Recraft","DEFAULT_PAGE_SIZE","MIN_SIZE","UPSCALE_MIN_SIZE","ClarityTags","LaunchedAdsStudio","LaunchedAddImageAssetsFromAdsStudio","DisplayTemplateHomePage","EditDisplayTemplateImage","CreateDisplayTemplate","BrandKitPage","EditBrandKitImage","EditBrandKitLogo","CSMLAdTypeAbbr","_defineProperty","ROOT_FOLDER_ID","FolderAssetType","Image","Video","All","Folder","RootFolderName","isRootFolderId","folderIdToTest","supportedImageExtensions","GridSectionName","Asset","MaxAddAssetJobInParell","VideoStatus","Unverified","Draft","Active","Failed","AdsStudioPageName","LibraryPage","PerfPage","WebsiteImagePanelPage","StockImagePanelPage","AddVideoPanelPage","UploadFilesPanelPage","UploadFolderPanelPage","MixedImagePanelPage","MixedVideoPanelPage","EditImagePage","AssetDetailsPage","BackgroundRemovalModalPage","InvestImagePanelPage","InvestVideoPanelPage","AdditionalQueries","Query","FolderId","EditImageUrl","InitialCurrentView","TemplateId","TemplateGroupId","AdStudioSurveyTriggerFlag","App","RealUsedFlagSuffix","FilterType","SearchText","AssetType","ImageSize","VideoDuration","DateAdded","ImportSource","AssetSource","SearchTextFilter","type","title","AssetTypeFilter","DateAddedFilter","ImageSizeFilter","ImportSourceFilter","AssetSourceFilter","VideoDurationFilter","AllSupportedFilters","getAssetTypeOptions","key","text","MAX_DAYS","getTimeDescription","timestamp","_","now","Date","diffInSec","Math","round","seconds","diffInMin","minutes","diffInHour","hours","diffInDay","days","convertTimeDuration","DurationInMS","floor","timeArr","push","concat","join","getDateAddedChoiceOptions","timeZone","todayObj","getToday","today","CivilDate","year","month","day","last7day","plus","last30day","range","start","end","getImportSourceOptions","getSortingOptions","icon","getAssetSourceOptions","_CSMLSortingRequestPa","sortBy","sortDirection","imageAdExtSettings","C","getPlacementConfig","PT","LandscapeImage","isRequired","aspectRatioUIString","previewTypeString","WideImage","SquareImage","VerticalImage","MSAN","MSEdgeSingleCarousel","MSNInArticle","MSNSmallHeadline","AudienceSquareImage","AudienceWideImage","MMALandscapeImage","MMAVerticalImage","MMAWideImage","MMAV2MSEdgeCarousel","MMAV2MSNSingleCarousel","MMAV2MSNRestoday","MMAV2MSNPartnerStripe","MMAV2MSNRiver","MSEdgeMobile","MSANV2","MSEdgeCarousel","MSANBanner","MSANRiver","MSNCarousel","MSNPartnerStripe","MSNRestoday","MSANRectangle","ImageExt","BingDesktopSingleImage","MSEdgeMediumHeadline","MSNSingleCarousel","MSNMediumHeadline","BingDesktopMultiImage","BingMobileMultiImage","MSNDoubleCarousel","getAspectRatioConfig","adType","isMMAV2Enabled","isPMaxAspectRatiosV2Enabled","aspectRatios","getAspectRatios","isMultimediaAd","isMultimediaAdinMSANEnabled","isCombinedMsanAndMmaAspectRatios","allAspectRatioConfig","Image191x100","aspectRatio","aspectRatioAsRatio","aspectRatioString","Image4x1","Image1x1","Image1x2","Image178x100","extraExtension","BingSingleImage","Image172x100","Image169x100","Image150x100","Image155x100","Image133x100","MobileMultiImage","BingDesktopImage","Image93x100","Image201x100","Image200x100","Image153x100","Image124x100","Image120x100","aspectRatiosExceptOriginal","item","_objectSpread","minSize","placementType","getPreviewText","isImageExtension","shortHeadline","longHeadline","description","businessName","url","finalUrl","callToAction","sizeValidForRatio","cropSettings","SourceWidth","SourceHeight","getSizeErrorRatioList","requiredOnly","arguments","length","undefined","ratioList","config","getAllSizeErrorRatioList","errorListForMMA","errorListForAudience","errorListForExtension","errorListForPmax","Pmax","_toConsumableArray","getPlacementsToExpand","reject","p","map","_ref2","minHeight","value","AIPromptExamples","promptText","imageSrc","getUpdatedAssets","assets","_ref$updates","updates","imageCroppingTasks","videoUpdated","updatedAssets","asset","taskStatus","updating","isFinished","newUpdates","status","useClarityTags","customTags","_useState","useState","_useState2","_slicedToArray","haveSetClarityTags","setHaveSetClarityTags","useEffect","tagsToSet","reduce","tagsObj","currentTag","setClarityTag","ExternalEntityType","checkVideosIntermediateStatus","video","getSizeLimitPerAccount","aid","localStorage","getItem","valObj","JSON","parse","e","limitData","data","val","isValidXandrAccount","account","ExternalAccountIds","externalAccountId","Type","Id","getEntryCardData","_ref$cardKeys","cardKeys","_ref$onClickCreate","onClickCreate","_ref$onClickUpload","onClickUpload","_ref$onClickStock","onClickStock","_ref$onClickInvest","onClickInvest","_ref$onClickWebsite","onClickWebsite","_ref$isImagePage","isImagePage","_ref$isVideoPage","isVideoPage","_ref$isXandrIntegrati","isXandrIntegrationEnabled","uploadDescription","websiteDescription","websiteTitle","createDescription","createTitle","investDescription","cardData","image","onClick","filter","card","includes","getHomePageCardData","_ref2$cardKeys","_ref2$onClickUpload","_ref2$onClickStock","_ref2$onClickWebsite","_ref2$onClickInvest","_ref2$isXandrIntegrat","getImageAssetLimitPerAccount","logger","assetLimit","logError","getFoldersLimitPerAccount","foldersLimit","getVideoAssetLimitPerAccount","validate","test","getSearchQuery","_ref3","_ref3$search","search","_ref3$additionalQueri","additionalQueries","_ref3$removeQueries","removeQueries","query","queryString","AIGCHandler","isAdsStudioAIGCMVPEnabled","isAIGCRegionRestricted","notificationApi","enabledCallback","showWarning","getRealUsedFlagValue","preference","flagSuffix","realUsedFlagStr","realUsedFlagHandlerStr","realUsedFlag","realUsedFlagHandler","handleRealUsedFlag","_getRealUsedFlagValue","haveUsed","addAdStudioSurveyTriggerFlag","triggerFlag","usedFlagSuffix","_ref5","getTime","window","survey","surveyManager","trigger","checkIfSurveyIsOpen","removeAdStudioSurveyTriggerFlag","commonButtonStyle","display","shorthands","padding","justifyContent","alignItems","gap","borderRadius","backgroundColor","boxShadow","border","outline","maxHeight","overflow","minWidth","commonTextStyle","fontFamily","fontStyle","textAlign","flex","textOverflow","whiteSpace","commonIconStyle","margin","useAssetsEntryCardStyle","makeStyles","fillWidth","assetsEntryCard","color","fontSize","lineHeight","fontWeight","objectFit","AssetsEntryCard","isFillWidth","cardClassName","classes","Button","mergeClasses","Add20Regular","defaultProps","AddAssetEntryCard","useStyles","addMediaPanel","top","bottom","panelContent","scrollbarWidth","overlay","zIndex","layer","AdsStudioPanelContainer","forwardRef","props","ref","onRenderFooterContent","isOpen","dismiss","headerText","size","overlayBodyRef","useRef","styles","_Fragment","DrawerOverlay","open","modalType","position","tabIndex","DrawerHeader","DrawerHeaderTitle","action","appearance","Dismiss24Regular","DrawerBody","Children","child","cloneElement","DrawerFooter","Layer","Overlay","isDarkThemed","AdsStudioSpinner","useCustomSize","customStyle","spinnerStyles","useMemo","circle","root","Spinner","SpinnerSize","large","useActionButtonStyles","actionButton","ActionButton","Icon","primary","classnames","TilesGridCellActionButton","AdsStudoThemeContext","React","AdsStudioThemeProvider","theme","componentStyles","getComponentStyles","useCallback","componentName","components","contextValue","Provider","emptyAdsStudioTheme","useThemedStyles","prefixClassName","getDefaultStyles","themedStyles","overridenStyles","getOverridenStyles","defaultStyles","createUseStyles","name","withAdsStudioStyles","WrappedComponent","options","Component","useRawStyles","finalComponentName","displayName","HOC","_useThemedStyles","hoistNonReactStatics","positionFill","left","right","CellOverlay","cellOverlayContainer","TilesGridCellOverlay","background","opacity","transition","getCommonCellCardStyle","palette","flexShrink","flexGrow","neutralLight","CellCardWithOverlay","isOverlayEnabled","isCellFocused","renderOverlayContent","renderStaticOverlayContent","customCellCardClass","onClickFunc","event","stopPropagation","preventDefault","containerClass","cellCardContainer","cellCardContainerOverflow","cellCardWithOverlayContainer","focused","onKeyDown","keyCode","CellCard","TilesGridCellCard","_ref$core","core","_ref$core2$palette","TilesGridCellCardWithOverlay","_ref2$core","_ref2$core2$palette","activeStyle","transform","flexDirection","button","CellDecorativeIcon","iconName","centerContainer","circleContainer","iconContent","labelName","white","marginLeft","useGridDecorativeLabelStyle","tilesGridCellDecorativeLabel","tokens","colorNeutralForegroundInverted","marginRight","colorNeutralBackgroundStatic","float","cellLabelDisplay","CellDecorativeLabel","secondaryText","additionaIconName","additionalText","customClass","cellLabel","iconTextWrapper","role","TilesGridCellDecorativeLabel","iconProps","CellDeletionButtonDecorator","onDelete","cellDeletionButtonDecorator","IconButton","ariaLabel","disabled","deleteButton","TilesGridCellDeletionButtonDecorator","themeLighter","CellImage","showSpinner","onLoaded","onError","enableRetry","customClasses","onCustomizedSpinner","imageFit","ImageLoadState","notLoaded","imageLoadState","setImageLoadState","onLoadingStateChange","s","onLoadError","loaded","error","reloadImage","img","onerror","onload","onErrorWithRetry","retryCount","setTimeout","onReloadImage","onImageLoadingStateChange","tilesGridCellImageContainer","imageStateOverlayClass","stateParent","ArrowClockwiseRegular","reloadBtn","FluentImage","imageClass","maximizeFrame","noop","ImageFit","cover","TilesGridCellImage","useCellSectionDecoratorStyle","makeResetStyles","outlineStyle","outlineWidth","outlineColor","colorBrandBackground","borderRadiusSmall","TilesGridCellSelectionDecorator","selected","isFocused","cellSelectionDecoratorWrapper","selectedStateWrapper","cellSelectionDecorator","selectedState","Checkbox","checked","TilesGridLoadingCell","onLoading","gridCellContent","hasSetUpObserver","setHasSetUpObserver","onLoadingCalled","observer","current","IntersectionObserver","entries","entry","isIntersecting","target","unobserve","rootMargin","threshold","observe","commonStyles","useFolderIconStyle","folderIconContainer","folderTag","emptyFolderTag","folderContent","emptyFolderContent","FolderIconInternal","thumbnailImageUrl","isEmptyFolder","folderIconRootClassName","fit","FolderIcon","dragPreview","dragPreviewImage","dragPreviewFolderWrapper","dragPreviewFolder","dragPreviewCount","verticalAlign","TilesGridCellDragDecorator","draggable","dragItemsLength","onDrag","dragPreviewDescription","dragItemsLengthInner","renderDragPreview","thumbnailUrl","onDragStart","container","document","createElement","DragPreview","ReactDOM","domElement","firstChild","body","appendChild","dataTransfer","setDragImage","useFolderGridCellDropStyle","outlineOffset","TilesGridCellDropDecorator","droppable","onDrop","customClassName","isOver","setIsOver","tilesGridCellDropOver","onDragOver","onDragLeave","onDropHandler","classNames","DEFAULT_CONFIG","maxColumnWidth","minColumnWidth","rowHeight","preferredCellsPerPage","TilesGridInternal","items","onRenderCell","onRenderCellImpl","gridItem","_index","index","tilesGridContainer","Grid","renderItem","columnWidth","gridMode","columnPadding","rowPadding","scrollContainer","maxColumns","minItemHeight","TilesGrid","overflowX","boxSizing","findItem","itemToFind","itemKey","addItem","itemToAdd","removeItem","itemToRemove","MultiSelectionGrid","onSelectionChange","propSelectedItems","selectedItems","rest","_objectWithoutProperties","_excluded","allItems","selectItem","_action","_action2","newSelectedItems","fnSelectItem","SectionTilesGridInternal","sectionData","loadNextPage","multiSelectionEnabled","onRenderLoadingCell","otherProps","wrappedSectionData","section","params","sectionName","_ref4","totalItemCount","countOfSectionsWithData","sec","GridComponent","sectionTilesGridContainer","gridConainerClass","sectionTitle","sectionClassName","_excluded2","SectionTilesGrid","marginBottom","marginTop","useStyle","TextWithHighlightImp","txt","highlightedText","highlightedClassname","enableTooltip","textFragments","substr","matched","idx","lowerText","toLowerCase","lowerSubstr","startIndex","fragments","indexOf","substring","f","splitString","content","Tooltip","relationship","withArrow","positioning","TextWithHighlight","getSharedAssetContainerStyle","flexWrap","colorPaletteYellowBackground3","getSharedMultiSelectingCellStyles","selectableCardContainerAutoHideCheckbox","visibility","selectableCardContainer","iconStyles","useFolderGridCellStyle","cursor","paddingTop","paddingRight","getCountDescription","itemInfo","subFoldersCountDesc","imagesCountDesc","videosCountDesc","subfoldersCount","count","imageAssetsCount","videoAssetsCount","FolderCountInfo","FolderRegular","ImageRegular","VideoRegular","FoldersGridCell","onFolderClick","selectable","onSelect","allowedAssetType","renderAccessory","selectedItemCount","folderGridCellContainer","_ref6","folderName","itemCount","itemInfos","result","SubFoldersCount","ImageAssetsCount","VideoAssetsCount","convertItemInfo","TotalCount","firstAsset","folderAssetType","getFolderThumbnail","onCheckboxChange","hasAccessory","onChange","AdsStudioFoldersGridCell","useImageAssetsGridCellStyle","imageAssetsGridCellContainer","animationName","from","to","animationDuration","animationIterationCount","animationTimingFunction","imageCellLabelContainer","AdsStudioImageAssetsGridCell","renderCellContent","isMultiSelecting","deletable","isImageLoaded","setImageLoaded","sourceType","manualAddedImageSourceType","cellContent","defaultContent","Fragment","CellLabel","ArrowSync16Filled","funcRenderOverlayContent","onCellClick","withSelectionDecorator","decoratedContent","withDeleteButtonDecorator","GridCellFactory","DefaultImageGridCell","DefaultVideoGridCell","AdsStudioAssetGridCell","onDetailsClick","onEditClick","permissions","focusIndex","setFocusIndex","focusCellButton","i","assetContainers","querySelectorAll","firstButton","querySelector","code","focus","detailButton","editButton","clickDetails","evt","clickEdit","isVideoCell","isStockImageCell","showEditIcon","dynamic","VideoTemplateUI","metaData","EditRegular","ListRegular","logTrace","stringifySync","style","onClickVideo","useControlStyles","videoContainer","paddingBottom","sliderContainer","previewVideo","commonParentStyles","iconCommonStyles","usePlaceholderStyle","encoding","unverified","borderBottom","failed","VideoPureComponent","EncodingPlaceholderWithStyle","EncodingPlaceholder","FailedPlaceholderWithStyle","FailedPlaceholder","UnverifiedPlaceholderWithStyle","UnverifiedPlaceholder","useVideoAssetsGridCellStyle","VideoAssetsGridCellContainer","videoCellLabelContainer","videoCell","paddingLeft","placeholderCell","AdsStudioVideoAssetsGridCell","isVideoLoaded","setVideoLoaded","_useState3","_useState4","showVideo","setShowVideo","_useState5","_useState6","hideVideo","setHideVideo","_useState7","_useState8","thumbnailSeletable","setThumbnailSelectable","durationInMS","durationDesc","_useState9","_useState10","cellRef","setCellRef","timerRef","addEventListener","clearTimeout","onClickVideoCard","playVideoObject","play","wrapperWidth","offsetWidth","TimerRegular","placeholderContent","videoWrapper","x","autoPlay","muteByDefault","maxWidth","showTime","showPlay","customPlayObject","imageWrapper","borderRadiusXLarge","iconChecked","borderRadiusCircular","ImagePanelGridCell","onSelectImage","isSelected","isMultiple","onClickCell","CheckmarkCircleFilled","contentGridWrapper","PanelImageGrid","dataService","onFailedToLoadData","imageWidth","isHideDescription","_ref$isMultiple","isLoadingMore","totalAssetCount","loadMoreData","selectedItemIds","setSelectedItemIds","onSelectedChange","selectedItemId","itemId","assetsWithAction","onAction","imagesGridSection","sectionGridData","p$res","catch","err","usePerformanceFilterBarEditingStyle","filterBarEditingContainer","borderLeft","usePerformanceFilterBarReadonlyStyle","filterBarReadonlyContainer","textDecoration","addFilterButton","useViewAllFiltersButtonStyle","viewAllButton","viewContentTitle","viewAllFilterItem","EditingFilterBar","filters","focusedFilter","onRenderNewFilterContextMenu","onRenderFilter","onCloseClick","onResetClick","getDivider","isLast","isFirst","DismissRegular","PerformanceEditingFilterBar","FilterListWithPopover","onClickFilter","humanizedValue","ViewAllFiltersButtonImpl","selectedFilters","isFilterAlwaysVisible","Popover","align","PopoverTrigger","as","PopoverSurface","ViewAllFiltersButton","ReadonlyFilterBar","onClickAddFilterButton","filterListRef","onBlur","scrollTo","which","Enter","Space","onKeyPress","AddRegular","PerformanceReadonlyFilterBar","dynamicSizeContainer","videoOutlineGray","videoNormalContainer","backgroundImage","VideoPlaybackView","hideControls","onLoadedMetadata","onErrorHanler","isOutlineGray","useDynamicVideoSize","ev","errorCode","poster","controls","controlsList","disablePictureInPicture","mainViewContainer","mainViewContentContainer","mainViewIconLabelContainer","contentIcon","footerContainer","footerInvalid","footerContent","helpLink","ItemPlaceholderBoxViewFooterType","info","warning","ItemPlaceholderBoxView","mainViewIcon","mainViewIconLabel","footerProps","summary","tip","learnMoreLinkText","learnMoreLinkTopic","renderFooter","footContentStatus","getFolderProgressPreviewStyles","imageContent","baseItemBoxProgressStyles","imageName","imageContentText","folderSize","folderIconRoot","createFolderPreviewComponent","numberOfAssets","FileUploadingPreview","isVideo","SimpleImagePreview","VideoLoadState","placeholderView","hidden","shown","PlaceHolderBoxViewFooterConfig","VideoLoadPreview","onErrorHandler","videoLoadState","setVideoLoadState","cachedUrl","setCachedUrl","localizedTextFields","onLoadedMetadataInternal","onErrorHandlerInternal","addUrlInput","placeHolderImage","errorMesBelowUrlInput","videoPlaybackView","messageContainer","AddVideoPanelContent","videoLoaded","processedUrl","setProcessedUrl","messageBarText","setMessageBarText","urlInputErrors","setUrlInputErrors","_useState11","_useState12","videoLoadStarted","setVideoLoadStarted","handleInput","isEmpty","onUrlInputChange","errors","isValidUrl","Input","placeholder","contentBefore","SearchFilled","MessageBar","intent","contentWrapper","searchArea","input","messageBar","dropdown","listbox","StockImagePanelContent","cid","oDataConfig","setSelectedImages","setIsLoadingMore","isLoadingFirstPage","setIsLoadingFirstPage","images","setImages","totalCount","setTotalCount","selectedImages","searchQuery","skip","hasMore","filterQueryJSON","onInputChange","_ref$value","stockImageService","StockImageDataService","controller","getStockImages","loadImages","_ref2$$search","$search","_ref2$$skip","$skip","_ref2$$query","$query","customQueries","extend","appName","$top","language","includevertical","then","prevImages","Preview","Url","newSkip","imageId","originSelectedLength","newSelectedList","selectedItem","find","prototype","PropTypes","InvestImagePanelContent","investImageService","InvestImageDataService","getInvestImages","getInvestAssets","_ref2$creativeId","creativeId","queryParams","assetTypeId","XandrAssetId","videoNameWrapper","videoName","emptyButtonStyle","borderImage","borderColor","borderStyle","InvestVideoPanelContent","setSelectedVideos","videos","setVideos","selectedVideos","getInvestVideos","loadVideos","prevVideos","Description","onSelectVideo","videoId","videosGridSection","loop","urlPrefixOptions","domainInputWrapper","columnGap","prefixSelect","domainInput","suggestionErrorInvalid","DomainInputView","errorMessage","onDomainChange","isDomainInvalid","errorMessageClassName","domainInputWrapperClassName","urlPrefix","setUrlPrefix","selectId","useId","onSelectChange","onBlurUrl","newUrl","prefix","newDomain","Select","option","subdomainWrapper","divider","SubdomainInputView","isLoading","defaultDomainUrl","onDomainUrlChange","onSubdomainUrlChange","onDomainBlur","temporaryFinalUrl","newDomainUrl","getUrlProtocolAndDomain","hasProtocol","onDomainKeyDown","onSubdomainBlur","newSubdomainUrl","onSubdomainKeyDown","defaultValue","subdomainUrlRegex","WebsiteImagePanelContent","domainUrl","setDomailUrl","subdomain","setSubdomain","setIsdomainInvalid","_useWebsiteImages","isLoadingFistPage","setIsLoading","pageNumber","suggestionPoller","SuggestionPoller","trace","startSignal","stopSignal","jobCompleteCallback","setPageNumber","newPageNumber","getLandingPageSuggestions","landingPageUrl","isSubdomain","pageNum","minimumResolution","Promise","resolve","setJobCompleteCallback","forceInternalScrapingService","getMoreLandingPageSuggestions","_ref3$url","_ref3$sDomain","sDomain","ImagePaging","Images","ThumbnailUrl","ImageUrl","useWebsiteImages","showDomain","finalUrlDomain","onSubdomainChange","newValue","regexResult","trim","split","getSubdomain","newSearchUrl","OverflowItemsMenu","overflowItems","onItemClick","_useOverflowMenu","useOverflowMenu","isOverflowing","overflowCount","overflowItemsCount","Menu","MenuTrigger","disableButtonEnhancement","MoreHorizontalRegular","MenuPopover","MenuList","MenuItem","AdsStudioBreadcrumb","maxDisplayedItems","maxLengthOfItem","customItemStyle","_partitionBreadcrumbI","partitionBreadcrumbItems","startDisplayedItems","endDisplayedItems","lastIndex","isLastItem","isTruncatableBreadcrumbContent","BreadcrumbItem","BreadcrumbButton","breadcrumbButton","breadcrumbButtonCurrent","truncateBreadcrumbLongName","BreadcrumbDivider","Breadcrumb","useLibraryEmptyViewStyle","CardContainer","emptyView","emptyIcon","mainText","neutralForegroundRest","LibraryEmptyView","isInSubfolder","isAnyFilterSet","hideAddAssetCards","str","AddFromAnotherSourceSubMenu","onUploadImage","onUploadVideo","ImageMultiple20Regular","UploadFromComputerSubMenu","onUploadLocalFile","onUploadLocalFolder","ArrowUpload20Regular","NewDropDown","onUploadLocalFileClick","onUploadLocalFolderClick","onUploadImageClick","onUploadVideoClick","onAIGenerateClick","onCreateFolderClick","handleUsage","onAIGenerate","onCreateFolder","MenuButton","MenuDivider","FolderAdd20Regular","menuPopover","menuButton","unselectedMenuButton","enabledClearButton","colorNeutralForeground2BrandHover","disabledClearButton","colorNeutralForegroundDisabled","useCustomItemStyles","overflowY","contentAfter","colorNeutralBackground3","contentLabel","defaultMinWidth","defaultMinHeight","forceClear","onDismiss","_props$defaultOpen","defaultOpen","minWidthId","afterMinWidthId","minHeightId","afterMinHeightId","setIsOpen","showInput","setShowInput","menuList","setMenuList","minWidthRef","minHeightRef","setMinWidth","setMinHeight","getOnChangeCallback","setter","parseInt","onMinWidthChange","onMinHeightChange","onClear","newMinHeight","newMinWidth","focusTextField","textFieldRef","onMinWidthKeyUp","onMinHeightKeyUp","onDropdownDismiss","clear","timeoutId","removeAttribute","trapFocus","onOpenChange","Label","htmlFor","toString","Dismiss20Regular","civilDateEqual","d1","d2","compareCivilDate","civilDateRangeEqual","r1","r2","civilDateToDebugString","cd","civilDateRangeToDebugString","dr","getDefaultMetricDateRange","dateFormat","lcid","yesterday","RangeStartDate","formatCivilDate","raw","RangeEndDate","Rangelcid","RangeId","SimpleDateRangePickerInternal","defaultSelectedDateRange","defaultIsSelectingStartDate","onDateRangeChange","isSelectingStartDate","selectedDateRange","setSelectedDateRange","leftNavigatedDate","setLeftNavigationDate","rightNavigatedDate","minDate","years","maxDate","selectedRanges","onNavigateStartMonthDate","date","onNavigateEndMonthDate","months","onSelectDate","newDate","SingleMonthCalendar","navigatedDate","onNavigateDate","isRightNavigateVisible","isLeftNavigateVisible","SimpleDateRangePicker","containsErrorCodeInList","errorList","searchErrorCode","processVideoSizeLimitError","limit","fetchImgPromise","imgUrl","Error","crossOrigin","createOffScreenContext","canvas","context","getContext","getImagePixels","imageHeight","_createOffScreenConte","drawImage","getImageData","parseMaskResultPromise","imageUrl","rawMaskSetsBase64String","maskSetsBase64Json","parseSync","_maskSetsBase64Json$s","shape","maskSetsBase64","reshapeTo3D","array","y","z","res","temp2D","j","temp1D","k","_decompressAndParse3DArray","_asyncToGenerator","_regeneratorRuntime","mark","_callee","base64String","binaryString","byteArray","inputStream","decompressionStream","decompressedStream","decompressedResponse","decompressedBuffer","decompressedArray","int3DArray","wrap","_context","prev","next","atob","Uint8Array","charCodeAt","Blob","stream","DecompressionStream","pipeThrough","Response","arrayBuffer","sent","abrupt","stop","apply","_x","_x2","_x3","_x4","decompressAndParse3DArray","maskSets3Darray","maskSetsArray","row","a","flat","alphaArray","selectedMasksArray","pixelMask","_createOffScreenConte2","originalImagePixels","_createOffScreenConte3","imageData","pixels","_createOffScreenConte4","secondContext","secondCanvas","putImageData","imageUrlWithoutBackground","toDataURL","getMaskValueAtPointFunc","segmentationMasks","createColorBackground","selectedMasks","_hexToRgb","hex","exec","r","g","b","hexToRgb","_createOffScreenConte5","alpha","newR","newG","newB","_createOffScreenConte6","createSelectedImageSrc","masks","isAdd","hasSelectedImageSrc","_createOffScreenConte7","_createOffScreenConte8","dArr","clearRect","globalCompositeOperation","fillStyle","fillRect","borderImageSrc","selectedImageSrc","createHighlightedImage","workingMasks","maskValue","_createOffScreenConte9","PlacementQualities","PlacementQualityToText","formatFileSize","fileSize","getClosestAspectRatio","inputRatio","closestRatio","closestDiff","abs","_i","_Object$entries","Object","_Object$entries$_i","label","ratio","diff","formatBrandkitForAPI","obj","Array","isArray","formattedObj","keys","forEach","SubType","errorObjectToString","message","stack","stringify","getErrorString","msg","originError","fetchResultFromProcessors","processors","_ref$options","errorCodeMessageKeyMapping","InvalidDuration","AssetDataInvalidWidth","AssetDataInvalidHeight","ImageAIUpScaleFailed","processAssetLimitErrors","codes","imageSizeLimitResult","processImageSizeLimitError","imageAssetLimit","videoSizeLimitResult","videoAssetLimit","processImageErrors","filePickerI18n","processPredefinedAssetErrors","mappedKey","getAssetUploadError","uploadErrorCodeArr","_ref4$disableGenericM","disableGenericMessage","href","INVALID_FOLDER_ID","filterFilesByExtensions","files","supportedExtensions","acceptedFiles","file","ext","parseFileName","createFolderHierarchyMap","foldersToCreate","folders","relativePath","pathArr","pop","getRelativeFoldersFromRelativePath","webkitRelativePath","currFolderMap","folder","createFolderWithErrorHandling","folderCreationErrors","createFolderAsync","parentFolderId","currentFolderId","originalFolderName","_ref3$numberOfAttempt","numberOfAttempts","createFoldersByHierarchyInternal","folderMap","creationPromises","parentFolderName","folderNames","subFoldersMap","parentPromise","createFoldersByHierarchy","_ref5$folderCreationE","createRateLimitedAssetUploadPromises","_ref6$customizedFiles","customizedFilesOptions","acceptedAssets","folderIdPromises","_ref6$validateAssetAs","validateAssetAsync","uploadAssetAsync","_ref6$assetsSkippedUp","assetsSkippedUpload","_ref6$assetUploadErro","assetUploadErrors","readAssetAsync","processAssetJobPromises","assetUploadJobs","getFileFolderName","extraOptions","processAssetJobPromise","folderId","dataURL","validatedResult","isImageUpscaled","nameWithoutExt","fileObject","runJobsInParallelWithRateLimit","jobsToRateLimit","maxJobsInParallel","handleJobError","processFolderSizeLimitErrors","folderLimitResult","processFolderSizeLimitError","folderLimit","processAssetErrors","getFolderUploadError","genericErrorMessage","getTaskPoller","timerId","task","_ref$interval","interval","stopRunning","counter","taskPromise","setInterval","clearInterval","existDup","arr","newArr","newKeys","ACTION_TYPE_SET_FOLDER_DATA","AL_FOLDER_REDUCER_INIT_STATE","perfTimeSeriesData","folderDataStateReducer","state","actionType","actionData","_actionData$newFolder","newFolders","_actionData$newAssets","newAssets","_actionData$newPerfTi","newPerfTimeSeries","shouldFlush","pageName","foundFolderDup","foundAssetDup","AdsStudioErrorBase","_Error","_this","errorProcessor","_classCallCheck","_callSuper","_inherits","_createClass","_wrapNativeSuper","renameFolderApiErrorProcessor","msgs","InvalidFolderId","uxMessage","actionable","DuplicateFolderName","InvalidFolderName","genericError","deleteFolderApiErrorProcessor","ignorable","shortMsg","FolderHasAssets","InvalidId","FolderHasSubFolders","bulkMoveApiErrorProcessor","folderCount","assetCount","getUXMessage","bulkMoveApiItemErrorProcessor","availableActions","AssetIdInvalid","DuplicateAssetsUnderFolder","DuplicateImage","FolderCanNotMoveToTarget","createFolderApiErrorProcessor","DuplicateEntity","FolderLimitExceededPerAccount","getFolderLimit","bulkDeleteAssetsApiItemErrorProcessor","CampaignServiceMediaIdInvalid","CampaignServiceMediaIsAssociated","assetType","gotoAds","bulkDeleteAssetsApiErrorProcessor","generateImagesWithAIAPIErrorProcessor","reqCountErr","GenerateImagesPromptLengthInvalid","GenerateImagesRequestCountLimitExceededPerAccount","GenerateImagesRequestCountLimitExceeded","GenerateImagesPromptContentInvalid","GenerateImagesAIGCNoRecommendationWithBrand","brandNameDetected","brandNames","getAIGeneratedImageAPIErrorProcessor","AI_Generation_Failed","shouldRetry","getRemoveImageBackgroundAPIErrorProcessor","GenerateImagesAIGCInvalidImageSize","GenerateImagesAIGCInvalidImageContent","gotoDisallowedContent","GenerateImageAIGCInvalidUserPrompt","GenerateImageAIGCInvalidGeneratedImage","PATH_SEPERATOR","getPathString","folderPath","pathString","slice","fp","getAssetTypeToFetch","filterSettings","defaultAssetType","assetTypeFilter","useFolders","perfMetricDateRange","defaultPerfMetricDateRange","repository","ROOT_FOLDER","_useDataServiceReduce","initState","_useReducer","useReducer","_useReducer2","folderData","dispatch","setFolderData","setAssetsOnly","appendFolderData","setPerfTimeSeriesData","resetFolderData","useDataServiceReducer","setAssets","newFolderId","setNewFolderId","setFolderPath","currentFolder","latestRequestTimestamp","curFilterSettings","curSortBy","curAssetCountToLoadForSubFolders","curFolderAssetTypeToLoad","curIncludeParentHierarchy","curIncludeSubfolders","curPageName","curPerfMarker","pendingVideoBlobUploadPromiseTokens","resetData","_len","_key","loadFolderArgs","assetsToLoadForSubfolders","includeParentHierarchy","folderAssetTypeToFetch","getFolderArgs","includeAssets","includeSubfolders","isAssetPickerScenario","loadFolderDataInternal","hasDateRange","_ref5$includeSubfolde","perfMarker","_ref5$withBIData","withBIData","requestTimestamp","saveCurrentFilters","getFolderData","subfolders","searchText","searchTerm","dateAddedStart","dateAddedEnd","otherFilters","dateAddedDateRange","tapCatch","loadFolderData","_ref7","_ref7$includeSubfolde","loadFolderDataInDateRange","_ref8","_ref8$includeSubfolde","loadPerfTimeSeriesData","_ref9","perfTimeSeriesParams","getPerfTimeSeriesData","loadMoreFolderDataImpl","_ref11","_ref11$count","_ref11$withBIData","loadMoreFolderData","_ref12","_ref12$count","loadMoreFolderDataInDateRange","_ref13","_ref13$count","reloadFolders","reloadFoldersInDateRange","navigateIntoFolder","_ref16","folderToNavigate","_ref16$id","_ref16$navigateToNewF","navigateToNewFolder","_ref17","_ref18","parentHierarchy","curFolderPath","navigateToFolderInPath","_ref19","indexOfFolderInPath","_ref20","navigateIntoFolderItem","_ref21","_folder$parentHierarc","navigateIntoRootFolder","createFolder","_ref22","createFolderBulk","_ref23","deleteEmptyFolder","_ref24","deleteFolder","renameFolder","_ref25","newFolderName","uploadImageByUrlToFolder","_ref26","addUrlImageToFolder","addImageWithBaseIdToFolder","_ref27","baseId","uploadVideoToAzureBlob","_ref28","onProgress","uploadVideoToAzureBlobWithCancellation","_ref29","token","blobName","on","onSuccess","onCancel","uploadVideoToFolder","_ref30","updateCurrentProgress","uploadVideoPerfMarker","createChild","willInit","progressForBlobUpload","percentage","total","progressForSavingBlobToMT","_ref31","addFolderUploadAsset","inProgress","finally","done","cancelPendingVideoUpload","cancel","postVideoByUrl","_ref32","videoUrl","uploadImageToFolder","_ref33","supportUpscale","uploadStockImageToFolder","_ref34","stockImageId","addStockImageToFolder","uploadInvestImageToFolder","_ref35","investImageId","addInvestImageToFolder","uploadInvestVideoToFolder","_ref36","investVideoId","videoSrc","addInvestVideoToFolder","renameAsset","_ref37","assetId","newName","newAsset","splice","deleteAsset","_ref38","tap","_batchDeleteAssetsAsync","_ref39","parentPath","onItemDeleted","bulkDeleteAssets","_ref40","resultSummary","_ref41","assetName","path","api","_ref42","_deleteEmptyFolderAsync","_ref43","_ref43$onItemDeleted","_batchDelete","_ref44","_ref44$folders","_ref44$assets","_deleteFolder","_ref45","ic","concurrency","foldersResult","assetsResult","_ref46","totalItmCnt","_ref46$skip","_ref47","hasNextPage","results","_ref48","loadDataError","_ref49","batchDelete","_ref50","_ref50$folders","_ref50$assets","_ref50$onItemDeleted","batchMove","_ref51","destFolderId","_ref51$folders","_ref51$assets","dataOwnerPageName","propTypes","getFolders","getImages","useCommonImageRepoMethods","imageRepository","loadedImages","setLoadedImages","latestTimestampRef","setImageCroppingTasks","croppingTaskUpdated","setCroppingTaskUpdated","getImageById","_ref2$useCache","useCache","getImage","getImageCroppingTaskStatus","tasks","curTasks","dirty","newTaks","tsk","curTsk","newTsk","t","ex","renameImage","newImage","newImages","renameLocalImage","deleteImage","cropImage","placementSettings","addCreative","creativeData","VideoChangedFieldsWithStatusUpdate","checkError","retryPromise","getPromise","_ref2$timeout","timeout","_ref2$shouldRetry","useAIGeneratedImages","_ref3$pollInterval","pollInterval","_ref3$maxRetryCount","maxRetryCount","generateImagesByAI","prompt","onStartPolling","skipBrandDetection","ret","generateImagesWithAIAsync","taskId","taskPoller","getAIGeneratedImageTaskStatus","isTaskDone","monitorPromise","promise","AssetWithFoldersDataServiceContext","AssetWithFoldersDataServiceProvider","aigcRepository","folderRepository","videoRepository","_useFolders","loadAssetsUnderFolder","_useCommonImageRepoMe","_useCommonVideoRepoMe","setVideoUpdated","getVideoTaskStatus","videoTasks","videosToCheck","updateVideoStatusByIds","response","notFinishedTaskList","newVideoUpdated","responseKeys","addVideoCreative","videoCreative","getVideo","fetchMetadata","useCommonVideoRepoMethods","_useFolderPathTree","folderPathTree","setFolderPathTree","updateFolderPathTree","currentFolderPathTree","folderIdArr","subFoldersArr","totalSubfoldersCount","reload","recursiveUpdate","subFolders","subFoldersCount","newSubFloders","loadFolderPathTreeItemImp","subFolder","initializeFolderPathTree","loadFolderPathTreeItem","loadMoreFolderPathTreeItem","currentFolderCount","reloadFolderPathTreeItem","all","totalSubfoldersCountArr","useFolderPathTree","loadDataArgs","minImageWidth","minImageHeight","importSource","assetSources","_ref2$assetsToLoadFor","minVideoDuration","maxVideoDuration","_ref2$isGlobalSearch","isGlobalSearch","_ref2$includeParentHi","topRated","loadDataImpl","useDateRange","_ref3$assetsToLoadFor","_ref3$isGlobalSearch","_ref3$includeParentHi","_ref3$hasPerfData","hasPerfData","_ref3$includeSubfolde","loadData","args","loadDataInDateRange","loadPerfTimeSeriesDataImpl","_ref4$isGlobalSearch","_ref4$hasPerfData","uploadImageByUrl","uploadImage","_ref6$updateCurrentPr","_ref6$name","_ref6$folderId","uploadVideo","_ref7$updateCurrentPr","_ref7$name","_ref7$folderId","_ref7$perfMarker","uploadVideoByUrl","_ref8$name","_ref8$folderId","uploadStockImage","uploadInvestImage","_ref10","uploadInvestVideo","contextVal","reloadData","reloadDataInDataRange","loadMoreDataInDateRange","useAdsStudioServices","useContext","withAdsStudioServicesConsumer","Comp","pickedPropNames","CompWithService","pickedProps","WindowStatus","INDETERMINATE","UNSET","MAX_ITEM_COUNT","AssetsWindowManager","windowSize","this","assetWindows","windowsCount","ceil","get","w","windowIndex","SequenceAssetsWindowManager","sourceNames","winMgrList","sourceName","mgr","resetWindows","winObj","setTotalItemCount","isCompleted","cnt","winMgr","getNextUnloadedWindow","indexOffset","setWindowStatus","AssetsReducerActionType","AssetsReducerActions","pageIndex","pageSize","InitialReducerState","defaultReducer","_excluded3","_excluded4","_excluded5","startIdx","sequenceWindowReducer","_excluded6","_actionData$indexOffs","_excluded7","useAssetsServiceBase","reducer","reducerInitialArg","assetWindowManager","filtersRef","loadingWindowManagerRef","assetState","_ref2$updateCurrentPr","_ref2$name","_ref2$folderId","loadAssets","loadMoreAssets","noMoreData","reloadAssets","resetAssetsData","getTotalAssetCount","useBasicAssetsService","_ref$pageSize","useMultiSourceAssetsService","_ref2$pageSize","dataSourceNames","assetWindowManagerRef","service","getAssetCountBySource","useEditImageService","imagesWithFilter","setImagesWithFilter","imagesWithFilterAndBlur","setImagesWithFilterAndBlur","getImagesWithFilter","generateImageWithSmartEffect","smartEffects","smartEffectName","smartEffectOptions","filterRes","Effect","Resource","unshift","getImagesWithFilterAndBlurImp","blurLevel","ManualBgBlurLevel","getOriginalImageWithBlur","getImagesWithFilterAndBlur","originalImageWithBlurRes","imagesWithFilterAndBlurRes","imagesWithFilterAndBlurInner","blur","removeImageBackground","generateImageBackground","outputImageWidth","outputImageHeight","newImageUrl","generatedUrl","getImageSegmentations","originalUrl","saveImageCopy","saveImage","isImageFittingEnabled","_ref10$folderId","saveImageWithBaseId","_ref11$folderId","moveImageToFolder","_ref14","placements","skipOutpainting","_ref15","useVideoTaskPoller","newVideoTasks","isPollerRunning","currentTaskPoller","startVideoTaskStatusPoller","stopPoller","KEY","updateInProgressTasksStatus","inProgressTaskCount","ss","getSessionStorage","supportsStorage","set","invalidate","ImageCroppingTaskStatusPoller","_useAdsStudioServices","startImageCroppingTaskStatusPoller","VideoTaskStatusPoller","withAssetTaskStatusPoller","Wrapper","ChevronRightIcon","bundleIcon","ChevronRight20Filled","ChevronRight20Regular","startDate","endDate","CustomItem","isCustomSelected","customDateRange","setCustomDateRange","customRangeStartStr","customRangeEndStr","customOption","menuItemRef","startDateId","afterStartDateId","startDateRef","endDateId","afterEndDateId","isDatePickerOpen","setIsDatePickerOpen","onSelectedDateRangeChange","newRange","openDatePickerForStart","openDatePickerForEnd","onStartKeyDown","onEndKeyDown","MenuItemRadio","hasSubmenu","readOnly","CalendarLtr20Regular","defaultTimeFrame","defaultCustomDateRange","checkedValues","setCheckedValues","optionsWithoutCustom","formatDate","selectedChoice","dropdownTitle","onDropdownClear","timeframe","onCheckedValueChange","checkedItems","hasCheckmarks","searchBox","backgroundSize","SearchBoxFilter","onSearchTextChanging","onSearchTextChange","onSearchTextBlur","onSearchTextClear","defaultSearchText","searchboxPlaceHolder","autoFocus","SearchBox","toggleButton","toggleButtons","selectedButton","AssetTypeToggleButtonsFilter","optionsState","toggleSelectedOption","ToggleButtons","SortByFilter","selectedOptionMemo","selectedOption","ArrowSortUp20Regular","ArrowSortDown20Regular","ArrowSort20Regular","checkbox","defaultSelectedAssetSources","selectedAssetSources","setSelectedAssetSources","selectedOptions","onChangeCallback","selectedSources","minDuration","customDuration","maxDuration","defaultMaxDuration","defaultMinDuration","minDurationId","afterMinDurationId","maxDurationId","afterMaxDurationId","minDurationRef","maxDurationRef","setMinDuration","setMaxDuration","minDurationInvalid","setMinDurationInvalid","maxDurationInvalid","setMaxDurationInvalid","onMinDurationChange","onMaxDurationChange","newMinDuration","newMaxDuration","onMinDurationKeyUp","onMaxDurationKeyUp","defaultImportSource","thumbSizeVar","railSizeVar","railColorVar","progressColorVar","thumbColorVar","sliderMinProgressVar","sliderMaxProgressVar","videoDuration","videoDurationScrollbar","touchAction","justifyItems","gridTemplateRows","gridTemplateColumns","colors","colorNeutralStrokeAccessible","colorCompoundBrandBackground","colorCompoundBrandBackgroundHover","colorCompoundBrandBackgroundPressed","rail","gridRowStart","gridRowEnd","gridColumnStart","gridColumnEnd","forcedColorAdjust","colorTransparentStroke","thumb","colorNeutralBackground1","colorNeutralStroke1","rangeInput","pointerEvents","minRangeInput","colorStrokeFocus2","borderRadiusMedium","maxRangeInput","minThumb","maxThumb","getPercent","Slider","setValue","getRelatedValue","isDragging","setIsDragging","onMouseMove","onMouseUp","removeEventListener","onMouseDown","console","log","VideoDurationScrollbarFilter","minInputId","maxInputId","minDurationFilter","maxDurationFilter","minValue","setMinValue","maxValue","setMaxValue","scrollbarRef","styleVariables","wrappedSetMinValue","shouldCallOnChange","wrappedSetMaxValue","clientX","scrollbarBox","getBoundingClientRect","onClickRail","FilterToggleButton","ToggleButton","Filter20Regular","getCivilDateToday","DEFAULT_RANGE","FilterContext","useFilterBarState","userPreference","defaultMinVideoDuration","defaultMaxVideoDuration","setFilterBar","_useAdditionalFilterB","showAdditionalFilterBar","setShowAdditionalFilterBar","toggleFilterBar","useAdditionalFilterBarState","_useAssetTypeState","assetTypes","initialState","assetTypesState","setAssetTypesState","isImageSelected","isVideoSelected","toggleAssetType","newAssetTypesState","optionKey","useAssetTypeState","_useSearchBoxState","_ref$defaultSearchTex","setSearchText","searchTextValueRef","useSearchBoxState","_useSortByState","setSortBy","sortingOptions","safeSetSortBy","newVal","allSortByOptions","values","safeNewValue","onSortByChange","_evt","sortby","useSortByState","_useDateAddedState","ianaTimeZone","dateAddedFilter","setDateAddedFilter","dateAddedFilterCustomDateRange","setDateAddedFilterCustomDateRange","dateAddedChoiceOptions","onDateAddedFilterChange","tf","cdr","useDateAddedState","_useAssetSourcesState","_ref$disabledAssetSou","disabledAssetSources","setAssetSources","assetSourceOptions","onAssetSourceFilterChange","newAssetSources","useAssetSourcesState","_useImportSourceState","setImportSource","importSourceOptions","onImportSourceFilterChange","newImportSource","useImportSourceState","_useImageSizeState","minWidthFilter","setMinWidthFilter","minHeightFilter","setMinHeightFilter","onImageSizeFilterChange","useImageSizeState","_useVideoDurationStat","_ref$defaultMinVideoD","_ref$defaultMaxVideoD","setMinDurationFilter","setMaxDurationFilter","onVideoDurationFilterChange","useVideoDurationState","isDateAddedFilterActive","isImportSourceFilterActive","isAssetSourceFilterActive","isAdditionalFilterActive","getFilters","useFilterBarStyles","filterBar","rowGap","remaining","useBaseAdditionalFilterBarStyles","colorNeutralForeground2","fontWeightSemibold","useAdditionalFilterBarStyles","hide","filterText","AdditionalFilterBar","baseClasses","filterId","setForceClear","VideosFilterBar","_useFilterBarState","FluentProvider","webLightTheme","ImagesFilterBar","_useFilterBarState2","LibraryFilterBar","_useFilterBarState3","assetTypeToggleButtons","SearchResultFilterBar","_useFilterBarState4","FilterContextProvider","withFilterContext","ImportSourceFilterComponent","onValueChange","dropdownOptions","newHumanizedVaue","newHumanizedValue","AssetSourceFilterComponent","ImageSizeFilterComponent","onImageSizeChange","AL_DATE_ADDED_FILTER_DEFAULT_RANGE","getDefaultDateRange","DateAddedFilterComponent","_ref14$dateAddedFilte","PerformanceSearchTextFilterComponent","getPerformanceFilterComponents","useBreadcrumbStyles","breadcrumbContainer","FolderPathBreadcrumb","visibleForRootFolder","useAdsStudioLibraryPageContentStyle","HiddenDivForAnnounce","DEFAULT_GRID_CONFIG","toAnnounce","announce","setAnnounce","clip","overlaySpinnerStyles","FOLDER_GRID_CONFIG","AdsStudioLibraryPageContentInternal","renderHeader","renderGridCell","adsStudioUserPreferences","dataLoaded","displayFolderPath","reloadingFolders","renderToolbar","renderEmptyView","sectionSelectedItems","isAssetLibraryAIGCMVPEnabled","preDefinedAssetSources","navigation","gridScrollContainer","isXandrIntEnabled","XandrIntegrationEnabled","useJsData","jsData","Account","announcedText","setAnnouncedText","_useMemo","searchBoxText","openSystemUploadRef","gotoUploadFilesPanelPage","openSystemUpload","onStockButtonClick","gotoStockImagePanelPage","onInvestButtonClick","gotoInvestImagePanelPage","onWebsiteButtonClick","gotoWebsiteImagePanelPage","gotoUploadFolderPanelPage","gotoMixedVideoPanelPage","gotoAddVideoPanelPage","gotoMixedImagePanelPage","loadedAssetList","others","cell","isPageInited","setPageInited","loadingData","setLoadingData","loadDataAsync","o","libraryPageLoadDataPerfMarker","usePreDefinedAssetSources","bulkTookbar","onFolderPathClicked","onRenderHeader","gotoAIGenerationPanelPage","foldersGridSection","assetsGridSection","AssetLibraryCopilot","willFetchData","willRender","isPageLoading","hadNoData","isSectionDataEmptyStatus","injectedContentContainer","emptyViewContainer","assetLibraryUserPreferences","assetLibraryAccountPreferences","AdsStudioLibraryPageContent","dialog","wordBreak","ConfirmDialog","isDisplayed","errorText","confirmString","cancelString","onClickConfirm","onClickCancel","isUiBlocked","warningMsg","DismissIcon","Dialog","DialogSurface","DialogBody","DialogTitle","DialogContent","DialogActions","GenerateImageContext","GenerateImageContextProvider","generateImageExample","setGenerateImageExample","withGenerateImageContext","useLoadingViewStyles","backgroundRepeat","animation","backgroundPosition","LoadingIndicator","loadingViewStyles","ExamplePromptList","backgroundImageUrl","ExampleImageListWithoutStyle","MultiLineEllipsisText","ExampleImageCell","labelId","promptList","wrappedOnSelectImage","exampleImageList","template","ExampleImageCellWithoutStyle","exampleImageCell","MAX_PROMPT_LENGTH","PromptEditor","setPrompt","disabledText","disabledButton","onKeyDownInTextArea","onClickGenerateButton","textAreaId","Textarea","SendRegular","ObjectSelectionImageView","originalImageUrl","originalImageHeight","originalImageWidth","getMaskValueAtPoint","updateHighlightedImage","isFetchingSegmentations","toggleSelectedMask","workingSelectedImageSrc","highlightedImageSrc","maskValues","imageContainer","maskIndex","setMaskIndex","windowToImgPosition","imageBox","targetWidth","targetHeight","wr","hr","leftToImage","topToImage","mousemoveHandler","_windowToImgPosition","clientY","mouseleaveHandler","mousedownHandler","_windowToImgPosition2","keyHandler","shiftKey","resetMaskHandler","useUploadAsset","videoUploadPerfMarker","isUploadImageUpscaleEnabled","uploadFileAsync","uploadCallback","commonOptions","useReadAsset","readFileAsync","readFileAsDataURLAsync","useValidateAsset","isImageUpscaledRef","validateImageAsync","validateImageAsyncInternal","imageSource","minimumHeight","minimumWidth","getImageDetailAsync","naturalWidth","naturalHeight","validateFileAsync","validateVideoAsync","checkExtension","supportedList","extToCheck","contains","useCustomizedHandlerOptions","getCustomizedHandlerOptions","supportedVideoExtensions","linkButton","useUploadFiles","onFilesAddedCallback","setErrors","previewArr","setPreviewArr","onFileRead","selectedFiles","callback","isMultipleFiles","customizedOptions","_parseFileName","passedOptions","fileObj","fileSources","fileAdditionalInfoArr","fileSource","sourcesForPreview","generatePreviewArray","setProgress","progress","prevArr","updateFilePreviewArrayUploadProgress","uploadBatchs","each","updateProgress","uploadProgressBoundary","uploadResult","errorMsg","assetIds","upscaledImagesArrCount","showInfo","fileCount","genericErrorMsg","newErrors","getImageValidationErrorMessage","isReachFileSizeLimit","limitMB","fileSizeMB","MaximumImageFileSizeMB","MaximumVideoFileSizeMB","getReachFileSizeLimitErrorMessage","maximumImageFileSize","maximumVideoFileSize","ccJSData","jsDataCcRest","withCcJsDataContextProvider","withServerContext","_initCcJsData","serverContext","cidFetcher","CurrentCustomer","uidFetcher","CurrentUser","appendErrorSummary","handleAjaxAuthFailure","willSupportCors","GetJsDataInfo","ServicesEndpoints","ClientCenterUIAPI","initCcJsData","CcJsDataContextProvider","initialJsData"],"sourceRoot":""}