mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-22 01:22:46 +02:00
Merge branch 'develop' into ismail/4384_room_summary_store
This commit is contained in:
@@ -1177,7 +1177,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
}
|
||||
|
||||
#pragma mark - MXKDataSourceDelegate
|
||||
|
||||
|
||||
- (void)dataSource:(MXKDataSource*)dataSource didCellChange:(id)changes
|
||||
{
|
||||
// Refresh is disabled during drag&drop animation
|
||||
|
||||
@@ -16,8 +16,14 @@
|
||||
|
||||
import GrowingTextView
|
||||
|
||||
@objc protocol RoomInputToolbarTextViewDelegate: AnyObject {
|
||||
func textView(_ textView: RoomInputToolbarTextView, didReceivePasteForMediaFromSender sender: Any?)
|
||||
}
|
||||
|
||||
class RoomInputToolbarTextView: GrowingTextView {
|
||||
|
||||
@objc weak var toolbarDelegate: RoomInputToolbarTextViewDelegate?
|
||||
|
||||
override var keyCommands: [UIKeyCommand]? {
|
||||
return [UIKeyCommand(input: "\r", modifierFlags: [], action: #selector(keyCommandSelector(_:)))]
|
||||
}
|
||||
@@ -28,5 +34,19 @@ class RoomInputToolbarTextView: GrowingTextView {
|
||||
}
|
||||
|
||||
delegate.onTouchUp(inside: delegate.rightInputToolbarButton)
|
||||
}
|
||||
}
|
||||
|
||||
/// Overrides paste to handle images pasted from Safari, passing them up to the input toolbar.
|
||||
/// This is required as the pasteboard contains both the image and the image's URL, with the
|
||||
/// default implementation choosing to paste the URL and completely ignore the image data.
|
||||
override func paste(_ sender: Any?) {
|
||||
let pasteboard = MXKPasteboardManager.shared.pasteboard
|
||||
let types = pasteboard.types.map { UTI(rawValue: $0) }
|
||||
|
||||
if types.contains(where: { $0.conforms(to: .image) }) {
|
||||
toolbarDelegate?.textView(self, didReceivePasteForMediaFromSender: sender)
|
||||
} else {
|
||||
super.paste(sender)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ const NSTimeInterval kActionMenuContentAlphaAnimationDuration = .2;
|
||||
const NSTimeInterval kActionMenuComposerHeightAnimationDuration = .3;
|
||||
const CGFloat kComposerContainerTrailingPadding = 12;
|
||||
|
||||
@interface RoomInputToolbarView() <GrowingTextViewDelegate>
|
||||
@interface RoomInputToolbarView() <GrowingTextViewDelegate, RoomInputToolbarTextViewDelegate>
|
||||
{
|
||||
// The intermediate action sheet
|
||||
UIAlertController *actionSheet;
|
||||
@@ -83,6 +83,8 @@ const CGFloat kComposerContainerTrailingPadding = 12;
|
||||
self.isEncryptionEnabled = _isEncryptionEnabled;
|
||||
|
||||
[self updateUIWithTextMessage:nil animated:NO];
|
||||
|
||||
self.textView.toolbarDelegate = self;
|
||||
}
|
||||
|
||||
- (void)setVoiceMessageToolbarView:(UIView *)voiceMessageToolbarView
|
||||
@@ -382,6 +384,16 @@ const CGFloat kComposerContainerTrailingPadding = 12;
|
||||
[super onTouchUpInside:button];
|
||||
}
|
||||
|
||||
- (BOOL)becomeFirstResponder
|
||||
{
|
||||
return [self.textView becomeFirstResponder];
|
||||
}
|
||||
|
||||
- (void)dismissKeyboard
|
||||
{
|
||||
[self.textView resignFirstResponder];
|
||||
}
|
||||
|
||||
- (void)destroy
|
||||
{
|
||||
if (actionSheet)
|
||||
@@ -455,6 +467,11 @@ const CGFloat kComposerContainerTrailingPadding = 12;
|
||||
[super paste:sender];
|
||||
}
|
||||
|
||||
- (void)textView:(GrowingTextView *)textView didReceivePasteForMediaFromSender:(id)sender
|
||||
{
|
||||
[self paste:sender];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)updateUIWithTextMessage:(NSString *)textMessage animated:(BOOL)animated
|
||||
|
||||
@@ -231,6 +231,9 @@ class SpaceDetailViewController: UIViewController {
|
||||
let membersString = membersCount == 1 ? VectorL10n.roomTitleOneMember : VectorL10n.roomTitleMembers("\(membersCount)")
|
||||
self.spaceTypeLabel.text = "\(joinRuleString) · \(membersString)"
|
||||
|
||||
let joinRuleIcon = parameters.joinRule == .public ? Asset.Images.spaceTypeIcon : Asset.Images.spacePrivateIcon
|
||||
self.spaceTypeIconView.image = joinRuleIcon.image
|
||||
|
||||
self.inviterIdLabel.text = parameters.inviterId
|
||||
if let inviterId = parameters.inviterId {
|
||||
self.inviterTitleLabel.text = "\(parameters.inviter?.displayname ?? inviterId) invited you"
|
||||
|
||||
@@ -58,7 +58,7 @@ final class SpaceListViewCell: UITableViewCell, Themable, NibReusable {
|
||||
func fill(with viewData: SpaceListItemViewData) {
|
||||
self.avatarView.fill(with: viewData.avatarViewData)
|
||||
self.titleLabel.text = viewData.title
|
||||
self.moreButton.isHidden = viewData.spaceId == SpaceListViewModel.Constants.homeSpaceId || viewData.isInvite
|
||||
self.moreButton.isHidden = viewData.isInvite
|
||||
if viewData.isInvite {
|
||||
self.isBadgeAlert = true
|
||||
self.badgeLabel.isHidden = false
|
||||
|
||||
@@ -91,7 +91,8 @@ final class SpaceListViewModel: SpaceListViewModelType {
|
||||
case .moreAction(at: let indexPath, from: let sourceView):
|
||||
let section = self.sections[indexPath.section]
|
||||
switch section {
|
||||
case .home: break
|
||||
case .home:
|
||||
self.coordinatorDelegate?.spaceListViewModel(self, didPressMoreForSpaceWithId: Constants.homeSpaceId, from: sourceView)
|
||||
case .spaces(let viewDataList):
|
||||
let spaceViewData = viewDataList[indexPath.row]
|
||||
self.coordinatorDelegate?.spaceListViewModel(self, didPressMoreForSpaceWithId: spaceViewData.spaceId, from: sourceView)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// 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 Foundation
|
||||
|
||||
protocol SpaceMenuCell: Themable {
|
||||
func update(with viewData: SpaceMenuListItemViewData)
|
||||
}
|
||||
@@ -16,16 +16,45 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
/// Possible action related to a `SpaceMenuListViewCell` view data
|
||||
enum SpaceMenuListItemAction {
|
||||
case showAllRoomsInHomeSpace
|
||||
case exploreSpaceMembers
|
||||
case exploreSpaceRooms
|
||||
case leaveSpace
|
||||
}
|
||||
|
||||
/// Style of the `SpaceMenuListViewCell`
|
||||
enum SpaceMenuListItemStyle {
|
||||
case normal
|
||||
case toggle
|
||||
case destructive
|
||||
}
|
||||
|
||||
/// `SpaceMenuListItemViewDataDelegate` allows the table view cell to update its view accordingly with it's related data change
|
||||
protocol SpaceMenuListItemViewDataDelegate: AnyObject {
|
||||
func spaceMenuItemValueDidChange(_ item: SpaceMenuListItemViewData)
|
||||
}
|
||||
|
||||
/// `SpaceMenuListViewCell` view data
|
||||
struct SpaceMenuListItemViewData {
|
||||
let actionId: String
|
||||
class SpaceMenuListItemViewData {
|
||||
let action: SpaceMenuListItemAction
|
||||
let style: SpaceMenuListItemStyle
|
||||
let title: String?
|
||||
let icon: UIImage?
|
||||
/// Any value related to the type of data (e.g. `Bool` for `boolean` style, `nil` for `normal` and `destructive` style)
|
||||
var value: Any? {
|
||||
didSet {
|
||||
delegate?.spaceMenuItemValueDidChange(self)
|
||||
}
|
||||
}
|
||||
weak var delegate: SpaceMenuListItemViewDataDelegate?
|
||||
|
||||
init(action: SpaceMenuListItemAction, style: SpaceMenuListItemStyle, title: String?, icon: UIImage?, value: Any?) {
|
||||
self.action = action
|
||||
self.style = style
|
||||
self.title = title
|
||||
self.icon = icon
|
||||
self.value = value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
import Foundation
|
||||
import Reusable
|
||||
|
||||
class SpaceMenuListViewCell: UITableViewCell, Themable, NibReusable {
|
||||
class SpaceMenuListViewCell: UITableViewCell, SpaceMenuCell, NibReusable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
@@ -49,7 +49,7 @@ class SpaceMenuListViewCell: UITableViewCell, Themable, NibReusable {
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
func fill(with viewData: SpaceMenuListItemViewData) {
|
||||
func update(with viewData: SpaceMenuListItemViewData) {
|
||||
self.iconView.image = viewData.icon
|
||||
self.titleLabel.text = viewData.title
|
||||
|
||||
|
||||
@@ -101,16 +101,15 @@ extension SpaceMenuPresenter: SpaceMenuModelViewModelCoordinatorDelegate {
|
||||
self.dismiss(animated: true, completion: nil)
|
||||
}
|
||||
|
||||
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: String) {
|
||||
let actionId = SpaceMenuViewModel.ActionId(rawValue: itemId)
|
||||
switch actionId {
|
||||
case .leave: break
|
||||
case .members:
|
||||
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWith action: SpaceMenuListItemAction) {
|
||||
switch action {
|
||||
case .leaveSpace: break
|
||||
case .exploreSpaceMembers:
|
||||
self.delegate?.spaceMenuPresenter(self, didCompleteWith: .exploreMembers, forSpaceWithId: self.spaceId, with: self.session)
|
||||
case .rooms:
|
||||
case .exploreSpaceRooms:
|
||||
self.delegate?.spaceMenuPresenter(self, didCompleteWith: .exploreRooms, forSpaceWithId: self.spaceId, with: self.session)
|
||||
default:
|
||||
MXLog.error("[SpaceMenuPresenter] spaceListViewModel didSelectItemWithId: invalid itemId \(itemId)")
|
||||
MXLog.error("[SpaceMenuPresenter] spaceListViewModel didSelectItem: invalid action \(action)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// 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 Foundation
|
||||
import Reusable
|
||||
|
||||
class SpaceMenuSwitchViewCell: UITableViewCell, SpaceMenuCell, NibReusable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
@IBOutlet private weak var titleLabel: UILabel!
|
||||
@IBOutlet private weak var selectionView: UIView!
|
||||
@IBOutlet private weak var switchView: UISwitch!
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private var theme: Theme?
|
||||
|
||||
// MARK: - Life cycle
|
||||
|
||||
override func awakeFromNib() {
|
||||
super.awakeFromNib()
|
||||
|
||||
self.selectionStyle = .none
|
||||
self.selectionView.layer.cornerRadius = 8.0
|
||||
self.selectionView.layer.masksToBounds = true
|
||||
}
|
||||
|
||||
override func setSelected(_ selected: Bool, animated: Bool) {
|
||||
super.setSelected(selected, animated: animated)
|
||||
|
||||
UIView.animate(withDuration: animated ? 0.3 : 0.0) {
|
||||
self.selectionView.alpha = selected ? 1.0 : 0.0
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
func update(with viewData: SpaceMenuListItemViewData) {
|
||||
self.titleLabel.text = viewData.title
|
||||
self.switchView.isOn = (viewData.value as? Bool) ?? false
|
||||
|
||||
viewData.delegate = self
|
||||
}
|
||||
|
||||
func update(theme: Theme) {
|
||||
self.theme = theme
|
||||
self.backgroundColor = theme.colors.background
|
||||
self.titleLabel.textColor = theme.colors.primaryContent
|
||||
self.titleLabel.font = theme.fonts.body
|
||||
self.selectionView.backgroundColor = theme.colors.separator
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - SpaceMenuListItemViewDataDelegate
|
||||
extension SpaceMenuSwitchViewCell: SpaceMenuListItemViewDataDelegate {
|
||||
func spaceMenuItemValueDidChange(_ item: SpaceMenuListItemViewData) {
|
||||
self.switchView.setOn((item.value as? Bool) ?? false, animated: true)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina6_1" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="System colors in document resources" minToolsVersion="11.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="64" id="tOd-GW-k0x" customClass="SpaceMenuSwitchViewCell" customModule="Riot" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="tOd-GW-k0x" id="kRV-oW-j2b">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="64"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YQF-X2-MAf">
|
||||
<rect key="frame" x="8" y="8" width="304" height="48"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="48" id="f1L-gQ-B6g"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SSn-E2-PZK">
|
||||
<rect key="frame" x="16" y="21.5" width="231" height="21"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<switch opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zhh-dM-9TG">
|
||||
<rect key="frame" x="255" y="16.5" width="51" height="31"/>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="YQF-X2-MAf" firstAttribute="top" secondItem="kRV-oW-j2b" secondAttribute="top" constant="8" id="0nO-xV-wrC"/>
|
||||
<constraint firstItem="zhh-dM-9TG" firstAttribute="leading" secondItem="SSn-E2-PZK" secondAttribute="trailing" constant="8" id="3fk-BS-QhF"/>
|
||||
<constraint firstAttribute="trailing" secondItem="YQF-X2-MAf" secondAttribute="trailing" constant="8" id="4pu-1l-NUB"/>
|
||||
<constraint firstItem="YQF-X2-MAf" firstAttribute="leading" secondItem="kRV-oW-j2b" secondAttribute="leading" constant="8" id="Dlx-2U-0pd"/>
|
||||
<constraint firstItem="zhh-dM-9TG" firstAttribute="centerY" secondItem="kRV-oW-j2b" secondAttribute="centerY" id="JlX-MX-R9W"/>
|
||||
<constraint firstAttribute="bottom" secondItem="YQF-X2-MAf" secondAttribute="bottom" constant="8" id="fTw-ef-WYp"/>
|
||||
<constraint firstItem="SSn-E2-PZK" firstAttribute="leading" secondItem="kRV-oW-j2b" secondAttribute="leading" constant="16" id="fep-GJ-roy"/>
|
||||
<constraint firstItem="SSn-E2-PZK" firstAttribute="centerY" secondItem="kRV-oW-j2b" secondAttribute="centerY" id="jwX-PQ-zct"/>
|
||||
<constraint firstAttribute="trailing" secondItem="zhh-dM-9TG" secondAttribute="trailing" constant="16" id="rKz-yr-ejP"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<viewLayoutGuide key="safeArea" id="0Tk-ek-Uxc"/>
|
||||
<connections>
|
||||
<outlet property="selectionView" destination="YQF-X2-MAf" id="Y3z-Ug-Lrc"/>
|
||||
<outlet property="switchView" destination="zhh-dM-9TG" id="ogf-cv-75K"/>
|
||||
<outlet property="titleLabel" destination="SSn-E2-PZK" id="bS7-F2-Tfb"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="137.68115942028987" y="104.46428571428571"/>
|
||||
</tableViewCell>
|
||||
</objects>
|
||||
<resources>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
||||
@@ -114,6 +114,17 @@ class SpaceMenuViewController: UIViewController {
|
||||
}
|
||||
|
||||
private func setupViews() {
|
||||
setupTableView()
|
||||
|
||||
if self.spaceId == SpaceListViewModel.Constants.homeSpaceId {
|
||||
let avatarViewData = AvatarViewData(matrixItemId: self.spaceId, displayName: nil, avatarUrl: nil, mediaManager: session.mediaManager, fallbackImage: .image(Asset.Images.spaceHomeIcon.image, .center))
|
||||
self.avatarView.fill(with: avatarViewData)
|
||||
self.titleLabel.text = VectorL10n.titleHome
|
||||
self.subtitleLabel.text = VectorL10n.settingsTitle
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
guard let space = self.session.spaceService.getSpace(withId: self.spaceId), let summary = space.summary else {
|
||||
MXLog.error("[SpaceMenuViewController] setupViews: no space found")
|
||||
return
|
||||
@@ -130,7 +141,6 @@ class SpaceMenuViewController: UIViewController {
|
||||
|
||||
self.closeButton.layer.masksToBounds = true
|
||||
self.closeButton.layer.cornerRadius = self.closeButton.bounds.height / 2
|
||||
setupTableView()
|
||||
}
|
||||
|
||||
private func setupTableView() {
|
||||
@@ -139,6 +149,7 @@ class SpaceMenuViewController: UIViewController {
|
||||
self.tableView.estimatedRowHeight = Constants.estimatedRowHeight
|
||||
self.tableView.allowsSelection = true
|
||||
self.tableView.register(cellType: SpaceMenuListViewCell.self)
|
||||
self.tableView.register(cellType: SpaceMenuSwitchViewCell.self)
|
||||
self.tableView.tableFooterView = UIView()
|
||||
}
|
||||
|
||||
@@ -235,12 +246,15 @@ extension SpaceMenuViewController: UITableViewDataSource {
|
||||
}
|
||||
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
let cell = tableView.dequeueReusableCell(for: indexPath, cellType: SpaceMenuListViewCell.self)
|
||||
|
||||
let viewData = viewModel.menuItems[indexPath.row]
|
||||
|
||||
cell.update(theme: self.theme)
|
||||
cell.fill(with: viewData)
|
||||
let cell = viewData.style == .toggle ? tableView.dequeueReusableCell(for: indexPath, cellType: SpaceMenuSwitchViewCell.self) :
|
||||
tableView.dequeueReusableCell(for: indexPath, cellType: SpaceMenuListViewCell.self)
|
||||
|
||||
if let cell = cell as? SpaceMenuCell {
|
||||
cell.update(theme: self.theme)
|
||||
cell.update(with: viewData)
|
||||
}
|
||||
|
||||
return cell
|
||||
}
|
||||
|
||||
@@ -19,25 +19,19 @@ import Foundation
|
||||
/// View model used by `SpaceMenuViewController`
|
||||
class SpaceMenuViewModel: SpaceMenuViewModelType {
|
||||
|
||||
// MARK: - Enum
|
||||
|
||||
enum ActionId: String {
|
||||
case members = "members"
|
||||
case rooms = "rooms"
|
||||
case leave = "leave"
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
weak var coordinatorDelegate: SpaceMenuModelViewModelCoordinatorDelegate?
|
||||
weak var viewDelegate: SpaceMenuViewModelViewDelegate?
|
||||
|
||||
var menuItems: [SpaceMenuListItemViewData] = [
|
||||
SpaceMenuListItemViewData(actionId: ActionId.members.rawValue, style: .normal, title: VectorL10n.roomDetailsPeople, icon: UIImage(named: "space_menu_members")),
|
||||
SpaceMenuListItemViewData(actionId: ActionId.rooms.rawValue, style: .normal, title: VectorL10n.spacesExploreRooms, icon: UIImage(named: "space_menu_rooms")),
|
||||
SpaceMenuListItemViewData(actionId: ActionId.leave.rawValue, style: .destructive, title: VectorL10n.leave, icon: UIImage(named: "space_menu_leave"))
|
||||
private let spaceMenuItems: [SpaceMenuListItemViewData] = [
|
||||
SpaceMenuListItemViewData(action: .exploreSpaceMembers, style: .normal, title: VectorL10n.roomDetailsPeople, icon: Asset.Images.spaceMenuMembers.image, value: nil),
|
||||
SpaceMenuListItemViewData(action: .exploreSpaceRooms, style: .normal, title: VectorL10n.spacesExploreRooms, icon: Asset.Images.spaceMenuRooms.image, value: nil),
|
||||
SpaceMenuListItemViewData(action: .leaveSpace, style: .destructive, title: VectorL10n.leave, icon: Asset.Images.spaceMenuLeave.image, value: nil)
|
||||
]
|
||||
|
||||
var menuItems: [SpaceMenuListItemViewData] = []
|
||||
|
||||
private let session: MXSession
|
||||
private let spaceId: String
|
||||
|
||||
@@ -46,6 +40,14 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
|
||||
init(session: MXSession, spaceId: String) {
|
||||
self.session = session
|
||||
self.spaceId = spaceId
|
||||
|
||||
if spaceId != SpaceListViewModel.Constants.homeSpaceId {
|
||||
self.menuItems = spaceMenuItems
|
||||
} else {
|
||||
self.menuItems = [
|
||||
SpaceMenuListItemViewData(action: .showAllRoomsInHomeSpace, style: .toggle, title: VectorL10n.spaceHomeShowAllRooms, icon: nil, value: MXKAppSettings.standard().showAllRoomsInHomeSpace)
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -55,7 +57,7 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
|
||||
case .dismiss:
|
||||
self.coordinatorDelegate?.spaceMenuViewModelDidDismiss(self)
|
||||
case .selectRow(at: let indexPath):
|
||||
self.processAction(with: menuItems[indexPath.row].actionId)
|
||||
self.processAction(with: menuItems[indexPath.row].action, at: indexPath)
|
||||
case .leaveSpaceAndKeepRooms:
|
||||
self.leaveSpaceAndKeepRooms()
|
||||
case .leaveSpaceAndLeaveRooms:
|
||||
@@ -65,13 +67,16 @@ class SpaceMenuViewModel: SpaceMenuViewModelType {
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func processAction(with actionStringId: String) {
|
||||
let actionId = ActionId(rawValue: actionStringId)
|
||||
switch actionId {
|
||||
case .leave:
|
||||
private func processAction(with action: SpaceMenuListItemAction, at indexPath: IndexPath) {
|
||||
switch action {
|
||||
case .showAllRoomsInHomeSpace:
|
||||
MXKAppSettings.standard().showAllRoomsInHomeSpace = !MXKAppSettings.standard().showAllRoomsInHomeSpace
|
||||
self.menuItems[indexPath.row].value = MXKAppSettings.standard().showAllRoomsInHomeSpace
|
||||
self.viewDelegate?.spaceMenuViewModel(self, didUpdateViewState: .deselect)
|
||||
case .leaveSpace:
|
||||
self.leaveSpace()
|
||||
default:
|
||||
self.coordinatorDelegate?.spaceMenuViewModel(self, didSelectItemWithId: actionStringId)
|
||||
self.coordinatorDelegate?.spaceMenuViewModel(self, didSelectItemWith: action)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ protocol SpaceMenuViewModelViewDelegate: AnyObject {
|
||||
|
||||
protocol SpaceMenuModelViewModelCoordinatorDelegate: AnyObject {
|
||||
func spaceMenuViewModelDidDismiss(_ viewModel: SpaceMenuViewModelType)
|
||||
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWithId itemId: String)
|
||||
func spaceMenuViewModel(_ viewModel: SpaceMenuViewModelType, didSelectItemWith action: SpaceMenuListItemAction)
|
||||
}
|
||||
|
||||
/// Protocol describing the view model used by `SpaceMenuViewController`
|
||||
|
||||
Reference in New Issue
Block a user