mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-10-31 08:15:24 +00:00
482cc0fee8
The search screen's empty state now lists the queries the user searched for and the rooms they opened from the results, newest first, capped at 25 and stored in AppSettings. Tapping a query fills the search field, tapping a room opens it, and both are reachable with a hardware keyboard. Rooms are resolved from their identifiers as the room list loads, and those the user has left or is only invited to are dropped. The history is cleared on logout.
172 lines
4.5 KiB
Swift
172 lines
4.5 KiB
Swift
//
|
|
// Copyright 2025 Element Creations Ltd.
|
|
// Copyright 2022-2025 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
|
|
enum Avatars {
|
|
enum Size {
|
|
case user(on: UserAvatarSizeOnScreen)
|
|
case room(on: RoomAvatarSizeOnScreen)
|
|
/// custom
|
|
case custom(CGFloat)
|
|
|
|
/// Value in UIKit points
|
|
var value: CGFloat {
|
|
switch self {
|
|
case .user(let screen):
|
|
return screen.value
|
|
case .room(let screen):
|
|
return screen.value
|
|
case .custom(let val):
|
|
return val
|
|
}
|
|
}
|
|
|
|
/// Value in pixels by using the scale of the main screen
|
|
@MainActor var scaledValue: CGFloat {
|
|
value * UIScreen.main.scale
|
|
}
|
|
|
|
@MainActor var scaledSize: CGSize {
|
|
CGSize(width: scaledValue, height: scaledValue)
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
static func generatePlaceholderAvatarImageData(name: String, id: String, size: CGSize) -> Data? {
|
|
let image = PlaceholderAvatarImage(name: name, contentID: id)
|
|
.clipShape(Circle())
|
|
.frame(width: size.width, height: size.height)
|
|
|
|
let renderer = ImageRenderer(content: image)
|
|
|
|
// Specify the scale so the image is rendered correctly. We don't have access to the screen
|
|
// here so a hardcoded 3.0 will have to do
|
|
renderer.scale = 3.0
|
|
|
|
guard let image = renderer.uiImage else {
|
|
MXLog.info("Generating notification icon placeholder failed")
|
|
return nil
|
|
}
|
|
|
|
return image.pngData()
|
|
}
|
|
}
|
|
|
|
enum UserAvatarSizeOnScreen {
|
|
case chats
|
|
case chatsCompact
|
|
case spaces
|
|
case spacesCompact
|
|
case timeline
|
|
case settings
|
|
case roomDetails
|
|
case roomMembersList
|
|
case roomChangeRoles
|
|
case dmDetails
|
|
case startChat
|
|
case memberDetails
|
|
case inviteUsers
|
|
case readReceipt
|
|
case readReceiptSheet
|
|
case editUserDetails
|
|
case spaceHeader
|
|
case completionSuggestions
|
|
case blockedUsers
|
|
case knockingUsersBannerStack
|
|
case knockingUserBanner
|
|
case knockingUserList
|
|
case mediaPreviewDetails
|
|
case sendInviteConfirmation
|
|
case sessionVerification
|
|
case threadList
|
|
case threadSummary
|
|
case map
|
|
case classicAppAccount
|
|
case search
|
|
|
|
var value: CGFloat {
|
|
switch self {
|
|
case .readReceipt:
|
|
16
|
|
case .spaceHeader:
|
|
20
|
|
case .threadSummary:
|
|
24
|
|
case .knockingUsersBannerStack:
|
|
28
|
|
case .chatsCompact, .spacesCompact, .map,
|
|
.timeline, .readReceiptSheet, .completionSuggestions,
|
|
.blockedUsers, .roomMembersList, .knockingUserBanner:
|
|
32
|
|
case .startChat:
|
|
36
|
|
case .chats, .spaces:
|
|
40
|
|
case .roomDetails:
|
|
44
|
|
case .inviteUsers, .knockingUserList, .sessionVerification,
|
|
.settings, .threadList, .mediaPreviewDetails, .search:
|
|
52
|
|
case .roomChangeRoles:
|
|
56
|
|
case .sendInviteConfirmation:
|
|
64
|
|
case .dmDetails:
|
|
75
|
|
case .memberDetails, .editUserDetails, .classicAppAccount:
|
|
96
|
|
}
|
|
}
|
|
}
|
|
|
|
enum RoomAvatarSizeOnScreen {
|
|
case chats
|
|
case spaces
|
|
case spaceSettings
|
|
case spaceFilters
|
|
case authorizedSpaces
|
|
case timeline
|
|
case leaveSpace
|
|
case messageForwarding
|
|
case search
|
|
case searchHistory
|
|
case roomSelection
|
|
case details
|
|
case editRoomDetails
|
|
case notificationSettings
|
|
case roomDirectorySearch
|
|
case joinRoom
|
|
case spaceHeader
|
|
case editSpaceDetails
|
|
case spaceAddRooms
|
|
case spaceAddRoomsSelected
|
|
case completionSuggestions
|
|
case createRoomSelectSpace
|
|
|
|
var value: CGFloat {
|
|
switch self {
|
|
case .timeline, .leaveSpace, .notificationSettings, .roomDirectorySearch,
|
|
.completionSuggestions, .authorizedSpaces, .createRoomSelectSpace,
|
|
.spaceFilters, .searchHistory:
|
|
32
|
|
case .messageForwarding, .roomSelection,
|
|
.spaceAddRooms:
|
|
36
|
|
case .chats, .spaces, .spaceSettings,
|
|
.spaceAddRoomsSelected, .search:
|
|
52
|
|
case .joinRoom, .spaceHeader, .editSpaceDetails:
|
|
64
|
|
case .details, .editRoomDetails:
|
|
96
|
|
}
|
|
}
|
|
}
|