| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import './auto_tab_groups/auto_tab_groups_page.js'; |
| import './tab_organization_selector.js'; |
| import './tab_search_page.js'; |
| import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.js'; |
| import 'chrome://resources/cr_elements/cr_page_selector/cr_page_selector.js'; |
| |
| import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; |
| import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; |
| |
| import {getCss} from './app.css.js'; |
| import {getHtml} from './app.html.js'; |
| import type {TabSearchApiProxy} from './tab_search_api_proxy.js'; |
| import {TabSearchApiProxyImpl} from './tab_search_api_proxy.js'; |
| |
| export class TabSearchAppElement extends CrLitElement { |
| static get is() { |
| return 'tab-search-app'; |
| } |
| |
| static override get properties() { |
| return { |
| selectedTabIndex_: {type: Number}, |
| tabNames_: {type: Array}, |
| tabIcons_: {type: Array}, |
| tabOrganizationEnabled_: {type: Boolean}, |
| declutterEnabled_: {type: Boolean}, |
| }; |
| } |
| |
| private apiProxy_: TabSearchApiProxy = TabSearchApiProxyImpl.getInstance(); |
| private listenerIds_: number[] = []; |
| protected selectedTabIndex_: number = loadTimeData.getInteger('tabIndex'); |
| protected tabNames_: string[] = [ |
| loadTimeData.getString('tabSearchTabName'), |
| loadTimeData.getString('tabOrganizationTabName'), |
| ]; |
| protected tabIcons_: string[] = |
| ['images/tab_search.svg', 'images/auto_tab_groups.svg']; |
| protected tabOrganizationEnabled_: boolean = |
| loadTimeData.getBoolean('tabOrganizationEnabled'); |
| protected declutterEnabled_: boolean = |
| loadTimeData.getBoolean('declutterEnabled'); |
| |
| static override get styles() { |
| return getCss(); |
| } |
| |
| override render() { |
| return getHtml.bind(this)(); |
| } |
| |
| override connectedCallback() { |
| super.connectedCallback(); |
| |
| const callbackRouter = this.apiProxy_.getCallbackRouter(); |
| this.listenerIds_.push(callbackRouter.tabSearchTabIndexChanged.addListener( |
| this.onTabIndexChanged_.bind(this))); |
| this.listenerIds_.push( |
| callbackRouter.tabOrganizationEnabledChanged.addListener( |
| this.onTabOrganizationEnabledChanged_.bind(this))); |
| } |
| |
| override disconnectedCallback() { |
| super.disconnectedCallback(); |
| this.listenerIds_.forEach( |
| id => this.apiProxy_.getCallbackRouter().removeListener(id)); |
| } |
| |
| private onTabIndexChanged_(index: number) { |
| this.selectedTabIndex_ = index; |
| } |
| |
| private onTabOrganizationEnabledChanged_(enabled: boolean) { |
| this.tabOrganizationEnabled_ = enabled; |
| } |
| |
| protected onSelectedTabChanged_(e: CustomEvent<{value: number}>) { |
| this.selectedTabIndex_ = e.detail.value; |
| if (this.selectedTabIndex_ === 1 && !this.declutterEnabled_) { |
| const autoTabGroupsPage = |
| this.shadowRoot!.querySelector('auto-tab-groups-page')!; |
| autoTabGroupsPage.classList.toggle('changed-state', false); |
| } |
| this.apiProxy_.setTabIndex(this.selectedTabIndex_); |
| } |
| } |
| |
| declare global { |
| interface HTMLElementTagNameMap { |
| 'tab-search-app': TabSearchAppElement; |
| } |
| } |
| |
| customElements.define(TabSearchAppElement.is, TabSearchAppElement); |