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 {
completion(false, "calendar_permission_denied".localized)
}
case .fullAccess:
performAddEvent(calendarDetails: calendarDetails, completion: completion)
case .writeOnly:
performAddEvent(calendarDetails: calendarDetails, completion: completion)
@unknown default:
DispatchQueue.main.async {
completion(false, "calendar_permission_unknown".localized)

@ -261,11 +261,6 @@ struct QRCodeStyleView: View {
private var dotsContent: some View {
ScrollView {
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) {
ForEach(QRCodeDotType.allCases, id: \.self) { dotType in

@ -19,6 +19,8 @@ struct HistoryView: View {
@State private var refreshTrigger = false
@State private var isBatchDeleteMode = false
@State private var selectedItemsForDelete: Set<UUID> = []
@State private var itemToEdit: HistoryItem?
@State private var showingEditView = false
enum HistoryFilter: String, CaseIterable {
case all = "all"
@ -195,6 +197,7 @@ Button("delete".localized, role: .destructive) {
// Core Data
loadHistoryItems()
}
.background(editNavigationLink)
}
// MARK: -
@ -281,6 +284,57 @@ Button("delete".localized, role: .destructive) {
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: -
private func enterBatchDeleteMode() {
isBatchDeleteMode = true
@ -384,6 +438,9 @@ Button("delete".localized, role: .destructive) {
onDelete: {
showDeleteConfirmation(for: item)
},
onEdit: {
showEditView(for: item)
},
isBatchDeleteMode: isBatchDeleteMode,
isSelected: selectedItemsForDelete.contains(item.id ?? UUID()),
onToggleSelection: {
@ -529,6 +586,7 @@ struct HistoryItemRow: View {
let item: HistoryItem
let onToggleFavorite: () -> Void
let onDelete: () -> Void
let onEdit: (() -> Void)?
let isBatchDeleteMode: Bool
let isSelected: Bool
let onToggleSelection: () -> Void
@ -642,9 +700,28 @@ struct HistoryItemRow: View {
}
.padding(.vertical, 8)
.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(
//
@ -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 {
if let qrCodeTypeString = item.qrCodeType,
let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) {

Loading…
Cancel
Save