import {createStore} from 'reflux'; import type {SidebarPanelKey} from 'sentry/components/sidebar/types'; import type {CommonStoreDefinition} from './types'; type ActivePanelType = SidebarPanelKey | ''; interface SidebarPanelStoreDefinition extends CommonStoreDefinition { activatePanel(panel: SidebarPanelKey): void; activePanel: ActivePanelType; hidePanel(hash?: string): void; togglePanel(panel: SidebarPanelKey): void; } const storeConfig: SidebarPanelStoreDefinition = { activePanel: '', init() { // XXX: Do not use `this.listenTo` in this store. We avoid usage of reflux // listeners due to their leaky nature in tests. }, activatePanel(panel: SidebarPanelKey) { this.activePanel = panel; this.trigger(this.activePanel); }, togglePanel(panel: SidebarPanelKey) { if (this.activePanel === panel) { this.hidePanel(); } else { this.activatePanel(panel); } }, hidePanel(hash?: string) { this.activePanel = ''; if (hash) { window.location.hash = window.location.hash.replace(`#${hash}`, ''); } this.trigger(this.activePanel); }, getState() { return this.activePanel; }, }; /** * This store is used to hold local user preferences * Side-effects (like reading/writing to cookies) are done in associated actionCreators */ const SidebarPanelStore = createStore(storeConfig); export default SidebarPanelStore;