{"version":3,"file":"js/explore.js","mappings":"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","sources":["webpack://sbs.vison/./Scripts/ts/App/Areas/Shares/VoTileProject.vue?95f7","webpack://sbs.vison/./Scripts/ts/App/Areas/Shares/VoTileProject.vue.ts","webpack://sbs.vison/./Scripts/ts/App/Areas/Shares/VoTileProject.vue.ts?4dd3","webpack://sbs.vison/./Scripts/ts/App/Areas/Shares/VoTileProject.vue","webpack://sbs.vison/./Scripts/ts/App/Areas/Explore/DetailsExplore.vue.ts","webpack://sbs.vison/./Scripts/ts/App/Areas/Explore/IndexPage.vue.ts","webpack://sbs.vison/./Scripts/ts/App/constants.ts"],"sourcesContent":["import { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardSubtitle } from 'vuetify/lib/components/VCard';\nimport { VCardText } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VChip } from 'vuetify/lib/components/VChip';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\n\nvar render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(VCard,{attrs:{\"href\":_vm._uriService.getAbsoluteUri(((_vm._appContext.codeCulture) + \"/explore/watch/?pId=\" + (_vm.project.id))),\"hover\":\"\",\"tile\":\"\"}},[_c(VImg,{attrs:{\"aspect-ratio\":\"1.778\",\"max-height\":\"264px\",\"lazy-src\":_vm._uriService.getAbsoluteUri(((_vm._appContext.codeCulture) + \"/asset/preview/00000000-0000-0000-0000-000000000000\")),\"src\":_vm._uriService.getAbsoluteUri(_vm.project.thumbnailUrl)}},[(_vm.project.tags.indexOf('360°') >= 0)?_c(VChip,{staticClass:\"ma-2\",attrs:{\"label\":\"\",\"small\":\"\"}},[_c(VIcon,{attrs:{\"small\":\"\",\"left\":\"\"}},[_vm._v(\"fa-solid fa-street-view\")]),_vm._v(\"360° \")],1):(_vm.project.tags.indexOf('video') >= 0)?_c(VChip,{staticClass:\"ma-2\",attrs:{\"label\":\"\",\"small\":\"\"}},[_c(VIcon,{attrs:{\"small\":\"\",\"left\":\"\"}},[_vm._v(\"fa-solid fa-circle-play\")]),_vm._v(\"Video \")],1):_vm._e()],1),_c(VCardTitle,[_vm._v(_vm._s(_vm.project.name))]),_c(VCardSubtitle,[_vm._v(_vm._s(_vm.localizer((_vm.baseTranslationPath + \".By\")))+\" \"),_c('a',{attrs:{\"href\":_vm._uriService.getAbsoluteUri(((_vm._appContext.codeCulture) + \"/profile/public/index/\" + (_vm.project.author.id)))}},[_vm._v(_vm._s(_vm.project.author.name))])]),(!_vm.minimized)?_c(VCardText,[_c(VRow,{attrs:{\"no-gutters\":\"\"}},[_c(VTooltip,{attrs:{\"top\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('span',_vm._g({},on),[_c(VIcon,{attrs:{\"x-small\":\"\",\"left\":\"\"}},[_vm._v(\"fa-solid fa-clock\")]),_vm._v(\" \"+_vm._s(_vm._localizerService.localizeDate(_vm.project.publicationTimeUtc).fromNow())+\" \")],1)]}}],null,false,733317739)},[_c('span',[_vm._v(_vm._s(_vm._localizerService.localizeDate(_vm.project.publicationTimeUtc).format('LLLL')))])]),_c(VSpacer),_c(VIcon,{staticClass:\"ml-2\",attrs:{\"x-small\":\"\",\"left\":\"\"}},[_vm._v(\"fa-solid fa-eye\")]),_vm._v(_vm._s(_vm.project.views)+\" \"),_c(VIcon,{staticClass:\"ml-2\",attrs:{\"x-small\":\"\",\"left\":\"\"}},[_vm._v(\"fa-solid fa-heart\")]),_vm._v(_vm._s(_vm.project.rating)+\" \")],1)],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { AppContext } from 'Api/AppContext';\r\nimport { Project } from 'Api/ExploreService';\r\nimport { LocalizerService } from 'Api/LocalizerService';\r\nimport { injectTypes } from 'App/injectTypes';\r\nimport { lazyInject } from 'App/Inversify.config';\r\nimport { IVisonUriService } from 'App/Services/UriServices/Core';\r\nimport { Component, Prop, Vue } from 'vue-property-decorator';\r\n\r\n@Component({\r\n name: 'vo-tile-project'\r\n})\r\nexport default class VoTileProject extends Vue {\r\n @Prop({ type: Object, default: null })\r\n public project: Project;\r\n @Prop()\r\n public minimized: boolean;\r\n\r\n public baseTranslationPath: string = 'Areas.Shared.TileProject';\r\n\r\n @lazyInject(AppContext)\r\n private readonly _appContext: AppContext;\r\n @lazyInject(injectTypes.IVisonUriService)\r\n private readonly _uriService: IVisonUriService;\r\n @lazyInject(LocalizerService)\r\n private readonly _localizerService: LocalizerService;\r\n}\r\n","import mod from \"-!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!./VoTileProject.vue.ts?vue&type=script&lang=ts&\"; export default mod; export * from \"-!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/ts-loader/index.js??clonedRuleSet-41.use[2]!./VoTileProject.vue.ts?vue&type=script&lang=ts&\"","import { render, staticRenderFns } from \"./VoTileProject.vue?vue&type=template&id=a09bd58e&\"\nimport script from \"./VoTileProject.vue.ts?vue&type=script&lang=ts&\"\nexport * from \"./VoTileProject.vue.ts?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { IDownloadStandaloneOption } from 'Api/Contracts/Dtos';\r\nimport { Guid } from 'Api/Dto/Drive';\r\nimport { ApiException, IError } from 'Api/Dto/QueryResult';\r\nimport { ProjectPermissions } from 'Api/Enums/Permissions';\r\nimport { SocialNetworks } from 'Api/Enums/SocialNetworks';\r\nimport { ViewerStateType } from 'Api/Enums/ViewerStateType';\r\nimport { ExploreService, IComment, Project } from 'Api/ExploreService';\r\nimport { Routes } from 'Api/Routes';\r\nimport { ProjectService } from 'Api/Services';\r\nimport { BasePage, Component, Prop, Watch } from 'App/Areas/BasePage';\r\nimport 'App/Areas/Explore/DetailsExplore.vue.ts.scss';\r\nimport { IPlayerContext } from 'App/Areas/Shares/IPlayerContext';\r\nimport VoPlayer from 'App/Areas/Shares/VoPlayer.vue';\r\nimport { injectTypes } from 'App/injectTypes';\r\nimport { lazyInject } from 'App/Inversify.config';\r\nimport { TokenValidator, TokenValidatorFactory } from 'App/Services/TokenValidator';\r\nimport { EnumHelper } from 'Framework/Helpers/EnumHelper';\r\nimport { String } from 'typescript-string-operations';\r\nimport VueMarkdown from 'vue-markdown';\r\nimport { Ref } from 'vue-property-decorator';\r\nimport { VOverlay } from 'vuetify/lib';\r\n\r\ninterface IExploreState {\r\n pId: number;\r\n token?: string;\r\n}\r\n\r\n@Component({ components: { VoPlayer, VueMarkdown, VOverlay } })\r\nexport default class ExploreDetailsPage extends BasePage {\r\n public created(): void {\r\n this.baseTranslationPath = 'Areas.Explore.Views.Home.Detail';\r\n this._resizeObserver = new ResizeObserver(this.$debounce(this._onPlayerSizeChanged, 500));\r\n\r\n this.availableSocialNetworks = EnumHelper\r\n .extractFlags(SocialNetworks, this.appContext.settings.general.availableSocialNetworks);\r\n }\r\n\r\n public mounted(): void {\r\n this._resizeObserver.observe(this.playerContainer);\r\n\r\n document.addEventListener('keydown', ev => { this._onKeyDown(ev); });\r\n document.addEventListener('fullscreenchange', ev => this._exitFullscreenHandler(ev), false);\r\n\r\n this.currentState = {\r\n pId: Number.parseInt(this.getUrlParameter('pId')),\r\n token: this.getUrlParameter('token')\r\n };\r\n\r\n let mode: ViewerStateType = this.appContext.settings.explore.defaultViewerState;\r\n\r\n if (this.isMobileOrTabletDevice) {\r\n mode = ViewerStateType.Normal;\r\n }\r\n else {\r\n let urlDisplayMode = this.getUrlParameter('mode');\r\n\r\n if (urlDisplayMode) {\r\n let urlStateValue = ViewerStateType[urlDisplayMode];\r\n\r\n if (urlStateValue) {\r\n mode = urlStateValue;\r\n }\r\n }\r\n }\r\n\r\n this.displayMode = mode;\r\n }\r\n\r\n public async rateProjectAsync(value: number): Promise {\r\n try {\r\n await this._exploreService.rateProjectAsync(this.project.id, value);\r\n }\r\n catch {\r\n //TODO Intercept error\r\n }\r\n }\r\n\r\n public async sendCommentAsync(): Promise {\r\n this.isBusy = true;\r\n try {\r\n let commentToSave = this.comment;\r\n this.comment = null;\r\n\r\n if (commentToSave && commentToSave.length > 0) {\r\n let commentAdded = await this._exploreService.addCommentAsync(this.project.id, commentToSave);\r\n\r\n this.projectComments.push(commentAdded);\r\n }\r\n }\r\n catch {\r\n //TODO ERROR\r\n }\r\n finally {\r\n this.isBusy = false;\r\n }\r\n }\r\n\r\n public onFocusIn(): void {\r\n if (!this.appContext.user.isSignedIn) {\r\n window.location.assign(`/${this.appContext.codeCulture}/account/login?returnUrl=${window.location.pathname}${window.location.search}`);\r\n }\r\n }\r\n\r\n public getLinkForSocialNetwork(socialNetwork: SocialNetworks): string {\r\n let link = encodeURIComponent(this.projectLink);\r\n\r\n switch (socialNetwork) {\r\n case SocialNetworks.Facebook: {\r\n return 'https://www.facebook.com/sharer.php?u=' + link;\r\n }\r\n case SocialNetworks.Twitter: {\r\n return 'https://twitter.com/share?url=' + link;\r\n }\r\n case SocialNetworks.Linkedin: {\r\n return 'https://www.linkedin.com/shareArticle?mini=true&url=' + link;\r\n }\r\n case SocialNetworks.Mail: {\r\n return 'mailto:?subject=' + this.project.name + '&body=' + link;\r\n }\r\n }\r\n }\r\n\r\n public getIconForSocialNetwork(socialNetwork: SocialNetworks): string {\r\n switch (socialNetwork) {\r\n case SocialNetworks.Facebook: {\r\n return 'fa-brands fa-facebook';\r\n }\r\n case SocialNetworks.Twitter: {\r\n return 'fa-brands fa-twitter';\r\n }\r\n case SocialNetworks.Linkedin: {\r\n return 'fa-brands fa-linkedin-in';\r\n }\r\n case SocialNetworks.Mail: {\r\n return 'fa-regular fa-envelope';\r\n }\r\n }\r\n }\r\n\r\n public getColorForSocialNetwork(socialNetwork: SocialNetworks): string {\r\n switch (socialNetwork) {\r\n case SocialNetworks.Facebook: {\r\n return '#1877F2';\r\n }\r\n case SocialNetworks.Twitter: {\r\n return '#1DA1F2';\r\n }\r\n case SocialNetworks.Linkedin: {\r\n return '#2867B2';\r\n }\r\n case SocialNetworks.Mail: {\r\n return '';\r\n }\r\n }\r\n }\r\n\r\n public getTranslationKeyForSocialNetwork(socialNetwork: SocialNetworks): string {\r\n switch (socialNetwork) {\r\n case SocialNetworks.Facebook: {\r\n return 'Facebook';\r\n }\r\n case SocialNetworks.Twitter: {\r\n return 'Twitter';\r\n }\r\n case SocialNetworks.Linkedin: {\r\n return 'LinkedIn';\r\n }\r\n case SocialNetworks.Mail: {\r\n return 'Email';\r\n }\r\n }\r\n }\r\n\r\n private async _copyLinkAsync(): Promise {\r\n await navigator.clipboard.writeText(this.projectLink);\r\n this.isCopied = true;\r\n }\r\n\r\n @Watch('currentState')\r\n @Watch('codeCulture')\r\n private async _onCurrentStateChangedAsync(): Promise {\r\n if (this.currentState) {\r\n this._tokenValidator = this._tokenValidatorFactory(this.currentState.token);\r\n this.project = await this._loadProjectAsync();\r\n\r\n if (this.project) {\r\n const projectId = this.project.id;\r\n\r\n const _ = Promise.allSettled([\r\n this._loadProjectCommentsAsync(projectId),\r\n this._loadRelatedProjectAsync(projectId),\r\n this._updateProjectCountAsync(projectId)\r\n ]);\r\n }\r\n }\r\n }\r\n\r\n private async _loadProjectAsync(): Promise {\r\n try {\r\n this.isProjectLoading = true;\r\n this.loadProjectError = null;\r\n\r\n let p = await this._tokenValidator.executeAsync(token =>\r\n this._exploreService.loadProjectAsync(this.currentState.pId, token, '')\r\n );\r\n\r\n document.title = p.name;\r\n\r\n if (window.history.state == null || window.history.state.pId != p.id) {\r\n let url = new URL(location.href);\r\n //Ensure old syntax compatibility\r\n url.searchParams.delete('pid');\r\n url.searchParams.set('pId', `${p.id}`);\r\n\r\n if (this.currentState.token) {\r\n url.searchParams.set('token', this.currentState.token);\r\n }\r\n\r\n window.history.pushState({ pId: p.id, token: this.currentState.token }, p.name, url.href);\r\n }\r\n\r\n return p;\r\n }\r\n catch (e) {\r\n if(!(e instanceof ApiException)) {\r\n throw e;\r\n }\r\n\r\n this.loadProjectError = e.error\r\n }\r\n finally {\r\n this.isProjectLoading = false;\r\n }\r\n }\r\n\r\n private async _updateProjectCountAsync(idProject: number): Promise {\r\n try {\r\n await this._exploreService.addViewProjectAsync(idProject);\r\n }\r\n catch {\r\n //TODO Intercept error\r\n }\r\n }\r\n\r\n private async _loadRelatedProjectAsync(idProject: number): Promise {\r\n try {\r\n this.isRelatedProjectLoading = true;\r\n this.relatedProjects = await this._exploreService.getRelatedProjectAsync(idProject);\r\n }\r\n catch {\r\n this.relatedProjects = [];\r\n //TODO Intercept error\r\n }\r\n finally {\r\n this.isRelatedProjectLoading = false;\r\n }\r\n }\r\n\r\n private async _loadProjectCommentsAsync(idProject: number): Promise {\r\n try {\r\n this.isCommentLoading = true;\r\n let comments = await this._exploreService.getCommentsAsync(idProject);\r\n\r\n this.projectComments = comments;\r\n }\r\n catch {\r\n this.projectComments = [];\r\n //TODO Intercept error\r\n }\r\n finally {\r\n this.isCommentLoading = false;\r\n }\r\n }\r\n\r\n private _onKeyDown(evt: KeyboardEvent): void {\r\n let isEscape = false;\r\n\r\n if ('key' in evt) {\r\n isEscape = (evt.key == 'Escape' || evt.key == 'Esc');\r\n }\r\n\r\n if (isEscape && !this.isStateLocked) {\r\n this.displayMode = ViewerStateType.Normal;\r\n }\r\n }\r\n\r\n private _exitFullscreenHandler(e: Event): void {\r\n let isInFullscreen = document.fullscreenElement !== null;\r\n\r\n if (!isInFullscreen && !this.isStateLocked) {\r\n this.displayMode = ViewerStateType.Normal;\r\n }\r\n }\r\n\r\n private _onPlayerSizeChanged(e: Array) {\r\n const [resizeObserverEntry] = e;\r\n\r\n const { width, height } = resizeObserverEntry.contentRect;\r\n\r\n document.body.style.setProperty('--player-container-width', `${width}px`);\r\n document.body.style.setProperty('--player-container-height', `${height}px`);\r\n }\r\n\r\n private async _onDownloadStandaloneAsync(): Promise {\r\n const location = await this._projectService.getStandaloneEndpointUriAsync(\r\n String.Format(\r\n Routes.Api.Projects.Standalone,\r\n this.project.id\r\n ),\r\n this.downloadStandaloneOptions\r\n );\r\n\r\n const link = document.createElement('a');\r\n link.href = location;\r\n link.click();\r\n\r\n this.isDownloadDialogOpened = false;\r\n }\r\n\r\n @Watch('displayMode')\r\n private async _onDisplayModePropertyChangedAsync(value: ViewerStateType, oldValue: ViewerStateType): Promise {\r\n await this.$nextTick();\r\n\r\n let viewerState = ViewerStateType[value] || ViewerStateType[ViewerStateType.normal];\r\n value = ViewerStateType[viewerState];\r\n\r\n this.isFullScreen = false;\r\n\r\n const player = this.playerComponent.$el as HTMLElement;\r\n\r\n this._resizeObserver.disconnect();\r\n\r\n if (value == ViewerStateType.Normal) {\r\n this.playerContainer.insertAdjacentElement('afterbegin', player);\r\n this._resizeObserver.observe(this.playerContainer);\r\n }\r\n else {\r\n this.playerTheaterContainer.insertAdjacentElement('afterbegin', player);\r\n this._resizeObserver.observe(this.playerTheaterContainer);\r\n }\r\n\r\n if (value == ViewerStateType.FullPage || value == ViewerStateType.FullScreen) {\r\n this._previousHamburgerStatus = this.drawer;\r\n this.drawer = false;\r\n\r\n player.scrollIntoView({ block: 'start', inline: 'start' });\r\n\r\n if (value == ViewerStateType.FullScreen) {\r\n this.isFullScreen = true;\r\n\r\n try {\r\n if (document.body.requestFullscreen) {\r\n await document.body.requestFullscreen();\r\n }\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n else if (this._previousHamburgerStatus) {\r\n this.drawer = this._previousHamburgerStatus;\r\n this._previousHamburgerStatus = null;\r\n }\r\n }\r\n\r\n public get canDownloadStandalone(): boolean {\r\n return EnumHelper.hasFlag(this.appContext.user.permissions.project, ProjectPermissions.Standalone);\r\n }\r\n\r\n public get isMobileOrTabletDevice(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n }\r\n\r\n public get isWideOrFullPage(): boolean {\r\n return this.displayMode == ViewerStateType.Wide\r\n || this.displayMode == ViewerStateType.FullPage;\r\n }\r\n\r\n public get playerContext(): IPlayerContext {\r\n if (this.playerComponent) {\r\n return this.playerComponent._dataContext;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public get hasOrientation(): boolean {\r\n return this.playerContext?.currentOrientation !== null;\r\n }\r\n\r\n public get isRelatedProjectPanelDisplayed() {\r\n return this.isRelatedProjectLoading || this.relatedProjects.length > 0\r\n }\r\n\r\n public get sendReportErrorLink() {\r\n return `mailto:support@sbs-interactive.fr?subject=${encodeURI('Report Vison Error')}&body=${encodeURI(this.loadProjectError.toString().substring(0, 1500))}`;\r\n }\r\n\r\n public get allowCommenting(): boolean {\r\n return EnumHelper.hasFlag(this.appContext.user.permissions.project, ProjectPermissions.Comment);\r\n }\r\n\r\n public get allowRating(): boolean {\r\n let currentUserId = this.appContext.user.id;\r\n\r\n return currentUserId > 0\r\n && this.project\r\n && this.project.author.id != currentUserId;\r\n }\r\n\r\n public get canAddComment(): boolean {\r\n return !this.isBusy\r\n && this.comment\r\n && this.comment != '';\r\n }\r\n\r\n public get projectLink(): string {\r\n let uri = this.isEmbeded\r\n ? `/${this.appContext.codeCulture}/embed/?pId=${this.project.id}`\r\n : `/${this.appContext.codeCulture}/explore/watch/?pId=${this.project.id}`;\r\n\r\n if (this.currentState.token) {\r\n uri += `&token=${encodeURIComponent(this.currentState.token)}`;\r\n }\r\n\r\n if (this.includeLocation) {\r\n uri += `#startPanorama=${this.playerContext.currentPanorama.assetItemId}`;\r\n\r\n if (this.includeOrientation) {\r\n uri += `&startOrientation=${encodeURIComponent(JSON.stringify(this.playerContext.currentOrientation))}`;\r\n }\r\n }\r\n\r\n return this.uriService.getAbsoluteUri(uri);\r\n }\r\n\r\n @Prop({ type: Boolean, required: false, default: false })\r\n public isStateLocked: boolean;\r\n\r\n @Ref('player')\r\n public playerComponent: VoPlayer;\r\n\r\n @Ref('player-container')\r\n public playerContainer: HTMLElement;\r\n\r\n @Ref('player-theater-container')\r\n public playerTheaterContainer: HTMLElement;\r\n\r\n public project: Project = null;\r\n\r\n public relatedProjects: Array = [];\r\n public projectComments: Array = [];\r\n public availableSocialNetworks: Array = [];\r\n\r\n public currentState: IExploreState = { pId: null, token: null };\r\n public displayMode: ViewerStateType = ViewerStateType.Normal;\r\n\r\n public isShareDialogOpened: boolean = false;\r\n public isDownloadDialogOpened: boolean = false;\r\n\r\n public isEmbeded: boolean = false;\r\n public includeLocation: boolean = false;\r\n public includeOrientation: boolean = false;\r\n public isCopied: boolean = false;\r\n\r\n public comment: string = null;\r\n public isBusy: boolean = false;\r\n\r\n public isProjectLoading: boolean = true;\r\n public isRelatedProjectLoading: boolean = true;\r\n public isCommentLoading: boolean = true;\r\n\r\n public loadProjectError: IError = null;\r\n\r\n public downloadStandaloneOptions: IDownloadStandaloneOption = { includeAssetFiles: true };\r\n\r\n public Guid: any = Guid;\r\n public ViewerStateType: any = ViewerStateType;\r\n\r\n private _previousHamburgerStatus?: boolean = null;\r\n private _resizeObserver: ResizeObserver;\r\n private _tokenValidator: TokenValidator;\r\n\r\n @lazyInject(ExploreService)\r\n private readonly _exploreService: ExploreService;\r\n\r\n @lazyInject(ProjectService)\r\n private readonly _projectService: ProjectService;\r\n\r\n @lazyInject(injectTypes.TokenValidatorFactory)\r\n private readonly _tokenValidatorFactory: TokenValidatorFactory;\r\n}\r\n\r\n","import { AppContext } from 'Api/AppContext';\r\nimport { ExploreService, Project } from 'Api/ExploreService';\r\nimport { IMapProvider } from 'Api/MapService';\r\nimport { BasePage, Component, Prop, Watch } from 'App/Areas/BasePage';\r\nimport { MapProviderFactory } from 'App/Areas/Shares/MapProviderFactory';\r\nimport VoTileProject from 'App/Areas/Shares/VoTileProject.vue';\r\nimport { Explore } from 'App/constants';\r\nimport { lazyInject } from 'App/Inversify.config';\r\nimport { ValidationRule } from 'App/Mixins/ValidationRuleMixin';\r\nimport { LatLngBounds } from 'leaflet';\r\nimport { String } from 'typescript-string-operations';\r\nimport { Intersect } from 'vuetify/lib/directives';\r\n\r\n@Component({\r\n components: {\r\n VoTileProject\r\n },\r\n directives: {\r\n Intersect\r\n }\r\n})\r\nexport default class IndexPage extends BasePage {\r\n public created(): void {\r\n this.baseViewTranslationPath = 'Areas.Explore.Views.Home';\r\n\r\n this.selectedProjectType = window.localStorage[Explore.IndexSearchProjectType] ?? this.selectedProjectType;\r\n this.selectedSortBy = window.localStorage[Explore.IndexSearchSortBy] ?? this.selectedSortBy;\r\n }\r\n\r\n public async mounted(): Promise {\r\n this.mapProvider = MapProviderFactory.getProvider(\r\n this._appContext.settings.mapProvider.mapProviderType,\r\n {\r\n ...this._appContext.settings.mapProvider.value,\r\n uriConverter: (uri) => this.uriService.getAbsoluteUri(`${this._appContext.codeCulture}/${uri}`)\r\n }\r\n );\r\n this.isMapVisible = this.appContext.settings.explore.isMapVisible;\r\n\r\n await this.fetchDataAsync();\r\n }\r\n\r\n public async onLoaderIntersectsAsync(entries: Array, observer: IntersectionObserver, isIntersecting: boolean): Promise {\r\n if (isIntersecting && this.hasMorePagesToLoad) {\r\n if (this.isSearchMode) {\r\n await this.searchNextPageAsync();\r\n }\r\n else {\r\n await this.fetchDataAsync(this.currentPage + 1);\r\n }\r\n }\r\n }\r\n\r\n public async fetchDataAsync(page: number = 1): Promise {\r\n if (this._isFetching) {\r\n return;\r\n }\r\n\r\n this.isSearchMode = false;\r\n this._isFetching = true;\r\n\r\n try {\r\n let searchResults = await this._exploreService.getPublishedProjectsAsync(\r\n page,\r\n 25,\r\n this.selectedSortBy,\r\n this.selectedProjectType\r\n );\r\n\r\n this.currentPage = page;\r\n\r\n if (page == 1) {\r\n this.searchResults = searchResults.items;\r\n this.totalItems = searchResults.totalCount;\r\n this.totalPages = searchResults.totalPages;\r\n }\r\n else {\r\n this.searchResults.push(...searchResults.items);\r\n }\r\n }\r\n finally {\r\n this._isFetching = false;\r\n }\r\n }\r\n\r\n public async searchAsync(): Promise {\r\n if (String.IsNullOrWhiteSpace(this.searchText)) {\r\n await this.clearSearchAsync();\r\n return;\r\n }\r\n\r\n if (this._isFetching) {\r\n return;\r\n }\r\n\r\n this._isFetching = true;\r\n this.isSearching = true;\r\n try {\r\n const result = await this._exploreService.searchAsync(this.searchText, this.selectedProjectType, 25);\r\n\r\n this.searchResults = result.found;\r\n this.nextSearchPageLink = result.nextLink;\r\n this.isSearchMode = true;\r\n }\r\n finally {\r\n this.isSearching = false;\r\n this._isFetching = false;\r\n }\r\n }\r\n\r\n public async searchNextPageAsync(): Promise {\r\n if (this._isFetching) {\r\n return;\r\n }\r\n\r\n this._isFetching = true;\r\n try {\r\n const result = await this._exploreService.searchNextPageAsync(this.nextSearchPageLink);\r\n this.searchResults.push(...result.found);\r\n this.nextSearchPageLink = result.nextLink;\r\n }\r\n finally {\r\n this._isFetching = false;\r\n }\r\n }\r\n\r\n public async clearSearchAsync(): Promise {\r\n await this.fetchDataAsync();\r\n }\r\n\r\n @Watch('selectedProjectType')\r\n @Watch('selectedSortBy')\r\n private async _onFilterChangeAsync(): Promise {\r\n window.localStorage[Explore.IndexSearchProjectType] = this.selectedProjectType;\r\n window.localStorage[Explore.IndexSearchSortBy] = this.selectedSortBy;\r\n\r\n await this.fetchDataAsync();\r\n }\r\n\r\n public get resultsCountString(): string {\r\n if (this.isSearchMode) {\r\n return this.hasMorePagesToLoad\r\n ? this.searchResults.length.toString() + '+'\r\n : this.searchResults.length.toString();\r\n }\r\n\r\n return this.totalItems.toString();\r\n }\r\n\r\n public get hasMorePagesToLoad() {\r\n return this.isSearchMode\r\n ? this.nextSearchPageLink != null\r\n : this.currentPage < this.totalPages;\r\n }\r\n\r\n public get searchInputValidations(): Array {\r\n const forbiddenCharacters: Array = ['*', '?'];\r\n\r\n return [\r\n (input: string) => !input\r\n || !forbiddenCharacters.some(c => input.startsWith(c))\r\n || this.localizer(`${this.baseViewTranslationPath}.SearchQueryRule`, input),\r\n ];\r\n }\r\n\r\n public searchText: string = null;\r\n public searchResults: Array = [];\r\n public totalItems: number = 0;\r\n\r\n public currentPage: number = 1;\r\n public totalPages: number = 0;\r\n\r\n public isMapVisible: boolean = false;\r\n\r\n public isFiltersVisible: boolean = false;\r\n\r\n public selectedProjectType: string = 'all';\r\n\r\n public selectedSortBy: any = 'popular';\r\n\r\n public isSearching: boolean = false;\r\n public isSearchMode: boolean = false;\r\n\r\n public mapProvider: IMapProvider = null;\r\n\r\n private _isFetching: boolean = false;\r\n public nextSearchPageLink: string = null;\r\n\r\n @lazyInject(ExploreService)\r\n private readonly _exploreService: ExploreService;\r\n\r\n @lazyInject(AppContext)\r\n private readonly _appContext: AppContext;\r\n\r\n //--------------------------------------------------------------------------\r\n // /!\\ Old codes not refactored---------------------------------------------\r\n //--------------------------------------------------------------------------\r\n\r\n @Prop({ type: Number, default: 1 })\r\n public exploreDisplayType: number;\r\n\r\n public searchProvider: any = null;\r\n\r\n public position: LatLngBounds = null;\r\n public currentBounds: LatLngBounds = null;\r\n}\r\n","export const Explore = {\r\n IndexSearchProjectType: 'IndexSearchProjectType',\r\n IndexSearchSortBy: 'IndexSearchSortBy'\r\n};\r\n\r\nexport const Project = {\r\n EditProjectViewModel: Symbol('EditProjectViewModel'),\r\n WaypointGraphEditorEvents: {\r\n Select: 'waypoint-editor.select'\r\n },\r\n DragAssetType: 'sbs.vison.assetitem',\r\n EditorLayoutKey: 'Sbs.Vison.ProjectEditorLayout'\r\n};\r\n"],"names":["render","_vm","this","_h","$createElement","_c","_self","VCard","attrs","_uriService","getAbsoluteUri","_appContext","project","VImg","thumbnailUrl","tags","indexOf","VChip","staticClass","VIcon","_v","_e","_s","name","localizer","baseTranslationPath","author","minimized","VRow","VTooltip","scopedSlots","_u","key","fn","ref","on","_g","_localizerService","localizeDate","publicationTimeUtc","fromNow","format","VSpacer","views","rating","staticRenderFns","VoTileProject","Vue","__decorate","Prop","type","Object","default","lazyInject","AppContext","injectTypes","LocalizerService","Component","component","ExploreDetailsPage","BasePage","pId","token","ViewerStateType","includeAssetFiles","Guid","created","_resizeObserver","ResizeObserver","$debounce","_onPlayerSizeChanged","availableSocialNetworks","EnumHelper","SocialNetworks","appContext","settings","general","mounted","observe","playerContainer","document","addEventListener","ev","_onKeyDown","_exitFullscreenHandler","currentState","Number","parseInt","getUrlParameter","mode","explore","defaultViewerState","isMobileOrTabletDevice","urlDisplayMode","urlStateValue","displayMode","value","_exploreService","rateProjectAsync","id","isBusy","commentToSave","comment","length","commentAdded","addCommentAsync","projectComments","push","onFocusIn","user","isSignedIn","window","location","assign","codeCulture","pathname","search","getLinkForSocialNetwork","socialNetwork","link","encodeURIComponent","projectLink","getIconForSocialNetwork","getColorForSocialNetwork","getTranslationKeyForSocialNetwork","navigator","clipboard","writeText","isCopied","_tokenValidator","_tokenValidatorFactory","_loadProjectAsync","projectId","Promise","allSettled","_loadProjectCommentsAsync","_loadRelatedProjectAsync","_updateProjectCountAsync","isProjectLoading","loadProjectError","p","executeAsync","loadProjectAsync","title","history","state","url","URL","href","searchParams","delete","set","pushState","e","ApiException","error","idProject","addViewProjectAsync","isRelatedProjectLoading","relatedProjects","getRelatedProjectAsync","isCommentLoading","comments","getCommentsAsync","evt","isEscape","isStateLocked","isInFullscreen","fullscreenElement","resizeObserverEntry","width","height","contentRect","body","style","setProperty","_projectService","getStandaloneEndpointUriAsync","String","Routes","downloadStandaloneOptions","createElement","click","isDownloadDialogOpened","oldValue","$nextTick","viewerState","isFullScreen","player","playerComponent","$el","disconnect","insertAdjacentElement","playerTheaterContainer","_previousHamburgerStatus","drawer","scrollIntoView","block","inline","requestFullscreen","canDownloadStandalone","permissions","ProjectPermissions","test","userAgent","isWideOrFullPage","playerContext","_dataContext","hasOrientation","currentOrientation","isRelatedProjectPanelDisplayed","sendReportErrorLink","encodeURI","toString","substring","allowCommenting","allowRating","currentUserId","canAddComment","uri","isEmbeded","includeLocation","currentPanorama","assetItemId","includeOrientation","JSON","stringify","uriService","Watch","Boolean","required","Ref","ExploreService","ProjectService","components","VoPlayer","VueMarkdown","VOverlay","IndexPage","baseViewTranslationPath","selectedProjectType","localStorage","Explore","selectedSortBy","mapProvider","MapProviderFactory","mapProviderType","uriConverter","isMapVisible","fetchDataAsync","entries","observer","isIntersecting","hasMorePagesToLoad","isSearchMode","searchNextPageAsync","currentPage","page","_isFetching","searchResults","getPublishedProjectsAsync","items","totalItems","totalCount","totalPages","searchText","clearSearchAsync","isSearching","result","searchAsync","found","nextSearchPageLink","nextLink","resultsCountString","searchInputValidations","forbiddenCharacters","input","some","c","startsWith","directives","Intersect","IndexSearchProjectType","IndexSearchSortBy","Project","EditProjectViewModel","Symbol","WaypointGraphEditorEvents","Select","DragAssetType","EditorLayoutKey"],"sourceRoot":""}