diff --git a/src/components/views/spaces/SpaceTreeLevel.tsx b/src/components/views/spaces/SpaceTreeLevel.tsx index 5614271398..df9ea5533b 100644 --- a/src/components/views/spaces/SpaceTreeLevel.tsx +++ b/src/components/views/spaces/SpaceTreeLevel.tsx @@ -20,6 +20,7 @@ import {Room} from "matrix-js-sdk/src/models/room"; import RoomAvatar from "../avatars/RoomAvatar"; import SpaceStore from "../../../stores/SpaceStore"; +import SpaceTreeLevelLayoutStore from "../../../stores/SpaceTreeLevelLayoutStore"; import NotificationBadge from "../rooms/NotificationBadge"; import {RovingAccessibleButton} from "../../../accessibility/roving/RovingAccessibleButton"; import {RovingAccessibleTooltipButton} from "../../../accessibility/roving/RovingAccessibleTooltipButton"; @@ -48,8 +49,6 @@ import {EventType} from "matrix-js-sdk/src/@types/event"; import {StaticNotificationState} from "../../../stores/notifications/StaticNotificationState"; import {NotificationColor} from "../../../stores/notifications/NotificationColor"; -const getSpaceCollapsedKey = (space: Room) => `mx_space_collapsed_${space.roomId}`; - interface IItemProps { space?: Room; activeSpaces: Room[]; @@ -70,13 +69,9 @@ export class SpaceItem extends React.PureComponent { constructor(props) { super(props); - const collapsedLocalStorage = localStorage.getItem(getSpaceCollapsedKey(props.space)); - // XXX: localStorage doesn't allow booleans - // default to collapsed for root items - const collapsed = collapsedLocalStorage ? collapsedLocalStorage === "true" : !props.isNested; - this.state = { - collapsed: collapsed, + // default to collapsed for root items + collapsed: SpaceTreeLevelLayoutStore.getSpaceCollapsedState(props.space, !props.isNested), contextMenuPosition: null, }; } @@ -86,8 +81,8 @@ export class SpaceItem extends React.PureComponent { this.props.onExpand(); } const newCollapsedState = !this.state.collapsed; - // XXX: localStorage doesn't allow booleans - localStorage.setItem(getSpaceCollapsedKey(this.props.space), newCollapsedState.toString()); + + SpaceTreeLevelLayoutStore.setSpaceCollapsedState(this.props.space, newCollapsedState); this.setState({collapsed: newCollapsedState}); // don't bubble up so encapsulating button for space // doesn't get triggered diff --git a/src/stores/SpaceTreeLevelLayoutStore.ts b/src/stores/SpaceTreeLevelLayoutStore.ts new file mode 100644 index 0000000000..2ba8a73fcb --- /dev/null +++ b/src/stores/SpaceTreeLevelLayoutStore.ts @@ -0,0 +1,32 @@ +/* +Copyright 2021 Šimon Brandner + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {Room} from "matrix-js-sdk/src/models/room"; + +const getSpaceCollapsedKey = (space: Room) => `mx_space_collapsed_${space.roomId}`; + +export default class SpaceTreeLevelLayoutStore { + public static setSpaceCollapsedState(space: Room, collapsed: boolean) { + // XXX: localStorage doesn't allow booleans + localStorage.setItem(getSpaceCollapsedKey(space), collapsed.toString()); + } + + public static getSpaceCollapsedState(space: Room, fallback: boolean): boolean { + const collapsedLocalStorage = localStorage.getItem(getSpaceCollapsedKey(space)); + // XXX: localStorage doesn't allow booleans + return collapsedLocalStorage ? collapsedLocalStorage === "true" : fallback; + } +}