{ "version": 3, "sources": ["../../../packages/apps/connect/web/src/stores/search-store.ts"], "sourcesContent": ["import { action, computed, observable, runInAction } from 'mobx';\nimport { computedFn } from 'mobx-utils';\n\nimport createContext from 'bz-utilities/hooks/context-v2';\n\nimport { GetAllowedPlaceholderServicesForCase } from 'caseflow/api.dtos';\n\nimport { client } from 'connect/core/client';\n\nimport {\n ConnectValidateAccessCodeRequest,\n ConnectValidateBusinessRouteRequest,\n OnlineClinicService,\n OnlineInitialRequest\n} from 'tm3-core/api.dtos';\nimport type {\n Lookup,\n OnlineLocationDto,\n OnlinePractitionerDto,\n OnlineSection,\n OnlineServiceCategory,\n PackageResponse\n} from 'tm3-core/api.dtos';\n\nexport enum SearchType {\n Initial,\n Appointment,\n Class\n}\n\nexport const [SearchStoreCtx, useSearchStore] = createContext('SearchStore');\n\nclass SearchStore {\n @observable loading = true;\n @observable placeHolderLoading = true;\n\n @observable loaded = false;\n @observable services = observable.array([]);\n @observable categories = observable.array([]);\n @observable sections = observable.array([]);\n @observable _packages = observable.array([]);\n @observable excludedPackages = observable.array([]);\n\n @observable practitioners = observable.array([]);\n @observable locations = observable.array([]);\n @observable lookups = observable.array([]);\n @observable _allowedPlaceholderServices = observable.array([]);\n @observable validPath = false;\n @observable pathError = 'Invalid Path';\n @observable mode = SearchType.Initial;\n @observable locationId: string | null = null;\n @observable isWaitingListFeatureOn: boolean = false;\n @observable isCaseflow: boolean = false;\n @observable accessCodePassed: boolean = false;\n @observable accessCodeLoading: boolean = false;\n @observable accessCodeFailed: boolean = false;\n @observable forceService?: OnlineClinicService = undefined; // Caseflow placeholder service selection\n @observable isMfaEnabled?: boolean;\n\n @observable baseService?: OnlineClinicService = undefined;\n\n loadingPromise!: Promise;\n\n private readonly isActiveClass = computedFn((s: OnlineClinicService): boolean => {\n if (!s.isClassService || s.isCourse) {\n return false;\n }\n\n return this.categories.some((c) => this.isCategoryOnline(c, s));\n });\n\n private readonly isCategoryOnline = computedFn(\n (c: OnlineServiceCategory, s: OnlineClinicService): boolean => {\n const orderedServices = c.orderedServices ?? [];\n const isOnline = orderedServices.some(\n (serviceId) => serviceId === s.id && c.isOnline && !c.hideFromExplore\n );\n\n if (isOnline) {\n return true;\n }\n\n // [Tomasz] - This recursively checks child categories\n return this.categories.some((cc) => this.isChildCategoryOnline(cc, c, s));\n }\n );\n\n private readonly isChildCategoryOnline = computedFn(\n (cc: OnlineServiceCategory, c: OnlineServiceCategory, s: OnlineClinicService): boolean => {\n return cc.id === c.parentId && this.isCategoryOnline(cc, s);\n }\n );\n\n @computed\n get packages(): PackageResponse[] {\n return this._packages.filter((x) => !this.excludedPackages.includes(x.onlineGuid ?? ''));\n }\n\n @computed\n get hasClasses(): boolean {\n return this.services.some((s) => this.isActiveClass(s));\n }\n\n @computed\n get hasAppointments(): boolean {\n return this.services.some((s) => {\n if (s.isClassService || s.isCourse) {\n return false;\n }\n\n return this.categories.some((c) => {\n const orderedServices = c.orderedServices ?? [];\n return orderedServices.some(\n (serviceId) => serviceId === s.id && c.isOnline && !c.parentId && !c.hideFromExplore\n );\n });\n });\n }\n\n @computed\n get allowedPlaceholderServices() {\n const { _allowedPlaceholderServices } = this;\n const { baseService } = this;\n return _allowedPlaceholderServices.map(\n (override) =>\n new OnlineClinicService({\n ...baseService,\n ...override\n })\n );\n }\n\n @action.bound\n async load(): Promise {\n this.loading = true;\n\n const res = await client.get(new OnlineInitialRequest());\n const serviceId = localStorage.getItem('accessCodeServiceId');\n const accessCode = localStorage.getItem('accessCode');\n\n runInAction(() => {\n const {\n categories,\n services,\n practitioners,\n locations,\n sections,\n packages,\n lookups,\n isWaitingListEnabled,\n isCaseflow,\n isMfaEnabled\n } = res!.result!;\n\n this.categories.replace(categories);\n this.services.replace(services);\n this.locations.replace(locations);\n this.practitioners.replace(practitioners);\n this.sections.replace(sections);\n this._packages.replace(packages);\n this.lookups.replace(lookups);\n this.isWaitingListFeatureOn = isWaitingListEnabled;\n this.isMfaEnabled = isMfaEnabled;\n this.isCaseflow = isCaseflow;\n if (serviceId && accessCode) {\n this.validateAccessCode(serviceId, accessCode);\n }\n this.loaded = true;\n this.loading = false;\n });\n }\n\n @action.bound\n trackPackagePurchase(packageId?: string): void {\n if (!packageId) {\n return;\n }\n\n let pkg = this._packages.find((x) => x.onlineGuid === packageId);\n\n if (!pkg) {\n return;\n }\n\n if (pkg.newCustomersOnly || pkg.onePerCustomer) {\n this.excludedPackages.push(pkg.onlineGuid!);\n }\n }\n\n async validateUrl(url: string): Promise {\n await this.loadingPromise;\n const routes = url.split('/').slice(2);\n\n if (routes.length === 1) {\n const service = this.services.find((s) => {\n return routes[0] === s.urlSlug;\n });\n\n if (service != null) {\n this.validPath = true;\n return;\n }\n }\n\n let currentCategory: OnlineServiceCategory | null = null;\n\n const foundRoute = routes.every((route, i) => {\n const cat = this.categories.find((c) => {\n return route === c.urlSlug;\n });\n\n if (currentCategory == null && cat != null && cat.parentId == null) {\n currentCategory = cat;\n return true;\n }\n\n if (currentCategory != null && cat != null) {\n const val = currentCategory.id === cat.parentId;\n\n currentCategory = cat;\n return val;\n }\n\n if (routes.length - 1 === i && currentCategory != null) {\n const matchingServices = this.services.filter((s) => {\n return route === s.urlSlug;\n });\n\n return (\n matchingServices != null &&\n currentCategory.orderedServices!.some((id) => matchingServices.some((m) => m.id === id))\n );\n }\n\n return false;\n });\n if (foundRoute) this.validPath = true;\n else await this.validateBusinessRoutes(url);\n }\n\n @action\n async validateBusinessRoutes(url: string): Promise {\n this.loading = true;\n const { result } = await client.post(new ConnectValidateBusinessRouteRequest({ url }));\n if (result!.isMatch)\n runInAction(() => {\n this.categories.push(...result!.categories);\n this.services.push(...result!.services);\n this.validPath = true;\n this.loading = false;\n });\n else\n runInAction(() => {\n this.validPath = false;\n this.loading = false;\n this.pathError = result!.reason;\n });\n }\n\n @action.bound\n async validateAccessCode(serviceId: string, accessCode: string): Promise {\n this.accessCodeLoading = true;\n const res = await client.post(new ConnectValidateAccessCodeRequest({ serviceId, accessCode }));\n runInAction(() => {\n if (res.result) {\n this.accessCodePassed = true;\n localStorage.setItem('accessCodeServiceId', serviceId);\n localStorage.setItem('accessCode', accessCode);\n } else this.accessCodeFailed = true;\n this.accessCodeLoading = false;\n });\n }\n\n @action.bound\n async loadAllowedPlaceholderServices(baseService: OnlineClinicService) {\n this.placeHolderLoading = true;\n this.baseService = baseService;\n const subWorkflowId = sessionStorage.getItem('subWorkflowId');\n const slug = window.location.pathname.split('/')[2];\n\n const res = await client.get(\n new GetAllowedPlaceholderServicesForCase({\n connectServiceId: baseService.id,\n subWorkflowId: subWorkflowId,\n productId: baseService.productId,\n categorySlug: slug\n })\n );\n runInAction(() => {\n this.placeHolderLoading = false;\n this._allowedPlaceholderServices.replace(res.results!);\n if (this._allowedPlaceholderServices.length === 1) {\n this.forceService = this.allowedPlaceholderServices[0];\n }\n });\n }\n}\n\nexport default SearchStore;\n"], "mappings": "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", "names": ["init_virtual_process_polyfill", "init_buffer", "SearchStoreCtx", "useSearchStore", "context_v2_default", "SearchStore", "observable", "computedFn", "s", "c", "serviceId", "cc", "x", "_allowedPlaceholderServices", "baseService", "override", "OnlineClinicService", "res", "client", "OnlineInitialRequest", "accessCode", "runInAction", "categories", "services", "practitioners", "locations", "sections", "packages", "lookups", "isWaitingListEnabled", "isCaseflow", "isMfaEnabled", "packageId", "pkg", "url", "routes", "currentCategory", "route", "i", "cat", "val", "matchingServices", "id", "m", "result", "ConnectValidateBusinessRouteRequest", "ConnectValidateAccessCodeRequest", "subWorkflowId", "slug", "GetAllowedPlaceholderServicesForCase", "__name", "__decorateClass", "computed", "action", "search_store_default"] }