From bf350882b4e01d6d776ae1802e47af22f1308748 Mon Sep 17 00:00:00 2001 From: Ching Date: Tue, 2 May 2023 02:55:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(view):=20=E5=A2=9E=E5=8A=A0=20profile=20pa?= =?UTF-8?q?ge=20=E5=92=8C=20feed=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加 profile page 和 feed page Signed-off-by: Ching --- .../dudu-tweet.xcodeproj/project.pbxproj | 519 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 41336 bytes .../xcschemes/dudu-tweet.xcscheme | 78 +++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 22 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 +++ .../dudu-tweet/Assets.xcassets/Contents.json | 6 + dudu-tweet/dudu-tweet/ContentView.swift | 26 + .../Core/Components/Tweets/TweetRowView.swift | 83 +++ .../dudu-tweet/Core/Explore/ExploreView.swift | 20 + .../dudu-tweet/Core/Feed/View/FeedView.swift | 26 + .../dudu-tweet/Core/MainTab/MainTabView.swift | 51 ++ .../Core/Messages/MessagesView.swift | 20 + .../Notifications/NotificationsView.swift | 20 + .../ViewModels/TwewtFilterViewModel.swift | 23 + .../Core/Profile/Views/ProfileView.swift | 174 ++++++ .../Preview Assets.xcassets/Contents.json | 6 + dudu-tweet/dudu-tweet/dudu_tweet.entitlements | 10 + dudu-tweet/dudu-tweet/dudu_tweetApp.swift | 17 + 22 files changed, 1196 insertions(+) create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/project.pbxproj create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcuserdata/ching.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/xcshareddata/xcschemes/dudu-tweet.xcscheme create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 dudu-tweet/dudu-tweet/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 dudu-tweet/dudu-tweet/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 dudu-tweet/dudu-tweet/Assets.xcassets/Contents.json create mode 100644 dudu-tweet/dudu-tweet/ContentView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Components/Tweets/TweetRowView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Explore/ExploreView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Feed/View/FeedView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/MainTab/MainTabView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Messages/MessagesView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Notifications/NotificationsView.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Profile/ViewModels/TwewtFilterViewModel.swift create mode 100644 dudu-tweet/dudu-tweet/Core/Profile/Views/ProfileView.swift create mode 100644 dudu-tweet/dudu-tweet/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 dudu-tweet/dudu-tweet/dudu_tweet.entitlements create mode 100644 dudu-tweet/dudu-tweet/dudu_tweetApp.swift diff --git a/dudu-tweet/dudu-tweet.xcodeproj/project.pbxproj b/dudu-tweet/dudu-tweet.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c319e70 --- /dev/null +++ b/dudu-tweet/dudu-tweet.xcodeproj/project.pbxproj @@ -0,0 +1,519 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 2492CC0D2A000EB00086C525 /* dudu_tweetApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2492CC0C2A000EB00086C525 /* dudu_tweetApp.swift */; }; + 2492CC0F2A000EB00086C525 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2492CC0E2A000EB00086C525 /* ContentView.swift */; }; + 2492CC112A000EB10086C525 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2492CC102A000EB10086C525 /* Assets.xcassets */; }; + 2492CC152A000EB10086C525 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2492CC142A000EB10086C525 /* Preview Assets.xcassets */; }; + 2492CC252A0023220086C525 /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2492CC242A0023220086C525 /* FeedView.swift */; }; + 2492CC282A0025DD0086C525 /* TweetRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2492CC272A0025DD0086C525 /* TweetRowView.swift */; }; + 24A59AB42A002EB8009C9E3E /* MainTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59AB32A002EB8009C9E3E /* MainTabView.swift */; }; + 24A59ABA2A0030CB009C9E3E /* ExploreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59AB92A0030CB009C9E3E /* ExploreView.swift */; }; + 24A59ABC2A0030EC009C9E3E /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59ABB2A0030EC009C9E3E /* NotificationsView.swift */; }; + 24A59ABE2A003108009C9E3E /* MessagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59ABD2A003108009C9E3E /* MessagesView.swift */; }; + 24A59AC22A003249009C9E3E /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59AC12A003249009C9E3E /* ProfileView.swift */; }; + 24A59AC42A003A52009C9E3E /* TwewtFilterViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A59AC32A003A52009C9E3E /* TwewtFilterViewModel.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2492CC092A000EB00086C525 /* dudu-tweet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "dudu-tweet.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2492CC0C2A000EB00086C525 /* dudu_tweetApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = dudu_tweetApp.swift; sourceTree = ""; }; + 2492CC0E2A000EB00086C525 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 2492CC102A000EB10086C525 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2492CC122A000EB10086C525 /* dudu_tweet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = dudu_tweet.entitlements; sourceTree = ""; }; + 2492CC142A000EB10086C525 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 2492CC242A0023220086C525 /* FeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedView.swift; sourceTree = ""; }; + 2492CC272A0025DD0086C525 /* TweetRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TweetRowView.swift; sourceTree = ""; }; + 24A59AB32A002EB8009C9E3E /* MainTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabView.swift; sourceTree = ""; }; + 24A59AB92A0030CB009C9E3E /* ExploreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreView.swift; sourceTree = ""; }; + 24A59ABB2A0030EC009C9E3E /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = ""; }; + 24A59ABD2A003108009C9E3E /* MessagesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesView.swift; sourceTree = ""; }; + 24A59AC12A003249009C9E3E /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = ""; }; + 24A59AC32A003A52009C9E3E /* TwewtFilterViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwewtFilterViewModel.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2492CC062A000EB00086C525 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2492CC002A000EB00086C525 = { + isa = PBXGroup; + children = ( + 2492CC0B2A000EB00086C525 /* dudu-tweet */, + 2492CC0A2A000EB00086C525 /* Products */, + ); + sourceTree = ""; + }; + 2492CC0A2A000EB00086C525 /* Products */ = { + isa = PBXGroup; + children = ( + 2492CC092A000EB00086C525 /* dudu-tweet.app */, + ); + name = Products; + sourceTree = ""; + }; + 2492CC0B2A000EB00086C525 /* dudu-tweet */ = { + isa = PBXGroup; + children = ( + 2492CC1F2A0022990086C525 /* Extensions */, + 2492CC1E2A0022970086C525 /* Model */, + 2492CC1D2A0022960086C525 /* Service */, + 2492CC1B2A00228F0086C525 /* Core */, + 2492CC0C2A000EB00086C525 /* dudu_tweetApp.swift */, + 2492CC0E2A000EB00086C525 /* ContentView.swift */, + 2492CC102A000EB10086C525 /* Assets.xcassets */, + 2492CC122A000EB10086C525 /* dudu_tweet.entitlements */, + 2492CC132A000EB10086C525 /* Preview Content */, + ); + path = "dudu-tweet"; + sourceTree = ""; + }; + 2492CC132A000EB10086C525 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 2492CC142A000EB10086C525 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 2492CC1B2A00228F0086C525 /* Core */ = { + isa = PBXGroup; + children = ( + 2492CC212A0022C30086C525 /* Components */, + 24A59AB82A00308E009C9E3E /* Profile */, + 24A59AB72A00305E009C9E3E /* Explore */, + 24A59AB62A00305C009C9E3E /* Notifications */, + 24A59AB52A00305A009C9E3E /* Messages */, + 24A59AB22A002E79009C9E3E /* MainTab */, + 2492CC202A0022BB0086C525 /* Feed */, + ); + path = Core; + sourceTree = ""; + }; + 2492CC1D2A0022960086C525 /* Service */ = { + isa = PBXGroup; + children = ( + ); + path = Service; + sourceTree = ""; + }; + 2492CC1E2A0022970086C525 /* Model */ = { + isa = PBXGroup; + children = ( + ); + path = Model; + sourceTree = ""; + }; + 2492CC1F2A0022990086C525 /* Extensions */ = { + isa = PBXGroup; + children = ( + ); + path = Extensions; + sourceTree = ""; + }; + 2492CC202A0022BB0086C525 /* Feed */ = { + isa = PBXGroup; + children = ( + 2492CC232A0023020086C525 /* View */, + 2492CC222A0022F80086C525 /* ViewModels */, + ); + path = Feed; + sourceTree = ""; + }; + 2492CC212A0022C30086C525 /* Components */ = { + isa = PBXGroup; + children = ( + 2492CC262A0025A50086C525 /* Tweets */, + ); + path = Components; + sourceTree = ""; + }; + 2492CC222A0022F80086C525 /* ViewModels */ = { + isa = PBXGroup; + children = ( + ); + path = ViewModels; + sourceTree = ""; + }; + 2492CC232A0023020086C525 /* View */ = { + isa = PBXGroup; + children = ( + 2492CC242A0023220086C525 /* FeedView.swift */, + ); + path = View; + sourceTree = ""; + }; + 2492CC262A0025A50086C525 /* Tweets */ = { + isa = PBXGroup; + children = ( + 2492CC272A0025DD0086C525 /* TweetRowView.swift */, + ); + path = Tweets; + sourceTree = ""; + }; + 24A59AB22A002E79009C9E3E /* MainTab */ = { + isa = PBXGroup; + children = ( + 24A59AB32A002EB8009C9E3E /* MainTabView.swift */, + ); + path = MainTab; + sourceTree = ""; + }; + 24A59AB52A00305A009C9E3E /* Messages */ = { + isa = PBXGroup; + children = ( + 24A59ABD2A003108009C9E3E /* MessagesView.swift */, + ); + path = Messages; + sourceTree = ""; + }; + 24A59AB62A00305C009C9E3E /* Notifications */ = { + isa = PBXGroup; + children = ( + 24A59ABB2A0030EC009C9E3E /* NotificationsView.swift */, + ); + path = Notifications; + sourceTree = ""; + }; + 24A59AB72A00305E009C9E3E /* Explore */ = { + isa = PBXGroup; + children = ( + 24A59AB92A0030CB009C9E3E /* ExploreView.swift */, + ); + path = Explore; + sourceTree = ""; + }; + 24A59AB82A00308E009C9E3E /* Profile */ = { + isa = PBXGroup; + children = ( + 24A59AC02A003231009C9E3E /* ViewModels */, + 24A59ABF2A003221009C9E3E /* Views */, + ); + path = Profile; + sourceTree = ""; + }; + 24A59ABF2A003221009C9E3E /* Views */ = { + isa = PBXGroup; + children = ( + 24A59AC12A003249009C9E3E /* ProfileView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 24A59AC02A003231009C9E3E /* ViewModels */ = { + isa = PBXGroup; + children = ( + 24A59AC32A003A52009C9E3E /* TwewtFilterViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2492CC082A000EB00086C525 /* dudu-tweet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2492CC182A000EB10086C525 /* Build configuration list for PBXNativeTarget "dudu-tweet" */; + buildPhases = ( + 2492CC052A000EB00086C525 /* Sources */, + 2492CC062A000EB00086C525 /* Frameworks */, + 2492CC072A000EB00086C525 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "dudu-tweet"; + productName = "dudu-tweet"; + productReference = 2492CC092A000EB00086C525 /* dudu-tweet.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2492CC012A000EB00086C525 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1420; + LastUpgradeCheck = 1420; + TargetAttributes = { + 2492CC082A000EB00086C525 = { + CreatedOnToolsVersion = 14.2; + }; + }; + }; + buildConfigurationList = 2492CC042A000EB00086C525 /* Build configuration list for PBXProject "dudu-tweet" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 2492CC002A000EB00086C525; + productRefGroup = 2492CC0A2A000EB00086C525 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2492CC082A000EB00086C525 /* dudu-tweet */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2492CC072A000EB00086C525 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2492CC152A000EB10086C525 /* Preview Assets.xcassets in Resources */, + 2492CC112A000EB10086C525 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2492CC052A000EB00086C525 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24A59ABE2A003108009C9E3E /* MessagesView.swift in Sources */, + 24A59AC22A003249009C9E3E /* ProfileView.swift in Sources */, + 2492CC0F2A000EB00086C525 /* ContentView.swift in Sources */, + 2492CC282A0025DD0086C525 /* TweetRowView.swift in Sources */, + 24A59AC42A003A52009C9E3E /* TwewtFilterViewModel.swift in Sources */, + 2492CC252A0023220086C525 /* FeedView.swift in Sources */, + 2492CC0D2A000EB00086C525 /* dudu_tweetApp.swift in Sources */, + 24A59ABA2A0030CB009C9E3E /* ExploreView.swift in Sources */, + 24A59AB42A002EB8009C9E3E /* MainTabView.swift in Sources */, + 24A59ABC2A0030EC009C9E3E /* NotificationsView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2492CC162A000EB10086C525 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 2492CC172A000EB10086C525 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 2492CC192A000EB10086C525 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "dudu-tweet/dudu_tweet.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"dudu-tweet/Preview Content\""; + DEVELOPMENT_TEAM = JTQVB9KL4C; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.tunpok.ios.dudu-tweet"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2492CC1A2A000EB10086C525 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "dudu-tweet/dudu_tweet.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"dudu-tweet/Preview Content\""; + DEVELOPMENT_TEAM = JTQVB9KL4C; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.tunpok.ios.dudu-tweet"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2492CC042A000EB00086C525 /* Build configuration list for PBXProject "dudu-tweet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2492CC162A000EB10086C525 /* Debug */, + 2492CC172A000EB10086C525 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2492CC182A000EB10086C525 /* Build configuration list for PBXNativeTarget "dudu-tweet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2492CC192A000EB10086C525 /* Debug */, + 2492CC1A2A000EB10086C525 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2492CC012A000EB00086C525 /* Project object */; +} diff --git a/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcuserdata/ching.xcuserdatad/UserInterfaceState.xcuserstate b/dudu-tweet/dudu-tweet.xcodeproj/project.xcworkspace/xcuserdata/ching.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..59eb79c2b408750e4f53002026dda4edb8dd90d5 GIT binary patch literal 41336 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вjR;H|;ig0~01 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..7721546 --- /dev/null +++ b/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcschemes/xcschememanagement.plist b/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..202ac12 --- /dev/null +++ b/dudu-tweet/dudu-tweet.xcodeproj/xcuserdata/ching.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + dudu-tweet.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 2492CC082A000EB00086C525 + + primary + + + + + diff --git a/dudu-tweet/dudu-tweet/Assets.xcassets/AccentColor.colorset/Contents.json b/dudu-tweet/dudu-tweet/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dudu-tweet/dudu-tweet/Assets.xcassets/AppIcon.appiconset/Contents.json b/dudu-tweet/dudu-tweet/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..532cd72 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dudu-tweet/dudu-tweet/Assets.xcassets/Contents.json b/dudu-tweet/dudu-tweet/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dudu-tweet/dudu-tweet/ContentView.swift b/dudu-tweet/dudu-tweet/ContentView.swift new file mode 100644 index 0000000..85e63e6 --- /dev/null +++ b/dudu-tweet/dudu-tweet/ContentView.swift @@ -0,0 +1,26 @@ +// +// ContentView.swift +// dudu-tweet +// +// Created by ching on 2023/5/1. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundColor(.accentColor) + Text("Hello, world!") + } + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Components/Tweets/TweetRowView.swift b/dudu-tweet/dudu-tweet/Core/Components/Tweets/TweetRowView.swift new file mode 100644 index 0000000..0458783 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Components/Tweets/TweetRowView.swift @@ -0,0 +1,83 @@ +// +// TweetRowView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct TweetRowView: View { + var body: some View { + VStack(alignment: .leading) { + // profile image + user info + tweet + HStack(alignment: .top, spacing: 12) { + // profile image + Circle() + .frame(width: 56, height: 56) + .foregroundColor(Color(.systemBlue)) + + // user info + tweet caption + VStack(alignment: .leading) { + // user info + HStack { + Text("Zhang San") + .font(.subheadline).bold() + Text("@zhang3") + .foregroundColor(.gray) + .font(.caption) + Text("2min") + .foregroundColor(.gray) + .font(.caption) + } + + // tweet caption + Text("全都不是我干的。") + .font(.subheadline) + .multilineTextAlignment(.leading) + } + } + // action buttons + HStack { + Button { + // action here + } label: { + Image(systemName: "bubble.left") + .font(.subheadline) + } + Spacer() + Button { + // action here + } label: { + Image(systemName: "arrow.2.squarepath") + .font(.subheadline) + } + Spacer() + Button { + // action here + } label: { + Image(systemName: "heart") + .font(.subheadline) + } + Spacer() + Button { + // action here + } label: { + Image(systemName: "bookmark") + .font(.subheadline) + } + } + .foregroundColor(.gray) + .padding() + Divider() + } + .padding() + } + +} + +struct TweetRowView_Previews: PreviewProvider { + static var previews: some View { + TweetRowView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Explore/ExploreView.swift b/dudu-tweet/dudu-tweet/Core/Explore/ExploreView.swift new file mode 100644 index 0000000..55c5bd5 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Explore/ExploreView.swift @@ -0,0 +1,20 @@ +// +// ExploreView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct ExploreView: View { + var body: some View { + Text("Explore view") + } +} + +struct ExploreView_Previews: PreviewProvider { + static var previews: some View { + ExploreView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Feed/View/FeedView.swift b/dudu-tweet/dudu-tweet/Core/Feed/View/FeedView.swift new file mode 100644 index 0000000..969a93b --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Feed/View/FeedView.swift @@ -0,0 +1,26 @@ +// +// FeedView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct FeedView: View { + var body: some View { + ScrollView { + LazyVStack { + ForEach(0 ... 20, id: \.self) { _ in + TweetRowView() + } + } + } + } +} + +struct FeedView_Previews: PreviewProvider { + static var previews: some View { + FeedView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/MainTab/MainTabView.swift b/dudu-tweet/dudu-tweet/Core/MainTab/MainTabView.swift new file mode 100644 index 0000000..f74f9a7 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/MainTab/MainTabView.swift @@ -0,0 +1,51 @@ +// +// MainTabView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct MainTabView: View { + @State private var selectedIndex: Int = 0 + + var body: some View { + TabView(selection: $selectedIndex) { + FeedView() + .onTapGesture { + self.selectedIndex = 0 + } + .tabItem { + Image(systemName: "house") + }.tag(0) + ExploreView() + .onTapGesture { + self.selectedIndex = 1 + } + .tabItem { + Image(systemName: "magnifyingglass") + }.tag(1) + NotificationsView() + .onTapGesture { + self.selectedIndex = 2 + } + .tabItem { + Image(systemName: "bell") + }.tag(2) + MessagesView() + .onTapGesture { + self.selectedIndex = 3 + } + .tabItem { + Image(systemName: "envelope") + }.tag(3) + } + } +} + +struct MainTabView_Previews: PreviewProvider { + static var previews: some View { + MainTabView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Messages/MessagesView.swift b/dudu-tweet/dudu-tweet/Core/Messages/MessagesView.swift new file mode 100644 index 0000000..f68f3c0 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Messages/MessagesView.swift @@ -0,0 +1,20 @@ +// +// MessagesView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct MessagesView: View { + var body: some View { + Text("Messages") + } +} + +struct MessagesView_Previews: PreviewProvider { + static var previews: some View { + MessagesView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Notifications/NotificationsView.swift b/dudu-tweet/dudu-tweet/Core/Notifications/NotificationsView.swift new file mode 100644 index 0000000..4ec3e61 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Notifications/NotificationsView.swift @@ -0,0 +1,20 @@ +// +// NotificationsView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct NotificationsView: View { + var body: some View { + Text("Notifications") + } +} + +struct NotificationsView_Previews: PreviewProvider { + static var previews: some View { + NotificationsView() + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Profile/ViewModels/TwewtFilterViewModel.swift b/dudu-tweet/dudu-tweet/Core/Profile/ViewModels/TwewtFilterViewModel.swift new file mode 100644 index 0000000..46c914a --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Profile/ViewModels/TwewtFilterViewModel.swift @@ -0,0 +1,23 @@ +// +// TwewtFilterViewModel.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import Foundation + + +enum TweetFilterViewModel: Int, CaseIterable { + case tweets + case replies + case likes + + var title: String { + switch self { + case .tweets: return "Tweets" + case .replies: return "Replies" + case .likes: return "Likes" + } + } +} diff --git a/dudu-tweet/dudu-tweet/Core/Profile/Views/ProfileView.swift b/dudu-tweet/dudu-tweet/Core/Profile/Views/ProfileView.swift new file mode 100644 index 0000000..60d6a83 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Core/Profile/Views/ProfileView.swift @@ -0,0 +1,174 @@ +// +// ProfileView.swift +// dudu-tweet +// +// Created by ching on 2023/5/2. +// + +import SwiftUI + +struct ProfileView: View { + @State private var selectedFilter: TweetFilterViewModel = .tweets + @Namespace var animation + + var body: some View { + VStack(alignment: .leading) { + headerView + + actionButtons + + userInfoDetails + + tweetFilterBar + + tweetsView + + Spacer() + } + } +} + +struct ProfileView_Previews: PreviewProvider { + static var previews: some View { + ProfileView() + } +} + +extension ProfileView { + var headerView: some View { + ZStack(alignment: .bottomLeading) { + Color(.systemBlue) + .ignoresSafeArea() + VStack { + Button { + // action here + } label: { + Image(systemName: "arrow.left") + .resizable() + .frame(width: 20, height: 16) + .foregroundColor(.white) + .offset(x: 16, y: 12) + } + + Circle() + .frame(width: 72, height: 72) + .offset(x: 16, y: 24) + } + } + .frame(height: 96) + } + + var actionButtons: some View { + HStack(spacing: 12) { + Spacer() + Image(systemName: "bell.badge") + .font(.title3) + .padding(6) + .overlay(Circle().stroke(Color.gray, lineWidth: 0.75)) + + Button { + // action here + } label: { + Text("Edit Profile") + .font(.subheadline).bold() + .frame(width: 120, height: 32) + .foregroundColor(.black) + .overlay(RoundedRectangle(cornerRadius: 20).stroke(Color.gray, lineWidth: 0.75)) + } + } + .padding(.trailing) + } + + var userInfoDetails: some View { + VStack(alignment: .leading, spacing: 4) { + HStack { + Text("Zhang San") + .font(.title2).bold() + Image(systemName: "checkmark.seal.fill") + .foregroundColor(Color(.systemBlue)) + } + Text("@zhang3") + .font(.subheadline) + .foregroundColor(.gray) + Text("一个普通人") + .font(.subheadline) + .padding(.vertical) + + HStack(spacing: 24) { + HStack { + Image(systemName: "mappin.and.ellipse") + Text("中国") + } + HStack { + Image(systemName: "link") + Text("www.zhangsan.com") + } + } + .foregroundColor(.gray) + .font(.caption) + + HStack(spacing: 24) { + HStack(spacing: 4) { + Text("13214") + .bold() + .font(.subheadline) + Text("Following") + .font(.caption) + .foregroundColor(.gray) + } + HStack(spacing: 4) { + Text("995353") + .bold() + .font(.subheadline) + Text("Followers") + .font(.caption) + .foregroundColor(.gray) + } + } + .padding(.vertical) + } + .padding(.horizontal) + } + + var tweetFilterBar: some View { + HStack { + ForEach(TweetFilterViewModel.allCases, id: \.rawValue) { item in + VStack { + Text(item.title) + .font(.subheadline) + .fontWeight(selectedFilter == item ? .semibold : .regular) + .foregroundColor(selectedFilter == item ? .black : .gray) + + if selectedFilter == item { + Capsule() + .foregroundColor(Color(.systemBlue)) + .frame(height: 3) + .matchedGeometryEffect(id: "filter", in: animation) + } else { + Capsule() + .foregroundColor(Color(.clear)) + .frame(height: 3) + } + } + .onTapGesture { + withAnimation(.easeInOut) { + self.selectedFilter = item + } + } + } + } + .overlay(Divider().offset(x:0, y:16)) + + } + + var tweetsView: some View { + ScrollView { + LazyVStack { + ForEach(0...9, id: \.self) { _ in + TweetRowView() + } + } + } + + } +} diff --git a/dudu-tweet/dudu-tweet/Preview Content/Preview Assets.xcassets/Contents.json b/dudu-tweet/dudu-tweet/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/dudu-tweet/dudu-tweet/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/dudu-tweet/dudu-tweet/dudu_tweet.entitlements b/dudu-tweet/dudu-tweet/dudu_tweet.entitlements new file mode 100644 index 0000000..f2ef3ae --- /dev/null +++ b/dudu-tweet/dudu-tweet/dudu_tweet.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/dudu-tweet/dudu-tweet/dudu_tweetApp.swift b/dudu-tweet/dudu-tweet/dudu_tweetApp.swift new file mode 100644 index 0000000..fb30812 --- /dev/null +++ b/dudu-tweet/dudu-tweet/dudu_tweetApp.swift @@ -0,0 +1,17 @@ +// +// dudu_tweetApp.swift +// dudu-tweet +// +// Created by ching on 2023/5/1. +// + +import SwiftUI + +@main +struct dudu_tweetApp: App { + var body: some Scene { + WindowGroup { + MainTabView() + } + } +}