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 2 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