From b4117f8e001466b972695720a4dbbcad60b82a17 Mon Sep 17 00:00:00 2001 From: Tim <0xtimc@gmail.com> Date: Fri, 19 Sep 2025 10:40:28 +0000 Subject: [PATCH 1/3] Add bluesky to speaker --- Sources/Conference/Models/Speaker.swift | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Sources/Conference/Models/Speaker.swift b/Sources/Conference/Models/Speaker.swift index e3a0899c..b41e7da2 100644 --- a/Sources/Conference/Models/Speaker.swift +++ b/Sources/Conference/Models/Speaker.swift @@ -2,13 +2,14 @@ import Plot struct Speaker { let name: String - let role: String? + let role: String let company: String? let url: String let image: String let twitter: String? let github: String? let mastodon: String? + let bluesky: String? let linkedIn: String? let website: String? let bio: Component @@ -16,12 +17,13 @@ struct Speaker { internal init( name: String, - role: String?, + role: String, company: String? = nil, image: String? = nil, twitter: String? = nil, github: String? = nil, mastodon: String? = nil, + bluesky: String? = nil, linkedIn: String? = nil, website: String? = nil, bio: Component, @@ -39,6 +41,7 @@ struct Speaker { self.twitter = twitter self.github = github self.mastodon = mastodon + self.bluesky = bluesky self.linkedIn = linkedIn self.website = website self.bio = bio @@ -47,18 +50,19 @@ struct Speaker { internal init( name: String, - role: String?, + role: String, company: String? = nil, image: String? = nil, twitter: String? = nil, github: String? = nil, mastodon: String? = nil, + bluesky: String? = nil, linkedIn: String? = nil, website: String? = nil, bio: String, talkIDs: [Int] ) { - self.init(name: name, role: role, company: company, image: image, twitter: twitter, github: github, mastodon: mastodon, linkedIn: linkedIn, website: website, bio: Text(bio), talkIDs: talkIDs) + self.init(name: name, role: role, company: company, image: image, twitter: twitter, github: github, mastodon: mastodon, bluesky: bluesky, linkedIn: linkedIn, website: website, bio: Text(bio), talkIDs: talkIDs) } var talks: [Talk] { @@ -132,8 +136,10 @@ struct AllSpeakers { ), Speaker( name: "Joannis Orlandos", - role: nil, + role: "OpenSource Developer", twitter: "http://twitter.com/joannisorlandos", + github: "https://github.com/joannis", + bluesky: "https://bsky.app/profile/joanniso.bsky.social", website: "https://swiftonserver.com/", bio: "Joannis is a member of the Swift Server and Android Workgroups, and maintains for MongoKitten, Hummingbird and EdgeOS. Joannis helps clients implement Swift across their stack, from microcontrollers to iOS apps.", talkIDs: [3] From 19cce16359868b53652b461690ce26b29bdc9e2e Mon Sep 17 00:00:00 2001 From: Tim <0xtimc@gmail.com> Date: Fri, 19 Sep 2025 12:43:12 +0200 Subject: [PATCH 2/3] Make role non-optional --- .../Conference/Components/SpeakerDetail.swift | 20 +++++++++---------- .../Conference/Components/SpeakerList.swift | 6 ++---- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Sources/Conference/Components/SpeakerDetail.swift b/Sources/Conference/Components/SpeakerDetail.swift index 8babc53c..8d5cfc43 100644 --- a/Sources/Conference/Components/SpeakerDetail.swift +++ b/Sources/Conference/Components/SpeakerDetail.swift @@ -122,19 +122,17 @@ struct SpeakerDetail: Component { } Node.hr() H3("About the Speaker") - if speaker.role != nil { - Div { - H4("Position").class("f-gradient") - if let company = speaker.company, let role = speaker.role { - H6("\(role) at \(company)") - .class("f-weight-300") - } else if let role = speaker.role { - H6("\(role)") - .class("f-weight-300") - } + Div { + H4("Position").class("f-gradient") + if let company = speaker.company { + H6("\(speaker.role) at \(company)") + .class("f-weight-300") + } else { + H6("\(speaker.role)") + .class("f-weight-300") } - .class("section") } + .class("section") Div { H4("Bio").class("f-gradient") H6(speaker.bio) diff --git a/Sources/Conference/Components/SpeakerList.swift b/Sources/Conference/Components/SpeakerList.swift index 43f9a82b..6a259bdf 100644 --- a/Sources/Conference/Components/SpeakerList.swift +++ b/Sources/Conference/Components/SpeakerList.swift @@ -26,10 +26,8 @@ struct SpeakerOverview: Component { Div { H3(speaker.name) .class("h3") - if let role = speaker.role { - H4(role) - .class("f-weight-300 mb-0") - } + H4(speaker.role) + .class("f-weight-300 mb-0") if let company = speaker.company { H4(company) .class("f-weight-300") From c5e3ceed2e2ecae5e962d9db46039052c8de1890 Mon Sep 17 00:00:00 2001 From: Tim <0xtimc@gmail.com> Date: Fri, 19 Sep 2025 12:44:20 +0200 Subject: [PATCH 3/3] Display bsky on the profile --- Sources/Conference/Components/SpeakerDetail.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Sources/Conference/Components/SpeakerDetail.swift b/Sources/Conference/Components/SpeakerDetail.swift index 8d5cfc43..65571fcd 100644 --- a/Sources/Conference/Components/SpeakerDetail.swift +++ b/Sources/Conference/Components/SpeakerDetail.swift @@ -41,6 +41,14 @@ struct SpeakerDetail: Component { }.linkTarget(.blank).class("icon") } } + if let blueskyURL = speaker.bluesky { + Link(url: blueskyURL) { + Span { + Image(url: "/App/YearX/images/icons/bluesky.svg", description: "Bluesky") + .class("feather-replacement") + }.linkTarget(.blank).class("icon") + } + } if let linkedInURL = speaker.linkedIn { Link(url: linkedInURL) { Span {