From dec26aeeb888be3f055fc378a568e127999abc83 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:21:44 +0200 Subject: [PATCH 01/12] Moved info.plist --- OpenTweet/{ => Supporting Files}/Info.plist | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename OpenTweet/{ => Supporting Files}/Info.plist (100%) diff --git a/OpenTweet/Info.plist b/OpenTweet/Supporting Files/Info.plist similarity index 100% rename from OpenTweet/Info.plist rename to OpenTweet/Supporting Files/Info.plist From e62c452183591e965a6f5f1bddd4f19ffe501080 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:22:04 +0200 Subject: [PATCH 02/12] Updated project settings --- OpenTweet.xcodeproj/project.pbxproj | 168 ++++++++++++++++-- .../xcshareddata/xcschemes/OpenTweet.xcscheme | 2 +- 2 files changed, 153 insertions(+), 17 deletions(-) diff --git a/OpenTweet.xcodeproj/project.pbxproj b/OpenTweet.xcodeproj/project.pbxproj index 8ab1732..c721373 100644 --- a/OpenTweet.xcodeproj/project.pbxproj +++ b/OpenTweet.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -15,6 +15,17 @@ 009C4C811D9F0CD600F0BC6C /* OpenTweetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009C4C801D9F0CD600F0BC6C /* OpenTweetTests.swift */; }; 009C4C8C1D9F0CD600F0BC6C /* OpenTweetUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009C4C8B1D9F0CD600F0BC6C /* OpenTweetUITests.swift */; }; 009C4C9B1D9F0D4100F0BC6C /* timeline.json in Resources */ = {isa = PBXBuildFile; fileRef = 009C4C9A1D9F0D4100F0BC6C /* timeline.json */; }; + B24E8C222BD3DB4600B15535 /* Tweet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C212BD3DB4600B15535 /* Tweet.swift */; }; + B24E8C242BD3DC3100B15535 /* UIImageView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C232BD3DC3100B15535 /* UIImageView+Extensions.swift */; }; + B24E8C262BD3DC4B00B15535 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C252BD3DC4B00B15535 /* String+Extensions.swift */; }; + B24E8C292BD3DD3500B15535 /* Bundle+Decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C282BD3DD3500B15535 /* Bundle+Decode.swift */; }; + B24E8C2B2BD3DDB400B15535 /* FeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C2A2BD3DDB400B15535 /* FeedViewModel.swift */; }; + B24E8C2D2BD3DE1500B15535 /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C2C2BD3DE1500B15535 /* NetworkService.swift */; }; + B24E8C302BD3E01F00B15535 /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C2F2BD3E01F00B15535 /* Timeline.swift */; }; + B24E8C382BD3E5AD00B15535 /* TweetCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B24E8C372BD3E5AD00B15535 /* TweetCell.xib */; }; + B24E8C392BD3E5AD00B15535 /* TweetCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C362BD3E5AD00B15535 /* TweetCell.swift */; }; + B24E8C3B2BD3ED7500B15535 /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C3A2BD3ED7500B15535 /* Date+Extensions.swift */; }; + B24E8C402BD3F66000B15535 /* Identifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24E8C3F2BD3F66000B15535 /* Identifiable.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -50,6 +61,17 @@ 009C4C8D1D9F0CD600F0BC6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 009C4C9A1D9F0D4100F0BC6C /* timeline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = timeline.json; sourceTree = ""; }; 009C4C9D1D9F104800F0BC6C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + B24E8C212BD3DB4600B15535 /* Tweet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tweet.swift; sourceTree = ""; }; + B24E8C232BD3DC3100B15535 /* UIImageView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Extensions.swift"; sourceTree = ""; }; + B24E8C252BD3DC4B00B15535 /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; + B24E8C282BD3DD3500B15535 /* Bundle+Decode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Decode.swift"; sourceTree = ""; }; + B24E8C2A2BD3DDB400B15535 /* FeedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedViewModel.swift; sourceTree = ""; }; + B24E8C2C2BD3DE1500B15535 /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; + B24E8C2F2BD3E01F00B15535 /* Timeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timeline.swift; sourceTree = ""; }; + B24E8C362BD3E5AD00B15535 /* TweetCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TweetCell.swift; sourceTree = ""; }; + B24E8C372BD3E5AD00B15535 /* TweetCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TweetCell.xib; sourceTree = ""; }; + B24E8C3A2BD3ED7500B15535 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; + B24E8C3F2BD3F66000B15535 /* Identifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Identifiable.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -103,11 +125,12 @@ isa = PBXGroup; children = ( 009C4C6B1D9F0CD600F0BC6C /* AppDelegate.swift */, - 009C4C6D1D9F0CD600F0BC6C /* TimelineViewController.swift */, - 009C4C6F1D9F0CD600F0BC6C /* Main.storyboard */, - 009C4C741D9F0CD600F0BC6C /* LaunchScreen.storyboard */, - 009C4C721D9F0CD600F0BC6C /* Assets.xcassets */, - 009C4C771D9F0CD600F0BC6C /* Info.plist */, + B24E8C192BD3BE9900B15535 /* Scenes */, + B24E8C1E2BD3BFE900B15535 /* Helpers */, + B24E8C1D2BD3BFD600B15535 /* Services */, + B24E8C272BD3DC8100B15535 /* Entity */, + B24E8C172BD3BE4700B15535 /* Supporting Files */, + B24E8C162BD3BE0A00B15535 /* Assets */, ); path = OpenTweet; sourceTree = ""; @@ -138,6 +161,80 @@ path = Data; sourceTree = ""; }; + B24E8C162BD3BE0A00B15535 /* Assets */ = { + isa = PBXGroup; + children = ( + 009C4C721D9F0CD600F0BC6C /* Assets.xcassets */, + ); + path = Assets; + sourceTree = ""; + }; + B24E8C172BD3BE4700B15535 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 009C4C771D9F0CD600F0BC6C /* Info.plist */, + ); + path = "Supporting Files"; + sourceTree = ""; + }; + B24E8C192BD3BE9900B15535 /* Scenes */ = { + isa = PBXGroup; + children = ( + B24E8C1C2BD3BFB700B15535 /* Feed */, + B24E8C1A2BD3BF9C00B15535 /* LaunchScreen */, + ); + path = Scenes; + sourceTree = ""; + }; + B24E8C1A2BD3BF9C00B15535 /* LaunchScreen */ = { + isa = PBXGroup; + children = ( + 009C4C741D9F0CD600F0BC6C /* LaunchScreen.storyboard */, + ); + path = LaunchScreen; + sourceTree = ""; + }; + B24E8C1C2BD3BFB700B15535 /* Feed */ = { + isa = PBXGroup; + children = ( + B24E8C362BD3E5AD00B15535 /* TweetCell.swift */, + B24E8C372BD3E5AD00B15535 /* TweetCell.xib */, + B24E8C2A2BD3DDB400B15535 /* FeedViewModel.swift */, + 009C4C6D1D9F0CD600F0BC6C /* TimelineViewController.swift */, + 009C4C6F1D9F0CD600F0BC6C /* Main.storyboard */, + ); + path = Feed; + sourceTree = ""; + }; + B24E8C1D2BD3BFD600B15535 /* Services */ = { + isa = PBXGroup; + children = ( + B24E8C2C2BD3DE1500B15535 /* NetworkService.swift */, + ); + path = Services; + sourceTree = ""; + }; + B24E8C1E2BD3BFE900B15535 /* Helpers */ = { + isa = PBXGroup; + children = ( + B24E8C232BD3DC3100B15535 /* UIImageView+Extensions.swift */, + B24E8C252BD3DC4B00B15535 /* String+Extensions.swift */, + B24E8C3A2BD3ED7500B15535 /* Date+Extensions.swift */, + B24E8C282BD3DD3500B15535 /* Bundle+Decode.swift */, + B24E8C3F2BD3F66000B15535 /* Identifiable.swift */, + ); + path = Helpers; + sourceTree = ""; + }; + B24E8C272BD3DC8100B15535 /* Entity */ = { + isa = PBXGroup; + children = ( + B24E8C212BD3DB4600B15535 /* Tweet.swift */, + B24E8C2F2BD3E01F00B15535 /* Timeline.swift */, + ); + path = Entity; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -200,8 +297,9 @@ 009C4C601D9F0CD600F0BC6C /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1530; ORGANIZATIONNAME = "OpenTable, Inc."; TargetAttributes = { 009C4C671D9F0CD600F0BC6C = { @@ -249,6 +347,7 @@ buildActionMask = 2147483647; files = ( 009C4C9B1D9F0D4100F0BC6C /* timeline.json in Resources */, + B24E8C382BD3E5AD00B15535 /* TweetCell.xib in Resources */, 009C4C761D9F0CD600F0BC6C /* LaunchScreen.storyboard in Resources */, 009C4C731D9F0CD600F0BC6C /* Assets.xcassets in Resources */, 009C4C711D9F0CD600F0BC6C /* Main.storyboard in Resources */, @@ -276,8 +375,18 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B24E8C302BD3E01F00B15535 /* Timeline.swift in Sources */, + B24E8C402BD3F66000B15535 /* Identifiable.swift in Sources */, + B24E8C3B2BD3ED7500B15535 /* Date+Extensions.swift in Sources */, + B24E8C2B2BD3DDB400B15535 /* FeedViewModel.swift in Sources */, + B24E8C262BD3DC4B00B15535 /* String+Extensions.swift in Sources */, + B24E8C2D2BD3DE1500B15535 /* NetworkService.swift in Sources */, + B24E8C222BD3DB4600B15535 /* Tweet.swift in Sources */, 009C4C6E1D9F0CD600F0BC6C /* TimelineViewController.swift in Sources */, 009C4C6C1D9F0CD600F0BC6C /* AppDelegate.swift in Sources */, + B24E8C392BD3E5AD00B15535 /* TweetCell.swift in Sources */, + B24E8C242BD3DC3100B15535 /* UIImageView+Extensions.swift in Sources */, + B24E8C292BD3DD3500B15535 /* Bundle+Decode.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -336,6 +445,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -369,6 +479,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -397,6 +508,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -430,6 +542,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -441,7 +554,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -452,9 +566,12 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = QPU8QS3E62; - INFOPLIST_FILE = OpenTweet/Info.plist; + INFOPLIST_FILE = "OpenTweet/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -466,9 +583,12 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = QPU8QS3E62; - INFOPLIST_FILE = OpenTweet/Info.plist; + INFOPLIST_FILE = "OpenTweet/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -483,7 +603,11 @@ DEVELOPMENT_TEAM = QPU8QS3E62; INFOPLIST_FILE = OpenTweetTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweetTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -499,7 +623,11 @@ DEVELOPMENT_TEAM = QPU8QS3E62; INFOPLIST_FILE = OpenTweetTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweetTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -514,7 +642,11 @@ DEVELOPMENT_TEAM = QPU8QS3E62; INFOPLIST_FILE = OpenTweetUITests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweetUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -529,7 +661,11 @@ DEVELOPMENT_TEAM = QPU8QS3E62; INFOPLIST_FILE = OpenTweetUITests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.opentable.OpenTweetUITests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/OpenTweet.xcodeproj/xcshareddata/xcschemes/OpenTweet.xcscheme b/OpenTweet.xcodeproj/xcshareddata/xcschemes/OpenTweet.xcscheme index 354f211..5c95fb3 100644 --- a/OpenTweet.xcodeproj/xcshareddata/xcschemes/OpenTweet.xcscheme +++ b/OpenTweet.xcodeproj/xcshareddata/xcschemes/OpenTweet.xcscheme @@ -1,6 +1,6 @@ Date: Sat, 20 Apr 2024 16:22:18 +0200 Subject: [PATCH 03/12] Added new assets --- .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../allthethings.imageset/Contents.json | 0 .../allthethings.imageset/allthethings.jpg | Bin .../placeholder.imageset/Contents.json | 21 ++++++++++++++++++ ...site webpage with avatar user_6808821.png" | Bin 0 -> 95244 bytes 6 files changed, 21 insertions(+) rename OpenTweet/{ => Assets}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename OpenTweet/{ => Assets}/Assets.xcassets/Contents.json (100%) rename OpenTweet/{ => Assets}/Assets.xcassets/allthethings.imageset/Contents.json (100%) rename OpenTweet/{ => Assets}/Assets.xcassets/allthethings.imageset/allthethings.jpg (100%) create mode 100644 OpenTweet/Assets/Assets.xcassets/placeholder.imageset/Contents.json create mode 100644 "OpenTweet/Assets/Assets.xcassets/placeholder.imageset/\342\200\224Pngtree\342\200\224exquisite webpage with avatar user_6808821.png" diff --git a/OpenTweet/Assets.xcassets/AppIcon.appiconset/Contents.json b/OpenTweet/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from OpenTweet/Assets.xcassets/AppIcon.appiconset/Contents.json rename to OpenTweet/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/OpenTweet/Assets.xcassets/Contents.json b/OpenTweet/Assets/Assets.xcassets/Contents.json similarity index 100% rename from OpenTweet/Assets.xcassets/Contents.json rename to OpenTweet/Assets/Assets.xcassets/Contents.json diff --git a/OpenTweet/Assets.xcassets/allthethings.imageset/Contents.json b/OpenTweet/Assets/Assets.xcassets/allthethings.imageset/Contents.json similarity index 100% rename from OpenTweet/Assets.xcassets/allthethings.imageset/Contents.json rename to OpenTweet/Assets/Assets.xcassets/allthethings.imageset/Contents.json diff --git a/OpenTweet/Assets.xcassets/allthethings.imageset/allthethings.jpg b/OpenTweet/Assets/Assets.xcassets/allthethings.imageset/allthethings.jpg similarity index 100% rename from OpenTweet/Assets.xcassets/allthethings.imageset/allthethings.jpg rename to OpenTweet/Assets/Assets.xcassets/allthethings.imageset/allthethings.jpg diff --git a/OpenTweet/Assets/Assets.xcassets/placeholder.imageset/Contents.json b/OpenTweet/Assets/Assets.xcassets/placeholder.imageset/Contents.json new file mode 100644 index 0000000..6281b67 --- /dev/null +++ b/OpenTweet/Assets/Assets.xcassets/placeholder.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "—Pngtree—exquisite webpage with avatar user_6808821.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/OpenTweet/Assets/Assets.xcassets/placeholder.imageset/\342\200\224Pngtree\342\200\224exquisite webpage with avatar user_6808821.png" "b/OpenTweet/Assets/Assets.xcassets/placeholder.imageset/\342\200\224Pngtree\342\200\224exquisite webpage with avatar user_6808821.png" new file mode 100644 index 0000000000000000000000000000000000000000..cd3d046035e635ae76275ff8d0da541280a58fd7 GIT binary patch literal 95244 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

3s^jFq)%;07q)Ei4j9{I4FSg9 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 Date: Sat, 20 Apr 2024 16:22:45 +0200 Subject: [PATCH 04/12] Implemented the new entities --- OpenTweet/Entity/Timeline.swift | 32 ++++++++++++++++++++++++++++++++ OpenTweet/Entity/Tweet.swift | 29 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 OpenTweet/Entity/Timeline.swift create mode 100644 OpenTweet/Entity/Tweet.swift diff --git a/OpenTweet/Entity/Timeline.swift b/OpenTweet/Entity/Timeline.swift new file mode 100644 index 0000000..6c55695 --- /dev/null +++ b/OpenTweet/Entity/Timeline.swift @@ -0,0 +1,32 @@ +// +// Timeline.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +struct Timeline: Decodable { + let tweets: [Tweet] +} + +extension Timeline { + private enum CodingKeys: String, CodingKey { + case tweets = "timeline" + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.tweets = try container.decode([Tweet].self, forKey: .tweets) + } +} + +extension Timeline { + func convert() -> TimelineViewModel { + TimelineViewModel(tweets: tweets.map { + TweetViewModel(username: $0.author, date: $0.dateString.date(), content: $0.content, imageURL: $0.avatar) + }) + } +} diff --git a/OpenTweet/Entity/Tweet.swift b/OpenTweet/Entity/Tweet.swift new file mode 100644 index 0000000..2af4f7a --- /dev/null +++ b/OpenTweet/Entity/Tweet.swift @@ -0,0 +1,29 @@ +// +// Tweet.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +struct Tweet: Decodable { + let id: String + let author: String + let content: String + let avatar: URL? + let dateString: String + let inReplyTo: String? +} + +extension Tweet { + private enum CodingKeys: String, CodingKey { + case id + case author + case content + case avatar + case dateString = "date" + case inReplyTo + } +} From bc504b1b6fe84aee84dca3d43a442e7ebba0082d Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:23:29 +0200 Subject: [PATCH 05/12] Implemented the loading service --- OpenTweet/Helpers/Bundle+Decode.swift | 32 +++++++++++++++++++++++++ OpenTweet/Services/NetworkService.swift | 28 ++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 OpenTweet/Helpers/Bundle+Decode.swift create mode 100644 OpenTweet/Services/NetworkService.swift diff --git a/OpenTweet/Helpers/Bundle+Decode.swift b/OpenTweet/Helpers/Bundle+Decode.swift new file mode 100644 index 0000000..1a530c0 --- /dev/null +++ b/OpenTweet/Helpers/Bundle+Decode.swift @@ -0,0 +1,32 @@ +// +// Bundle+Decode.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +extension Bundle { + private func failableDecode(jsonFileNamed fileName: String, decoder: JSONDecoder) throws -> T { + guard let url = self.url(forResource: fileName, withExtension: "json") else { + throw JSONNotFoundError() + } + + return try decoder.decode(T.self, from: url) + } + + func decode(jsonFileNamed fileName: String, decoder: JSONDecoder = JSONDecoder()) -> T { + try! failableDecode(jsonFileNamed: fileName, decoder: decoder) + } +} + +extension JSONDecoder { + final func decode(_ type: T.Type, from url: URL) throws -> T { + let data = try Data(contentsOf: url) + return try decode(T.self, from: data) + } +} + +struct JSONNotFoundError: Error {} diff --git a/OpenTweet/Services/NetworkService.swift b/OpenTweet/Services/NetworkService.swift new file mode 100644 index 0000000..9f42ca8 --- /dev/null +++ b/OpenTweet/Services/NetworkService.swift @@ -0,0 +1,28 @@ +// +// DataProvider.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +protocol NetworkServiceProtocol { + func timeline() -> Timeline + func getData(from url: URL) async throws -> (Data, URLResponse) +} + +class NetworkService: NetworkServiceProtocol { + static let shared = NetworkService() + private init() {} + + func timeline() -> Timeline { + let timeline: Timeline = Bundle.main.decode(jsonFileNamed: "timeline") + return timeline + } + + func getData(from url: URL) async throws -> (Data, URLResponse) { + try await URLSession.shared.data(from: url) + } +} From f0393b998723885c91cccef52fcc00bd9d1c3a31 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:23:36 +0200 Subject: [PATCH 06/12] Create FeedViewModel.swift --- OpenTweet/Scenes/Feed/FeedViewModel.swift | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 OpenTweet/Scenes/Feed/FeedViewModel.swift diff --git a/OpenTweet/Scenes/Feed/FeedViewModel.swift b/OpenTweet/Scenes/Feed/FeedViewModel.swift new file mode 100644 index 0000000..bba5be2 --- /dev/null +++ b/OpenTweet/Scenes/Feed/FeedViewModel.swift @@ -0,0 +1,36 @@ +// +// FeedViewModel.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +struct TimelineViewModel { + let tweets: [TweetViewModel] +} + +protocol FeedViewModelProtocol { + var timeline: TimelineViewModel { get } + + func fetchTimeline() +} + +final class FeedViewModel { + private let service: NetworkServiceProtocol + + var timeline = TimelineViewModel(tweets: []) + + init(service: NetworkServiceProtocol = NetworkService.shared) { + self.service = service + } +} + +extension FeedViewModel: FeedViewModelProtocol { + func fetchTimeline() { + self.timeline = service.timeline().convert() + } +} + From deff2571cf691a56f721c9c8d9fe53c2ee876cf7 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:24:14 +0200 Subject: [PATCH 07/12] Implemented the required extensions --- OpenTweet/Helpers/Date+Extensions.swift | 24 ++++++++++++ OpenTweet/Helpers/Identifiable.swift | 33 +++++++++++++++++ OpenTweet/Helpers/String+Extensions.swift | 16 ++++++++ .../Helpers/UIImageView+Extensions.swift | 37 +++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 OpenTweet/Helpers/Date+Extensions.swift create mode 100644 OpenTweet/Helpers/Identifiable.swift create mode 100644 OpenTweet/Helpers/String+Extensions.swift create mode 100644 OpenTweet/Helpers/UIImageView+Extensions.swift diff --git a/OpenTweet/Helpers/Date+Extensions.swift b/OpenTweet/Helpers/Date+Extensions.swift new file mode 100644 index 0000000..5b4c80e --- /dev/null +++ b/OpenTweet/Helpers/Date+Extensions.swift @@ -0,0 +1,24 @@ +// +// Date+Extension.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +extension Date { + func string(using dateFormatter: DateFormatter) -> String { + dateFormatter.string(from: self) + } +} + +extension DateFormatter { + static let tweetDateFormatter = DateFormatter(format: "dd.MM.yy") + + convenience init(format: String) { + self.init() + self.dateFormat = format + } +} diff --git a/OpenTweet/Helpers/Identifiable.swift b/OpenTweet/Helpers/Identifiable.swift new file mode 100644 index 0000000..39c45b9 --- /dev/null +++ b/OpenTweet/Helpers/Identifiable.swift @@ -0,0 +1,33 @@ +// +// Identifiable.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import UIKit + +public protocol Identifiable { + /// The type's identifier + static var identifier: String { get } +} + +extension Identifiable { + /// Default implementation – returns the type name itself + public static var identifier: String { + String(describing: self) + } +} + +public protocol NibLoadable: AnyObject { + static var nib: UINib { get } +} + +extension NibLoadable where Self: Identifiable { + public static var nib: UINib { + UINib(nibName: identifier, bundle: .main) + } +} + +extension UIView: Identifiable {} diff --git a/OpenTweet/Helpers/String+Extensions.swift b/OpenTweet/Helpers/String+Extensions.swift new file mode 100644 index 0000000..328e163 --- /dev/null +++ b/OpenTweet/Helpers/String+Extensions.swift @@ -0,0 +1,16 @@ +// +// String+Extensions.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import Foundation + +extension String { + func date() -> Date { + let dateFormatter = ISO8601DateFormatter() + return dateFormatter.date(from: self)! + } +} diff --git a/OpenTweet/Helpers/UIImageView+Extensions.swift b/OpenTweet/Helpers/UIImageView+Extensions.swift new file mode 100644 index 0000000..13edfca --- /dev/null +++ b/OpenTweet/Helpers/UIImageView+Extensions.swift @@ -0,0 +1,37 @@ +// +// UIImage+Extensions.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import UIKit + +let imageCache = NSCache() + +extension UIImageView { + public func setImage(with url: URL?, placeholder: UIImage = UIImage(imageLiteralResourceName: "placeholder")) { + guard let url = url else { + self.image = placeholder + return + } + + // check cached image + if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) { + self.image = cachedImage + return + } + + self.image = placeholder + Task { [weak self] in + let (data, _) = try await NetworkService.shared.getData(from: url) + guard let image = UIImage(data: data) else { + return + } + + imageCache.setObject(image, forKey: url.absoluteString as NSString) + self?.image = image + } + } +} From 2d26fef2fe27b8d3678eaf2b2e951bfbbbebdb8d Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:24:25 +0200 Subject: [PATCH 08/12] Implemented the tweet cell --- OpenTweet/Scenes/Feed/TweetCell.swift | 45 +++++++++++++ OpenTweet/Scenes/Feed/TweetCell.xib | 96 +++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 OpenTweet/Scenes/Feed/TweetCell.swift create mode 100644 OpenTweet/Scenes/Feed/TweetCell.xib diff --git a/OpenTweet/Scenes/Feed/TweetCell.swift b/OpenTweet/Scenes/Feed/TweetCell.swift new file mode 100644 index 0000000..2c9221d --- /dev/null +++ b/OpenTweet/Scenes/Feed/TweetCell.swift @@ -0,0 +1,45 @@ +// +// TweetCell.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import UIKit + +struct TweetViewModel { + var username: String + var date: Date + var content: String + var imageURL: URL? +} + +final class TweetCell: UICollectionViewCell, NibLoadable { + @IBOutlet private var imageView: UIImageView! { + didSet { + imageView.layer.cornerRadius = 20 + imageView.layer.masksToBounds = true + } + } + @IBOutlet private var usernameLabel: UILabel! + @IBOutlet private var dateLabel: UILabel! + @IBOutlet private var contentLabel: UILabel! + + override func prepareForReuse() { + imageView.image = nil + } + + func update(with viewModel: TweetViewModel) { + imageView.setImage(with: viewModel.imageURL) + usernameLabel.text = viewModel.username + dateLabel.text = viewModel.date.string(using: .tweetDateFormatter).appendSeparator() + contentLabel.text = viewModel.content + } +} + +private extension String { + func appendSeparator() -> String { + ["·", self].joined(separator: " ") + } +} diff --git a/OpenTweet/Scenes/Feed/TweetCell.xib b/OpenTweet/Scenes/Feed/TweetCell.xib new file mode 100644 index 0000000..b5ac7dd --- /dev/null +++ b/OpenTweet/Scenes/Feed/TweetCell.xib @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7ef551858a30ae61cfe199bcf0a4beda87633a34 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:24:37 +0200 Subject: [PATCH 09/12] Implemented the feed controller --- OpenTweet/Base.lproj/Main.storyboard | 27 ------ .../Helpers/UICollectionView+Extensions.swift | 34 +++++++ .../Scenes/Feed/Base.lproj/Main.storyboard | 88 +++++++++++++++++++ .../Scenes/Feed/TimelineViewController.swift | 68 ++++++++++++++ .../Base.lproj/LaunchScreen.storyboard | 0 OpenTweet/TimelineViewController.swift | 19 ---- 6 files changed, 190 insertions(+), 46 deletions(-) delete mode 100644 OpenTweet/Base.lproj/Main.storyboard create mode 100644 OpenTweet/Helpers/UICollectionView+Extensions.swift create mode 100644 OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard create mode 100644 OpenTweet/Scenes/Feed/TimelineViewController.swift rename OpenTweet/{ => Scenes/LaunchScreen}/Base.lproj/LaunchScreen.storyboard (100%) delete mode 100644 OpenTweet/TimelineViewController.swift diff --git a/OpenTweet/Base.lproj/Main.storyboard b/OpenTweet/Base.lproj/Main.storyboard deleted file mode 100644 index f8b7281..0000000 --- a/OpenTweet/Base.lproj/Main.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenTweet/Helpers/UICollectionView+Extensions.swift b/OpenTweet/Helpers/UICollectionView+Extensions.swift new file mode 100644 index 0000000..4a7f989 --- /dev/null +++ b/OpenTweet/Helpers/UICollectionView+Extensions.swift @@ -0,0 +1,34 @@ +// +// UICollectionView+Extensions.swift +// OpenTweet +// +// Created by Farzan Abdollahi on 20.04.24. +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import UIKit + +extension UICollectionView { + + public func dequeueReusableCell(for indexPath: IndexPath) -> T { + guard let cell = dequeueReusableCell(withReuseIdentifier: T.identifier, for: indexPath) as? T else { + fatalError("Unknown cell reuse identifier \(T.identifier)") + } + return cell + } + + public func dequeueReusableSupplementaryView(ofKind kind: String, for indexPath: IndexPath) -> T { + guard let view = dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: T.identifier, for: indexPath) as? T else { + fatalError("Unknown supplementary view reuse identifier \(T.identifier)") + } + return view + } + + public func register(cell: T.Type) where T: ClassLoadable { + register(cell, forCellWithReuseIdentifier: cell.reuseIdentifier) + } + + public func register(cell: T.Type) where T: NibLoadable { + register(cell.nib, forCellWithReuseIdentifier: cell.identifier) + } +} diff --git a/OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard b/OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard new file mode 100644 index 0000000..41c0412 --- /dev/null +++ b/OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenTweet/Scenes/Feed/TimelineViewController.swift b/OpenTweet/Scenes/Feed/TimelineViewController.swift new file mode 100644 index 0000000..01bdd8c --- /dev/null +++ b/OpenTweet/Scenes/Feed/TimelineViewController.swift @@ -0,0 +1,68 @@ +// +// Copyright © 2024 OpenTable, Inc. All rights reserved. +// + +import UIKit + +class TimelineViewController: UIViewController { + + @IBOutlet private var collectionView: UICollectionView! { + didSet { + configureDataSourceCellProviders() + collectionView.collectionViewLayout = collectionViewLayout + collectionView.delegate = self + collectionView.dataSource = self + } + } + + let viewModel: FeedViewModelProtocol = FeedViewModel() + + override func viewDidLoad() { + super.viewDidLoad() + viewModel.fetchTimeline() + } +} + +private extension TimelineViewController { + var collectionViewLayout: UICollectionViewLayout { + UICollectionViewCompositionalLayout { [weak self] sectionIndex, layoutEnvironment in + guard let self = self else { + return nil + } + return self.tweetSection(for: layoutEnvironment) + } + } + + func configureDataSourceCellProviders() { + collectionView.register(TweetCell.nib, forCellWithReuseIdentifier: TweetCell.identifier) + } + + func tweetSection(for layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { + baseSection(itemSize: .init(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(150))) + } + + func baseSection(itemSize: NSCollectionLayoutSize, itemContentInsets: NSDirectionalEdgeInsets = .zero) -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: itemSize) + item.contentInsets = itemContentInsets + let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: itemSize.heightDimension) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + return NSCollectionLayoutSection(group: group) + } +} + +extension TimelineViewController: UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + viewModel.timeline.tweets.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: TweetCell.identifier, for: indexPath) as! TweetCell + cell.update(with: viewModel.timeline.tweets[indexPath.item]) + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + + } +} + diff --git a/OpenTweet/Base.lproj/LaunchScreen.storyboard b/OpenTweet/Scenes/LaunchScreen/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from OpenTweet/Base.lproj/LaunchScreen.storyboard rename to OpenTweet/Scenes/LaunchScreen/Base.lproj/LaunchScreen.storyboard diff --git a/OpenTweet/TimelineViewController.swift b/OpenTweet/TimelineViewController.swift deleted file mode 100644 index f96a784..0000000 --- a/OpenTweet/TimelineViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// OpenTweet -// -// Created by Olivier Larivain on 9/30/16. -// Copyright © 2016 OpenTable, Inc. All rights reserved. -// - -import UIKit - -class TimelineViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - -} - From 9755aad68793e521ec1ab4272b1fe2602cae97d7 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 16:58:56 +0200 Subject: [PATCH 10/12] #1 Bonus - Highlight links and mentions --- OpenTweet/Helpers/String+Extensions.swift | 19 ++++++++++++++++++- OpenTweet/Scenes/Feed/TweetCell.swift | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/OpenTweet/Helpers/String+Extensions.swift b/OpenTweet/Helpers/String+Extensions.swift index 328e163..9a6886f 100644 --- a/OpenTweet/Helpers/String+Extensions.swift +++ b/OpenTweet/Helpers/String+Extensions.swift @@ -6,11 +6,28 @@ // Copyright © 2024 OpenTable, Inc. All rights reserved. // -import Foundation +import UIKit extension String { func date() -> Date { let dateFormatter = ISO8601DateFormatter() return dateFormatter.date(from: self)! } + + func updateArrtibutes() -> NSAttributedString { + let attributedString = NSMutableAttributedString(string: self) + let detector = try! NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) + let linkMatches = detector.matches(in: self, options: [], range: NSRange(location: 0, length: utf16.count)) + linkMatches.forEach { match in + attributedString.addAttributes([.foregroundColor: UIColor.blue], range: match.range) + } + + let regex = try? NSRegularExpression(pattern: "\\@\\w+") + let mentionMatches = regex?.matches(in: self, options: [], range: NSRange(location: 0, length: utf16.count)) + mentionMatches?.forEach { match in + attributedString.addAttributes([.foregroundColor: UIColor.blue], range: match.range) + } + + return attributedString + } } diff --git a/OpenTweet/Scenes/Feed/TweetCell.swift b/OpenTweet/Scenes/Feed/TweetCell.swift index 2c9221d..0229db9 100644 --- a/OpenTweet/Scenes/Feed/TweetCell.swift +++ b/OpenTweet/Scenes/Feed/TweetCell.swift @@ -34,7 +34,7 @@ final class TweetCell: UICollectionViewCell, NibLoadable { imageView.setImage(with: viewModel.imageURL) usernameLabel.text = viewModel.username dateLabel.text = viewModel.date.string(using: .tweetDateFormatter).appendSeparator() - contentLabel.text = viewModel.content + contentLabel.attributedText = viewModel.content.updateArrtibutes() } } From 05a3e3decd0ba5a697c3b1b11bf11750016a7a25 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 17:21:15 +0200 Subject: [PATCH 11/12] #2 Bonus - Added tweet cell animation on select and deselect --- .../Scenes/Feed/TimelineViewController.swift | 9 +++++- OpenTweet/Scenes/Feed/TweetCell.swift | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/OpenTweet/Scenes/Feed/TimelineViewController.swift b/OpenTweet/Scenes/Feed/TimelineViewController.swift index 01bdd8c..71df336 100644 --- a/OpenTweet/Scenes/Feed/TimelineViewController.swift +++ b/OpenTweet/Scenes/Feed/TimelineViewController.swift @@ -12,6 +12,7 @@ class TimelineViewController: UIViewController { collectionView.collectionViewLayout = collectionViewLayout collectionView.delegate = self collectionView.dataSource = self + collectionView.allowsMultipleSelection = false } } @@ -62,7 +63,13 @@ extension TimelineViewController: UICollectionViewDataSource, UICollectionViewDe } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - + let cell = collectionView.cellForItem(at: indexPath) as! TweetCell + cell.animate(type: .expand) + } + + func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { + let cell = collectionView.cellForItem(at: indexPath) as! TweetCell + cell.animate(type: .shrink) } } diff --git a/OpenTweet/Scenes/Feed/TweetCell.swift b/OpenTweet/Scenes/Feed/TweetCell.swift index 0229db9..032e2ba 100644 --- a/OpenTweet/Scenes/Feed/TweetCell.swift +++ b/OpenTweet/Scenes/Feed/TweetCell.swift @@ -15,6 +15,11 @@ struct TweetViewModel { var imageURL: URL? } +enum AnimationType { + case expand + case shrink +} + final class TweetCell: UICollectionViewCell, NibLoadable { @IBOutlet private var imageView: UIImageView! { didSet { @@ -26,6 +31,8 @@ final class TweetCell: UICollectionViewCell, NibLoadable { @IBOutlet private var dateLabel: UILabel! @IBOutlet private var contentLabel: UILabel! + let animator = UIViewPropertyAnimator(duration: 0.5, curve: .easeInOut) + override func prepareForReuse() { imageView.image = nil } @@ -36,6 +43,28 @@ final class TweetCell: UICollectionViewCell, NibLoadable { dateLabel.text = viewModel.date.string(using: .tweetDateFormatter).appendSeparator() contentLabel.attributedText = viewModel.content.updateArrtibutes() } + + func animate(type: AnimationType) { + if animator.isRunning { + animator.stopAnimation(true) + } + + switch type { + case .expand: + let shouldExpand = self.transform == .identity + animator.addAnimations { + self.transform = shouldExpand ? CGAffineTransform(scaleX: 1.05, y: 1.05) : .identity + self.backgroundColor = shouldExpand ? .systemGray6 : nil + } + case .shrink: + animator.addAnimations { + self.transform = .identity + self.backgroundColor = nil + } + } + + animator.startAnimation() + } } private extension String { From 2a5c3f63fee9d924ba544da488c84ddb9c643d86 Mon Sep 17 00:00:00 2001 From: Farzan Abdollahi Date: Sat, 20 Apr 2024 18:30:50 +0200 Subject: [PATCH 12/12] #3 Bonus - Showing thread and replies in another screen --- OpenTweet.xcodeproj/project.pbxproj | 2 +- .../Feed => }/Base.lproj/Main.storyboard | 2 +- OpenTweet/Entity/Timeline.swift | 6 ++- OpenTweet/Scenes/Feed/FeedViewModel.swift | 37 +++++++++++++++---- .../Scenes/Feed/TimelineViewController.swift | 25 ++++++++++++- OpenTweet/Scenes/Feed/TweetCell.swift | 1 + 6 files changed, 61 insertions(+), 12 deletions(-) rename OpenTweet/{Scenes/Feed => }/Base.lproj/Main.storyboard (96%) diff --git a/OpenTweet.xcodeproj/project.pbxproj b/OpenTweet.xcodeproj/project.pbxproj index c721373..db1c43a 100644 --- a/OpenTweet.xcodeproj/project.pbxproj +++ b/OpenTweet.xcodeproj/project.pbxproj @@ -125,6 +125,7 @@ isa = PBXGroup; children = ( 009C4C6B1D9F0CD600F0BC6C /* AppDelegate.swift */, + 009C4C6F1D9F0CD600F0BC6C /* Main.storyboard */, B24E8C192BD3BE9900B15535 /* Scenes */, B24E8C1E2BD3BFE900B15535 /* Helpers */, B24E8C1D2BD3BFD600B15535 /* Services */, @@ -201,7 +202,6 @@ B24E8C372BD3E5AD00B15535 /* TweetCell.xib */, B24E8C2A2BD3DDB400B15535 /* FeedViewModel.swift */, 009C4C6D1D9F0CD600F0BC6C /* TimelineViewController.swift */, - 009C4C6F1D9F0CD600F0BC6C /* Main.storyboard */, ); path = Feed; sourceTree = ""; diff --git a/OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard b/OpenTweet/Base.lproj/Main.storyboard similarity index 96% rename from OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard rename to OpenTweet/Base.lproj/Main.storyboard index 41c0412..7fb6ee0 100644 --- a/OpenTweet/Scenes/Feed/Base.lproj/Main.storyboard +++ b/OpenTweet/Base.lproj/Main.storyboard @@ -11,7 +11,7 @@ - + diff --git a/OpenTweet/Entity/Timeline.swift b/OpenTweet/Entity/Timeline.swift index 6c55695..3022742 100644 --- a/OpenTweet/Entity/Timeline.swift +++ b/OpenTweet/Entity/Timeline.swift @@ -26,7 +26,11 @@ extension Timeline { extension Timeline { func convert() -> TimelineViewModel { TimelineViewModel(tweets: tweets.map { - TweetViewModel(username: $0.author, date: $0.dateString.date(), content: $0.content, imageURL: $0.avatar) + TweetViewModel(id: $0.id, + username: $0.author, + date: $0.dateString.date(), + content: $0.content, + imageURL: $0.avatar) }) } } diff --git a/OpenTweet/Scenes/Feed/FeedViewModel.swift b/OpenTweet/Scenes/Feed/FeedViewModel.swift index bba5be2..69a0979 100644 --- a/OpenTweet/Scenes/Feed/FeedViewModel.swift +++ b/OpenTweet/Scenes/Feed/FeedViewModel.swift @@ -8,29 +8,52 @@ import Foundation -struct TimelineViewModel { - let tweets: [TweetViewModel] -} - protocol FeedViewModelProtocol { var timeline: TimelineViewModel { get } func fetchTimeline() + func tweetTapped(with id: String) -> TimelineViewModel? +} + +struct TimelineViewModel { + let tweets: [TweetViewModel] } final class FeedViewModel { private let service: NetworkServiceProtocol + + private var timelineModel: Timeline? - var timeline = TimelineViewModel(tweets: []) + var timeline: TimelineViewModel - init(service: NetworkServiceProtocol = NetworkService.shared) { + init(service: NetworkServiceProtocol = NetworkService.shared, + timeline: TimelineViewModel = TimelineViewModel(tweets: [])) { self.service = service + self.timeline = timeline } } extension FeedViewModel: FeedViewModelProtocol { + func tweetTapped(with id: String) -> TimelineViewModel? { + guard let tweet = timelineModel?.tweets.first(where: { $0.id == id }) else { + return nil + } + + var tweets = [tweet] + + let replies = timelineModel?.tweets.filter { $0.inReplyTo == id } ?? [] + if let parent = timelineModel?.tweets.first(where: { $0.id == tweet.inReplyTo }), replies.isEmpty { + tweets.insert(parent, at: 0) + } else { + tweets.append(contentsOf: replies) + } + return Timeline(tweets: tweets).convert() + } + func fetchTimeline() { - self.timeline = service.timeline().convert() + let result = service.timeline() + timeline = result.convert() + timelineModel = result } } diff --git a/OpenTweet/Scenes/Feed/TimelineViewController.swift b/OpenTweet/Scenes/Feed/TimelineViewController.swift index 71df336..dc7a0af 100644 --- a/OpenTweet/Scenes/Feed/TimelineViewController.swift +++ b/OpenTweet/Scenes/Feed/TimelineViewController.swift @@ -16,11 +16,11 @@ class TimelineViewController: UIViewController { } } - let viewModel: FeedViewModelProtocol = FeedViewModel() + var viewModel: FeedViewModelProtocol = FeedViewModel() override func viewDidLoad() { super.viewDidLoad() - viewModel.fetchTimeline() + fetchTimeline() } } @@ -34,6 +34,14 @@ private extension TimelineViewController { } } + func fetchTimeline() { + guard viewModel.timeline.tweets.isEmpty else { + return + } + + viewModel.fetchTimeline() + } + func configureDataSourceCellProviders() { collectionView.register(TweetCell.nib, forCellWithReuseIdentifier: TweetCell.identifier) } @@ -49,6 +57,14 @@ private extension TimelineViewController { let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) return NSCollectionLayoutSection(group: group) } + + func navigateToThread(with timeline: TimelineViewModel) { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + let vc = storyboard.instantiateViewController(identifier: "TimelineViewController") as! TimelineViewController + vc.title = "Thread" + vc.viewModel = FeedViewModel(timeline: timeline) + navigationController?.pushViewController(vc, animated: true) + } } extension TimelineViewController: UICollectionViewDataSource, UICollectionViewDelegate { @@ -65,6 +81,11 @@ extension TimelineViewController: UICollectionViewDataSource, UICollectionViewDe func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) as! TweetCell cell.animate(type: .expand) + + guard let viewModel = viewModel.tweetTapped(with: viewModel.timeline.tweets[indexPath.item].id) else { + return + } + navigateToThread(with: viewModel) } func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { diff --git a/OpenTweet/Scenes/Feed/TweetCell.swift b/OpenTweet/Scenes/Feed/TweetCell.swift index 032e2ba..567b67f 100644 --- a/OpenTweet/Scenes/Feed/TweetCell.swift +++ b/OpenTweet/Scenes/Feed/TweetCell.swift @@ -9,6 +9,7 @@ import UIKit struct TweetViewModel { + var id: String var username: String var date: Date var content: String