Transfer link preview images from other language

This commit is contained in:
Christoph Hagen 2025-01-13 21:54:43 +01:00
parent a5c692cb09
commit 864dc9a544
9 changed files with 68 additions and 11 deletions

View File

@ -7,13 +7,26 @@ struct OptionalImagePropertyView: View {
@Binding
var selectedImage: FileResource?
let transferImage: (language: ContentLanguage, image: FileResource)?
let footer: LocalizedStringKey
@State
private var showSelectionSheet = false
var body: some View {
GenericPropertyView(title: title, footer: footer) {
VStack(alignment: .leading) {
HStack {
Text(title)
.font(.headline)
Spacer()
if let transferImage {
Button("From \(transferImage.language.shortText)") {
selectedImage = transferImage.image
}
}
}
if let image = selectedImage {
image.imageToDisplay
.resizable()
@ -21,6 +34,7 @@ struct OptionalImagePropertyView: View {
.frame(maxHeight: 300)
.cornerRadius(8)
}
HStack {
Text(selectedImage?.id ?? "No file selected")
Spacer()
@ -28,6 +42,9 @@ struct OptionalImagePropertyView: View {
showSelectionSheet = true
}
}
Text(footer)
.foregroundStyle(.secondary)
.padding(.bottom)
}
.sheet(isPresented: $showSelectionSheet) {
FileSelectionView(selectedFile: $selectedImage, allowedType: .image)

View File

@ -7,6 +7,8 @@ struct LinkPreviewDetailView: View {
let fallbackTitle: String?
let transferImage: (language: ContentLanguage, image: FileResource)?
var body: some View {
VStack(alignment: .leading) {
OptionalStringPropertyView(
@ -18,6 +20,7 @@ struct LinkPreviewDetailView: View {
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $linkPreview.image,
transferImage: transferImage,
footer: "The image to show in a link preview")
OptionalTextFieldPropertyView(

View File

@ -8,6 +8,8 @@ struct LocalizedPageDetailView: View {
@ObservedObject
var page: LocalizedPage
let transferImage: (language: ContentLanguage, image: FileResource)?
var body: some View {
VStack(alignment: .leading) {
IdPropertyView(
@ -30,12 +32,15 @@ struct LocalizedPageDetailView: View {
}
}
LinkPreviewDetailView(linkPreview: page.linkPreview, fallbackTitle: page.title)
LinkPreviewDetailView(
linkPreview: page.linkPreview,
fallbackTitle: page.title,
transferImage: transferImage)
}
}
}
#Preview {
LocalizedPageDetailView(isExternalPage: false, page: .english)
LocalizedPageDetailView(isExternalPage: false, page: .english, transferImage: nil)
.environmentObject(Content.mock)
}

View File

@ -15,6 +15,10 @@ struct PageDetailView: View {
@State
private var showFileSelectionSheet = false
private var transferImage: (language: ContentLanguage, image: FileResource)? {
page.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
}
init(page: Page) {
self.page = page
}
@ -113,7 +117,8 @@ struct PageDetailView: View {
LocalizedPageDetailView(
isExternalPage: page.isExternalUrl,
page: page.localized(in: language))
page: page.localized(in: language),
transferImage: transferImage)
.id(page.id + language.rawValue)
}
.padding()

View File

@ -5,6 +5,8 @@ struct LocalizedPostDetailView: View {
@ObservedObject
var post: LocalizedPost
let transferImage: (language: ContentLanguage, image: FileResource)?
var body: some View {
VStack(alignment: .leading) {
OptionalStringPropertyView(
@ -12,7 +14,10 @@ struct LocalizedPostDetailView: View {
text: $post.pageLinkText,
footer: "The custom text to show for the link to the linked page")
LinkPreviewDetailView(linkPreview: post.linkPreview, fallbackTitle: post.title)
LinkPreviewDetailView(
linkPreview: post.linkPreview,
fallbackTitle: post.title,
transferImage: transferImage)
}
}
}

View File

@ -43,6 +43,10 @@ struct PostDetailView: View {
self.post = post
}
private var transferImage: (language: ContentLanguage, image: FileResource)? {
post.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
}
var body: some View {
ScrollView {
VStack(alignment: .leading) {
@ -87,7 +91,9 @@ struct PostDetailView: View {
}
}
LocalizedPostDetailView(post: post.localized(in: language))
LocalizedPostDetailView(
post: post.localized(in: language),
transferImage: transferImage)
}
.padding()
}

View File

@ -8,6 +8,10 @@ struct TagOverviewDetailView: View {
@EnvironmentObject
private var content: Content
private var transferImage: (language: ContentLanguage, image: FileResource)? {
content.tagOverview?.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
}
var body: some View {
ScrollView {
VStack(alignment: .leading) {
@ -16,7 +20,9 @@ struct TagOverviewDetailView: View {
text: "Configure the page showing all tags")
if let tag = content.tagOverview?.localized(in: language) {
LocalizedTagDetailView(tag: tag)
LocalizedTagDetailView(
tag: tag,
transferImage: transferImage)
.id(language)
} else {
Button("Create", action: createTagOverviewPage)

View File

@ -10,7 +10,9 @@ struct LocalizedTagDetailView: View {
@State
private var showImagePicker = false
let transferImage: (language: ContentLanguage, image: FileResource)?
var body: some View {
VStack(alignment: .leading) {
StringPropertyView(
@ -31,11 +33,14 @@ struct LocalizedTagDetailView: View {
}
}
LinkPreviewDetailView(linkPreview: tag.linkPreview, fallbackTitle: tag.name)
LinkPreviewDetailView(
linkPreview: tag.linkPreview,
fallbackTitle: tag.name,
transferImage: transferImage)
}
}
}
#Preview {
LocalizedTagDetailView(tag: Tag.mock.english)
LocalizedTagDetailView(tag: Tag.mock.english, transferImage: nil)
}

View File

@ -9,6 +9,10 @@ struct TagDetailView: View {
@ObservedObject
var tag: Tag
private var transferImage: (language: ContentLanguage, image: FileResource)? {
tag.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
}
var body: some View {
ScrollView {
VStack(alignment: .leading) {
@ -30,7 +34,8 @@ struct TagDetailView: View {
}
LocalizedTagDetailView(
tag: tag.localized(in: language))
tag: tag.localized(in: language),
transferImage: transferImage)
.id(tag.id + language.rawValue)
}
.padding()