From 0007c9c22f3dc32f5ba55bdbe3debad98f3cfc2b Mon Sep 17 00:00:00 2001 From: Mattia Righetti Date: Sat, 4 Nov 2023 23:59:08 +0100 Subject: [PATCH] feat: flattened ui and add url/comments link --- HNReader.xcodeproj/project.pbxproj | 23 ++- .../UserInterfaceState.xcuserstate | Bin 45376 -> 52293 bytes HNReader/HNReaderApp.swift | 4 +- HNReader/Model/Item.swift | 5 + .../View/ConditionalRedactedModifier.swift | 38 ++++ HNReader/View/ItemCell.swift | 180 +++++++++--------- HNReader/View/ItemList.swift | 15 +- 7 files changed, 158 insertions(+), 107 deletions(-) create mode 100644 HNReader/View/ConditionalRedactedModifier.swift diff --git a/HNReader.xcodeproj/project.pbxproj b/HNReader.xcodeproj/project.pbxproj index 3d6f2d3..5b47b55 100644 --- a/HNReader.xcodeproj/project.pbxproj +++ b/HNReader.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -15,6 +15,7 @@ 330718D415D21296AA14E7CA /* HackerNewsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33071291447141A6D31E671B /* HackerNewsTests.swift */; }; 330719203034BDB177F28C41 /* +DateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33071B0E5439D8D207CB68F4 /* +DateTests.swift */; }; 33071F1C64D4742E1F947FAA /* ItemDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33071D0E5913DB91DDDBDADB /* ItemDownloader.swift */; }; + 5F109D592AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F109D582AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift */; }; C93F99B6267554F00046F870 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B5267554F00046F870 /* ItemCell.swift */; }; C93F99B8267557FC0046F870 /* ItemList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B7267557FC0046F870 /* ItemList.swift */; }; C93F99BA267580CE0046F870 /* HTMLText.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93F99B9267580CE0046F870 /* HTMLText.swift */; }; @@ -49,6 +50,7 @@ 33071D0E5913DB91DDDBDADB /* ItemDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemDownloader.swift; sourceTree = ""; }; 33071E538EC434DF1A245518 /* HackerNewsClientTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HackerNewsClientTests.swift; sourceTree = ""; }; 33071EEBE46634E658582AE3 /* ItemTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ItemTests.swift; sourceTree = ""; }; + 5F109D582AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalRedactedModifier.swift; sourceTree = ""; }; C93F99B5267554F00046F870 /* ItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = ""; }; C93F99B7267557FC0046F870 /* ItemList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemList.swift; sourceTree = ""; }; C93F99B9267580CE0046F870 /* HTMLText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLText.swift; sourceTree = ""; }; @@ -190,6 +192,7 @@ C93F99B5267554F00046F870 /* ItemCell.swift */, C93F99B7267557FC0046F870 /* ItemList.swift */, C9926691267588B80035A88F /* Components */, + 5F109D582AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift */, ); path = View; sourceTree = ""; @@ -269,8 +272,9 @@ C9D0936B26741BBE002CC786 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1250; - LastUpgradeCheck = 1250; + LastUpgradeCheck = 1510; TargetAttributes = { C9D0937226741BBE002CC786 = { CreatedOnToolsVersion = 12.5; @@ -330,6 +334,7 @@ C9D0938026741BBF002CC786 /* Persistence.swift in Sources */, C9D0937926741BBE002CC786 /* HomeView.swift in Sources */, C93F99B6267554F00046F870 /* ItemCell.swift in Sources */, + 5F109D592AF6F50D00AE6AF3 /* ConditionalRedactedModifier.swift in Sources */, C93F99B8267557FC0046F870 /* ItemList.swift in Sources */, C9E9BCFD2674C80E001B4E19 /* AppState.swift in Sources */, C9E9BD032674D095001B4E19 /* User.swift in Sources */, @@ -370,6 +375,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -400,9 +406,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -431,6 +439,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -461,9 +470,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -489,10 +500,11 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = HNReader/HNReader.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"HNReader/Preview Content\""; DEVELOPMENT_TEAM = H89RFW5UZ6; ENABLE_HARDENED_RUNTIME = YES; @@ -521,10 +533,11 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = HNReader/HNReader.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_ASSET_PATHS = "\"HNReader/Preview Content\""; DEVELOPMENT_TEAM = H89RFW5UZ6; ENABLE_HARDENED_RUNTIME = YES; @@ -552,6 +565,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = H89RFW5UZ6; INFOPLIST_FILE = HNReaderTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -574,6 +588,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = H89RFW5UZ6; INFOPLIST_FILE = HNReaderTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/HNReader.xcodeproj/project.xcworkspace/xcuserdata/mattrighetti.xcuserdatad/UserInterfaceState.xcuserstate b/HNReader.xcodeproj/project.xcworkspace/xcuserdata/mattrighetti.xcuserdatad/UserInterfaceState.xcuserstate index e6fcee422632a41e15cd6df74bb5c8d84bf36b18..8e97a0f08b7659d4354451fe955d309ee86c5b2c 100644 GIT binary patch delta 24861 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 mZ&t6gH?Oy-x3qUsZ)I some View { + if isRedacted { + content.redacted(reason: .placeholder) + } else { + content + } + } +} + +extension View { + func redactIfNull(_ obj: Optional) -> some View { + switch obj { + case .none: + return self.modifier(ConditionalRedactedModifier(isRedacted: true)) + case .some(_): + return self.modifier(ConditionalRedactedModifier(isRedacted: false)) + } + } +} + +#Preview { + VStack { + Text("Some Text").redactIfNull(Optional.none) + } + .frame(width: 500, height: 500) +} diff --git a/HNReader/View/ItemCell.swift b/HNReader/View/ItemCell.swift index b286dcb..e6a977d 100644 --- a/HNReader/View/ItemCell.swift +++ b/HNReader/View/ItemCell.swift @@ -20,22 +20,93 @@ struct ItemCell: View { } var body: some View { - VStack(alignment: .leading, spacing: 5) { - TitleView() - HostText() - -// if let text = item.text { -// HTMLText(text: text) -// .font(.body) -// .lineLimit(3) -// .multilineTextAlignment(.leading) -// } - - HStack { - ScoreText() - AuthorText() - Spacer() + HStack { + VStack(alignment: .leading, spacing: 5) { + Text(item?.title ?? String(repeating: "-", count: 30)) + .font(.title2) + .fontWeight(.semibold) + .redactIfNull(item) + + Text(item?.urlHost ?? String(repeating: "-", count: 30)) + .font(.callout) + .fontWeight(.light) + .foregroundColor(.white) + .redactIfNull(item) + + HStack { + Text(item?.scoreString ?? String(repeating: "-", count: 3)) + .font(.callout) + .fontWeight(.bold) + .redactIfNull(item) + + Text("Posted by \(item?.by ?? "?")") + .font(.callout) + .redactIfNull(item) + + Text("\(item?.timeStringRepresentation ?? String(repeating: "-", count: 3))") + .font(.callout) + .redactIfNull(item) + + Spacer() + } } + + HStack { + + ZStack { + RoundedRectangle(cornerRadius: 15) + .foregroundStyle(Color.gray.opacity(0.1)) + .frame(width: 50, height: 50) + + Label(title: {}, icon: { + Image(systemName: "bubble.left") + }) + .padding() + } + .frame(width: 50, height: 50) + .onHover { isHovered in + DispatchQueue.main.async { + if (isHovered) { + NSCursor.pointingHand.push() + } else { + NSCursor.pop() + } + } + } + .onTapGesture { + if let item = item { + guard let url = URL(string: "https://news.ycombinator.com/item?id=\(item.id)") else { return } + NSWorkspace.shared.open(url) + } + } + + ZStack { + RoundedRectangle(cornerRadius: 15) + .foregroundStyle(Color.gray.opacity(0.1)) + .frame(width: 50, height: 50) + + Label(title: {}, icon: { + Image(systemName: "link") + }) + .padding() + } + .frame(width: 50, height: 50) + .onHover { isHovered in + DispatchQueue.main.async { + if (isHovered) { + NSCursor.pointingHand.push() + } else { + NSCursor.pop() + } + } + } + .onTapGesture { + if let item = item { + guard let url = URL(string: item.url!) else { return } + NSWorkspace.shared.open(url) + } + } + }.padding(.leading) } .padding() .background(colorScheme == .dark ? Color.black.opacity(0.3) : Color.white) @@ -45,85 +116,6 @@ struct ItemCell: View { fetchItem() } } - .onTapGesture { - if let item = item { - guard let url = URL(string: item.url!) else { return } - NSWorkspace.shared.open(url) - } - } - } - - @ViewBuilder - private func TitleView() -> some View { - if let item = item { - Text(item.title ?? "No title") - .font(.system(.title, design: .rounded)) - .fontWeight(.bold) - } else { - Text("No title") - .font(.system(.title, design: .rounded)) - .fontWeight(.bold) - .redacted(reason: .placeholder) - } - } - - @ViewBuilder - private func HostText() -> some View { - if let item = item { - Text(item.urlHost ?? "") - .font(.callout) - .fontWeight(.semibold) - .foregroundColor(.blue) - } else { - Text("No url") - .font(.callout) - .fontWeight(.semibold) - .foregroundColor(.blue) - .redacted(reason: .placeholder) - } - } - - @ViewBuilder - private func ScoreText() -> some View { - if let item = item { - Text("\(item.score ?? 0)") - .font(.system(.callout, design: .rounded)) - .foregroundColor(.orange) - .fontWeight(.bold) - } else { - Text("0") - .font(.system(.callout, design: .rounded)) - .foregroundColor(.orange) - .fontWeight(.bold) - .redacted(reason: .placeholder) - } - } - - @ViewBuilder - private func AuthorText() -> some View { - HStack { - Text("•") - .padding(.horizontal, 1) - Text("Posted by") - .foregroundColor(.gray) - if let item = item { - Text("\(item.by ?? "anonymous")") - .foregroundColor(.yellow) - .fontWeight(.bold) - } else { - Text("No author") - .redacted(reason: .placeholder) - } - Text("•") - .padding(.horizontal, 1) - if let item = item { - Text("\(item.timeStringRepresentation ?? "")") - .foregroundColor(.gray) - } else { - Text("").redacted(reason: .placeholder) - } - } - .font(.system(.callout, design: .rounded)) } private func fetchItem() { diff --git a/HNReader/View/ItemList.swift b/HNReader/View/ItemList.swift index d8e7c5b..f2d186a 100644 --- a/HNReader/View/ItemList.swift +++ b/HNReader/View/ItemList.swift @@ -15,19 +15,18 @@ struct ItemList: View { private var itemLimitOptions: [Int] = [25, 50, 100] var body: some View { - ScrollView { - LazyVStack(alignment: .leading) { - ForEach(viewModel.storiesIds, id: \.self) { itemId in - ItemCell(itemId: itemId) - .padding(.horizontal) - } + List { + ForEach(viewModel.storiesIds, id: \.self) { itemId in + ItemCell(itemId: itemId) + .listRowSeparator(.hidden) } - .padding(.vertical) } .onAppear { viewModel.currentNewsSelection = appState.newsSelection } - .onChange(of: appState.newsSelection, perform: fetchItems) + .onChange(of: appState.newsSelection, { + fetchItems(by: appState.newsSelection) + }) .toolbar { MaxItemPicker(enabled: false) Button(action: viewModel.refreshStories) {