Skip to content

Commit 7dd1ba5

Browse files
authored
Merge pull request #190 from makinosp/develop
Develop
2 parents f9b80fc + 627631f commit 7dd1ba5

File tree

11 files changed

+99
-124
lines changed

11 files changed

+99
-124
lines changed

.github/FUNDING.yml

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,4 @@
1-
# These are supported funding model platforms
2-
3-
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4-
patreon: # Replace with a single Patreon username
5-
open_collective: # Replace with a single Open Collective username
1+
github: makinosp
2+
patreon: makinosp
63
ko_fi: makinosp
7-
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8-
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
94
liberapay: makinon
10-
issuehunt: # Replace with a single IssueHunt username
11-
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
12-
polar: # Replace with a single Polar username
13-
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
14-
thanks_dev: # Replace with a single thanks.dev username
15-
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

harmonie/Components/CircleURLImage.swift

Lines changed: 0 additions & 57 deletions
This file was deleted.

harmonie/Components/IconSet.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ enum IconSet {
7272
static var logout: some Iconizable {
7373
Icon("rectangle.portrait.and.arrow.forward")
7474
}
75+
static var photo: some Iconizable {
76+
Icon("photo")
77+
}
7578
static var platform: some Iconizable {
7679
Icon("square.stack.3d.up")
7780
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// CircleURLImage.swift
3+
// Harmonie
4+
//
5+
// Created by makinosp on 2024/06/06.
6+
//
7+
8+
import MemberwiseInit
9+
import SwiftUI
10+
11+
@MemberwiseInit
12+
struct CircleURLImage: View {
13+
@Init(.internal) private let imageUrl: URL?
14+
@Init(.internal, default: nil) private let thumbnailImageUrl: URL?
15+
@Init(.internal) private let size: CGSize
16+
17+
var body: some View {
18+
URLImage(
19+
imageUrl: imageUrl,
20+
thumbnailImageUrl: thumbnailImageUrl,
21+
shape: Circle(),
22+
size: size
23+
)
24+
}
25+
}

harmonie/Components/GradientOverlayImageView.swift renamed to harmonie/Components/URLImage/GradientOverlayImageView.swift

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,25 @@ import NukeUI
1010
import SwiftUI
1111

1212
@MemberwiseInit
13-
struct GradientOverlayImageView<TopContent, BottomContent>: View where TopContent: View, BottomContent: View {
13+
struct GradientOverlayImageView<T, B>: View where T: View, B: View {
1414
@Init(.internal) private let imageUrl: URL?
1515
@Init(.internal, default: nil) private let thumbnailImageUrl: URL?
16-
@Init(.internal) private let height: CGFloat
17-
@Init(.internal) private let maxWidth: CGFloat
16+
@Init(.internal) private let size: CGSize
1817
@Init(.internal, default: Gradient(colors: [.black.opacity(0.5), .clear])) private let gradient: Gradient
19-
@Init(.internal, default: { EmptyView() }, escaping: true) private let topContent: () -> TopContent
20-
@Init(.internal, default: { EmptyView() }, escaping: true) private let bottomContent: () -> BottomContent
18+
@Init(.internal, default: { EmptyView() }, escaping: true) private let topContent: () -> T
19+
@Init(.internal, default: { EmptyView() }, escaping: true) private let bottomContent: () -> B
2120

2221
var body: some View {
23-
lazyImage(url: imageUrl) {
24-
lazyImage(url: thumbnailImageUrl) {
25-
Color(.systemFill)
26-
}
27-
}
22+
URLImage(
23+
imageUrl: imageUrl,
24+
thumbnailImageUrl: thumbnailImageUrl,
25+
size: size
26+
)
2827
.overlay {
29-
overlaidGradient(.top, TopContent.self != EmptyView.self)
28+
overlaidGradient(.top, T.self != EmptyView.self)
3029
}
3130
.overlay {
32-
overlaidGradient(.bottom, BottomContent.self != EmptyView.self)
31+
overlaidGradient(.bottom, B.self != EmptyView.self)
3332
}
3433
.overlay(alignment: .top) {
3534
overlaidContent(topContent)
@@ -39,23 +38,6 @@ struct GradientOverlayImageView<TopContent, BottomContent>: View where TopConten
3938
}
4039
}
4140

42-
private func lazyImage(url: URL?, placeholder: @escaping () -> some View) -> some View {
43-
LazyImage(url: url) { state in
44-
if let image = state.image {
45-
image
46-
.resizable()
47-
.aspectRatio(contentMode: .fill)
48-
} else if state.error != nil {
49-
IconSet.exclamation.icon
50-
} else {
51-
placeholder()
52-
}
53-
}
54-
.frame(height: height)
55-
.frame(maxWidth: maxWidth)
56-
.clipped()
57-
}
58-
5941
@ViewBuilder
6042
private func overlaidGradient(_ startPoint: UnitPoint, _ isVisible: Bool) -> some View {
6143
if isVisible {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// SquareURLImage.swift
3+
// Harmonie
4+
//
5+
// Created by makinosp on 2024/09/07.
6+
//
7+
8+
import MemberwiseInit
9+
import SwiftUI
10+
11+
@MemberwiseInit
12+
struct SquareURLImage: View {
13+
@State private var isImageLoaded = false
14+
@Init(.internal) private let imageUrl: URL?
15+
@Init(.internal, default: nil) private let thumbnailImageUrl: URL?
16+
@Init(.internal, default: 100) private let frameWidth: CGFloat
17+
@Init(.internal, default: 4) private let cornerRadius: CGFloat
18+
@Init(.internal, default: 3/4) private let ratio: CGFloat
19+
20+
var body: some View {
21+
URLImage(
22+
imageUrl: imageUrl,
23+
thumbnailImageUrl: thumbnailImageUrl,
24+
shape: RoundedRectangle(cornerRadius: cornerRadius),
25+
size: size
26+
)
27+
}
28+
29+
private var size: CGSize {
30+
CGSize(width: frameWidth, height: frameWidth * ratio)
31+
}
32+
}
Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,40 @@
11
//
2-
// SquareURLImage.swift
2+
// URLImage.swift
33
// Harmonie
44
//
5-
// Created by makinosp on 2024/09/07.
5+
// Created by makinosp on 2024/11/11.
66
//
77

8-
import NukeUI
98
import MemberwiseInit
9+
import NukeUI
1010
import SwiftUI
1111

1212
@MemberwiseInit
13-
struct SquareURLImage: View {
13+
struct URLImage<S>: View where S: Shape {
1414
@State private var isImageLoaded = false
1515
@Init(.internal) private let imageUrl: URL?
1616
@Init(.internal, default: nil) private let thumbnailImageUrl: URL?
17-
@Init(.internal, default: 100) private let frameWidth: CGFloat
18-
@Init(.internal, default: 4) private let cornerRadius: CGFloat
19-
@Init(.internal, default: 3/4) private let ratio: CGFloat
20-
21-
var rect: some Shape {
22-
RoundedRectangle(cornerRadius: cornerRadius)
23-
}
17+
@Init(.internal, default: Rectangle()) private let shape: S
18+
@Init(.internal) private let size: CGSize
19+
private let color = Color(.systemFill)
2420

2521
var body: some View {
2622
lazyImage(url: imageUrl) {
2723
lazyImage(url: thumbnailImageUrl) {
28-
rect.fill(Color(.systemFill))
24+
emptyPlaceholder
2925
}
3026
}
3127
}
3228

33-
func lazyImage(url: URL?, placeholder: @escaping () -> some View) -> some View {
29+
private func lazyImage(url: URL?, placeholder: @escaping () -> some View) -> some View {
3430
LazyImage(url: url) { state in
3531
if let image = state.image {
3632
image
3733
.resizable()
3834
.scaledToFill()
3935
} else if url != nil && state.error != nil {
40-
IconSet.exclamation.icon
36+
placeholder()
37+
.overlay(IconSet.photo.icon)
4138
} else {
4239
placeholder()
4340
}
@@ -46,7 +43,13 @@ struct SquareURLImage: View {
4643
isImageLoaded = true
4744
}
4845
.animation(.default, value: isImageLoaded)
49-
.frame(width: frameWidth, height: frameWidth * ratio)
50-
.clipShape(rect)
46+
.frame(size: size)
47+
.clipShape(shape)
48+
}
49+
50+
private var emptyPlaceholder: some View {
51+
shape
52+
.fill(color)
53+
.frame(size: size)
5154
}
5255
}

harmonie/ViewModels/AppViewModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ final class AppViewModel {
9494
func verifyTwoFA(code: String) async {
9595
guard let verifyType = verifyType else { return }
9696
do {
97-
defer { reset() }
97+
defer { dispose() }
9898
guard try await services.authenticationService.verify2FA(
9999
verifyType: verifyType,
100100
code: code
@@ -109,13 +109,13 @@ final class AppViewModel {
109109
func logout() async {
110110
do {
111111
try await services.authenticationService.logout()
112-
reset()
112+
dispose()
113113
} catch {
114114
handleError(error)
115115
}
116116
}
117117

118-
private func reset() {
118+
private func dispose() {
119119
userDefaults.removeObject(forKey: Constants.Keys.isSavedOnKeyChain.rawValue)
120120
userDefaults.removeObject(forKey: Constants.Keys.username.rawValue)
121121
step = .initializing

harmonie/ViewModels/FriendViewModel+Filters.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ extension FriendViewModel {
3232
case .latest: false
3333
case .oldest: true
3434
case .name: $0.displayName < $1.displayName
35-
case .loginLatest: $0.lastLogin < $1.lastLogin
36-
case .loginOldest: $0.lastLogin > $1.lastLogin
35+
case .loginLatest: $0.lastLogin > $1.lastLogin
36+
case .loginOldest: $0.lastLogin < $1.lastLogin
3737
case .status: $0.status.rawValue < $1.status.rawValue
3838
}
3939
}

harmonie/Views/UserDetail/UserDetailView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ struct UserDetailView: View {
3030
GradientOverlayImageView(
3131
imageUrl: user.imageUrl(.x1024),
3232
thumbnailImageUrl: user.imageUrl(.x256),
33-
height: 250,
34-
maxWidth: appVM.screenSize.width,
33+
size: CGSize(width: appVM.screenSize.width, height: 250),
3534
topContent: { topOverlay },
3635
bottomContent: { bottomOverlay }
3736
)

0 commit comments

Comments
 (0)