Enhance CalendarManager to handle full access and write-only calendar permissions, allowing event addition in both cases. Update HistoryView to support editing of history items and sharing functionality, improving user interaction and data management.

main
v504 10 months ago
parent 06fe117f68
commit 090539427e

@ -57,6 +57,10 @@ class CalendarManager: ObservableObject {
DispatchQueue.main.async { DispatchQueue.main.async {
completion(false, "calendar_permission_denied".localized) completion(false, "calendar_permission_denied".localized)
} }
case .fullAccess:
performAddEvent(calendarDetails: calendarDetails, completion: completion)
case .writeOnly:
performAddEvent(calendarDetails: calendarDetails, completion: completion)
@unknown default: @unknown default:
DispatchQueue.main.async { DispatchQueue.main.async {
completion(false, "calendar_permission_unknown".localized) completion(false, "calendar_permission_unknown".localized)

@ -261,11 +261,6 @@ struct QRCodeStyleView: View {
private var dotsContent: some View { private var dotsContent: some View {
ScrollView { ScrollView {
VStack(spacing: 16) { VStack(spacing: 16) {
Text("select_dot_type".localized)
.font(.title2)
.fontWeight(.bold)
.padding(.top)
.id(languageManager.refreshTrigger)
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 16) { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 16) {
ForEach(QRCodeDotType.allCases, id: \.self) { dotType in ForEach(QRCodeDotType.allCases, id: \.self) { dotType in

@ -19,6 +19,8 @@ struct HistoryView: View {
@State private var refreshTrigger = false @State private var refreshTrigger = false
@State private var isBatchDeleteMode = false @State private var isBatchDeleteMode = false
@State private var selectedItemsForDelete: Set<UUID> = [] @State private var selectedItemsForDelete: Set<UUID> = []
@State private var itemToEdit: HistoryItem?
@State private var showingEditView = false
enum HistoryFilter: String, CaseIterable { enum HistoryFilter: String, CaseIterable {
case all = "all" case all = "all"
@ -195,6 +197,7 @@ Button("delete".localized, role: .destructive) {
// Core Data // Core Data
loadHistoryItems() loadHistoryItems()
} }
.background(editNavigationLink)
} }
// MARK: - // MARK: -
@ -281,6 +284,57 @@ Button("delete".localized, role: .destructive) {
showingDeleteAlert = true showingDeleteAlert = true
} }
// MARK: -
private func showEditView(for item: HistoryItem) {
itemToEdit = item
showingEditView = true
}
// MARK: -
private func getQRCodeType(from item: HistoryItem) -> QRCodeType {
if let qrCodeTypeString = item.qrCodeType,
let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) {
return qrCodeType
}
return .text //
}
// MARK: -
private func getStyleData(from item: HistoryItem) -> QRCodeStyleData? {
//
guard let jsonString = item.qrCodeStyleData,
let jsonData = jsonString.data(using: .utf8) else {
return nil
}
do {
let styleData = try JSONDecoder().decode(QRCodeStyleData.self, from: jsonData)
return styleData
} catch {
print("❌ 样式数据JSON解码失败\(error)")
return nil
}
}
// MARK: -
private var editNavigationLink: some View {
NavigationLink(
destination: Group {
if let itemToEdit = itemToEdit {
QRCodeStyleView(
qrCodeContent: itemToEdit.content ?? "",
qrCodeType: getQRCodeType(from: itemToEdit),
existingStyleData: getStyleData(from: itemToEdit),
historyItem: itemToEdit
)
}
},
isActive: $showingEditView
) {
EmptyView()
}
}
// MARK: - // MARK: -
private func enterBatchDeleteMode() { private func enterBatchDeleteMode() {
isBatchDeleteMode = true isBatchDeleteMode = true
@ -384,6 +438,9 @@ Button("delete".localized, role: .destructive) {
onDelete: { onDelete: {
showDeleteConfirmation(for: item) showDeleteConfirmation(for: item)
}, },
onEdit: {
showEditView(for: item)
},
isBatchDeleteMode: isBatchDeleteMode, isBatchDeleteMode: isBatchDeleteMode,
isSelected: selectedItemsForDelete.contains(item.id ?? UUID()), isSelected: selectedItemsForDelete.contains(item.id ?? UUID()),
onToggleSelection: { onToggleSelection: {
@ -529,6 +586,7 @@ struct HistoryItemRow: View {
let item: HistoryItem let item: HistoryItem
let onToggleFavorite: () -> Void let onToggleFavorite: () -> Void
let onDelete: () -> Void let onDelete: () -> Void
let onEdit: (() -> Void)?
let isBatchDeleteMode: Bool let isBatchDeleteMode: Bool
let isSelected: Bool let isSelected: Bool
let onToggleSelection: () -> Void let onToggleSelection: () -> Void
@ -642,9 +700,28 @@ struct HistoryItemRow: View {
} }
.padding(.vertical, 8) .padding(.vertical, 8)
.swipeActions(edge: .trailing, allowsFullSwipe: false) { .swipeActions(edge: .trailing, allowsFullSwipe: false) {
Button("delete".localized, role: .destructive) { //
onDelete() Button(action: {
shareItem(item)
}) {
Image(systemName: "square.and.arrow.up")
} }
.tint(.gray)
//
if item.dataType == DataType.qrcode.rawValue &&
item.dataSource == DataSource.created.rawValue,
let onEdit = onEdit {
Button(action: onEdit) {
Image(systemName: "pencil")
}
.tint(.blue)
}
Button(action: onDelete) {
Image(systemName: "trash")
}
.tint(.red)
} }
.background( .background(
// //
@ -701,6 +778,32 @@ struct HistoryItemRow: View {
) )
} }
// MARK: -
private func shareItem(_ item: HistoryItem) {
let content = item.content ?? ""
let activityVC = UIActivityViewController(
activityItems: [content],
applicationActivities: nil
)
// iPadpopoverPresentationController
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = windowScene.windows.first {
if let popover = activityVC.popoverPresentationController {
popover.sourceView = window
popover.sourceRect = CGRect(x: window.bounds.midX, y: window.bounds.midY, width: 0, height: 0)
popover.permittedArrowDirections = []
}
}
//
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = windowScene.windows.first,
let rootViewController = window.rootViewController {
rootViewController.present(activityVC, animated: true)
}
}
private func getQRCodeType(from item: HistoryItem) -> QRCodeType { private func getQRCodeType(from item: HistoryItem) -> QRCodeType {
if let qrCodeTypeString = item.qrCodeType, if let qrCodeTypeString = item.qrCodeType,
let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) { let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) {

Loading…
Cancel
Save