Align iOS home common apps and all-functions page with Android.
Add unified HomeCommonMenu/HomeAllFunctions diagnostics, rebuild all-functions from top-level menuList permissions, and document Home and AllFunctions module logic. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -0,0 +1,57 @@
|
||||
//
|
||||
// HomeAllFunctionsBuilder.swift
|
||||
// suixinkan
|
||||
//
|
||||
// Created by Codex on 2026/6/30.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
/// 「全部功能」页菜单快照,包含完整列表及按常用 URI 拆分后的分区。
|
||||
struct HomeAllFunctionsSnapshot: Equatable {
|
||||
let allFunctions: [HomeMenuItem]
|
||||
let commonFunctions: [HomeMenuItem]
|
||||
let moreFunctions: [HomeMenuItem]
|
||||
}
|
||||
|
||||
/// 「全部功能」页菜单构建器,与 Android `AllFunctionsViewModel` 对齐。
|
||||
enum HomeAllFunctionsBuilder {
|
||||
/// 从顶层权限构建全部功能列表,并按常用 URI 精确拆分为常用/更多。
|
||||
static func build(
|
||||
topLevelPermissions: [PermissionItem],
|
||||
commonURIs: [String]
|
||||
) -> HomeAllFunctionsSnapshot {
|
||||
let allFunctions = allMenuItems(from: topLevelPermissions)
|
||||
let commonSet = Set(commonURIs)
|
||||
let commonFunctions = allFunctions.filter { commonSet.contains($0.uri) }
|
||||
let moreFunctions = allFunctions.filter { !commonSet.contains($0.uri) }
|
||||
|
||||
HomeAllFunctionsDiagnostics.log(snapshot: HomeAllFunctionsSnapshot(
|
||||
allFunctions: allFunctions,
|
||||
commonFunctions: commonFunctions,
|
||||
moreFunctions: moreFunctions
|
||||
))
|
||||
|
||||
return HomeAllFunctionsSnapshot(
|
||||
allFunctions: allFunctions,
|
||||
commonFunctions: commonFunctions,
|
||||
moreFunctions: moreFunctions
|
||||
)
|
||||
}
|
||||
|
||||
/// 将顶层权限转为 menuList 白名单内的菜单项,保持 API 返回顺序。
|
||||
private static func allMenuItems(from topLevelPermissions: [PermissionItem]) -> [HomeMenuItem] {
|
||||
topLevelPermissions.compactMap { item -> HomeMenuItem? in
|
||||
let uri = item.uri.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard !uri.isEmpty, HomeCommonMenuStore.androidHomeMenuURIs.contains(uri) else {
|
||||
return nil
|
||||
}
|
||||
let fallbackTitle = item.name.isEmpty ? HomeMenuRouter.title(for: uri) : item.name
|
||||
return HomeMenuItem(
|
||||
title: HomeMenuRouter.displayTitle(for: uri, fallback: fallbackTitle),
|
||||
uri: uri,
|
||||
iconSrc: item.iconSrc
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user