├── .circleci └── config.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── Frameworks └── BetterSegmentedControl.framework │ ├── BetterSegmentedControl │ ├── Headers │ ├── BetterSegmentedControl-Swift.h │ └── BetterSegmentedControl-umbrella.h │ ├── Info.plist │ └── Modules │ ├── BetterSegmentedControl.swiftmodule │ ├── arm.swiftdoc │ ├── arm.swiftmodule │ ├── arm64.swiftdoc │ ├── arm64.swiftmodule │ ├── i386.swiftdoc │ ├── i386.swiftmodule │ ├── x86_64.swiftdoc │ └── x86_64.swiftmodule │ └── module.modulemap ├── Gitcoin.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── Gitcoin.xcworkspace └── contents.xcworkspacedata ├── Gitcoin ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon - Messages.stickersiconset │ │ ├── Contents.json │ │ ├── Icon-App-29x29@3x.png │ │ ├── icon-messages-app-27x20@2x.png │ │ ├── icon-messages-app-27x20@3x.png │ │ ├── icon-messages-app-iPadAir-67x50@2x.png │ │ ├── icon-messages-app-iPhone-60x45@2x.png │ │ ├── icon-messages-app-iPhone-60x45@3x.png │ │ ├── icon-messages-app-store-1024x768.png │ │ ├── icon-messages-transcript-32x24@2x.png │ │ └── icon-messages-transcript-32x24@3x.png │ ├── AppIcon - Watch.appiconset │ │ ├── Contents.json │ │ ├── Icon-24@2x.png │ │ ├── Icon-27.5@2x.png │ │ ├── Icon-29@2x.png │ │ ├── Icon-29@3x.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-44@2x.png │ │ ├── Icon-86@2x.png │ │ └── Icon-98@2x.png │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-60.png │ │ ├── Icon-72.png │ │ ├── Icon-72@2x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@1x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ ├── Icon-App-76x76@3x.png │ │ ├── Icon-App-83.5x83.5@2x.png │ │ ├── Icon.png │ │ ├── Icon@2x.png │ │ └── ItunesArtwork@2x.png │ ├── Buttons │ │ ├── Contents.json │ │ ├── gc-get-started-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-get-started-btn.pdf │ │ ├── gc-join-slack-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-join-slack-btn.pdf │ │ ├── gc-learn-more-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-learn-more-btn.pdf │ │ ├── gc-logout-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-logout-btn.pdf │ │ ├── gc-refresh-bounties-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-refresh-bounties-btn.pdf │ │ └── gc-signin-github-btn.imageset │ │ │ ├── Contents.json │ │ │ └── gc-signin-github-btn.pdf │ ├── Card │ │ ├── Contents.json │ │ ├── overlay_like.imageset │ │ │ ├── Contents.json │ │ │ ├── overlay_like.png │ │ │ └── overlay_like@3x.png │ │ └── overlay_skip.imageset │ │ │ ├── Contents.json │ │ │ ├── overlay_skip.png │ │ │ └── overlay_skip@3x.png │ ├── Colors │ │ ├── Brand │ │ │ ├── CelestialWhite.colorset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── CosmicTeal.colorset │ │ │ │ └── Contents.json │ │ │ ├── DarkCosmicTeal.colorset │ │ │ │ └── Contents.json │ │ │ ├── MidnightBlue.colorset │ │ │ │ └── Contents.json │ │ │ ├── MilkyWayBlue.colorset │ │ │ │ └── Contents.json │ │ │ ├── PolarisBlue.colorset │ │ │ │ └── Contents.json │ │ │ ├── RegulusRed.colorset │ │ │ │ └── Contents.json │ │ │ ├── StarDustYellow.colorset │ │ │ │ └── Contents.json │ │ │ └── VinusPurple.colorset │ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── Text │ │ │ ├── Black12.colorset │ │ │ └── Contents.json │ │ │ ├── Black26.colorset │ │ │ └── Contents.json │ │ │ ├── Black38.colorset │ │ │ └── Contents.json │ │ │ ├── Black54.colorset │ │ │ └── Contents.json │ │ │ ├── Black70.colorset │ │ │ └── Contents.json │ │ │ ├── Black87.colorset │ │ │ └── Contents.json │ │ │ └── Contents.json │ ├── Contents.json │ ├── Icons │ │ ├── Contents.json │ │ ├── gc-cash-icon.imageset │ │ │ ├── Contents.json │ │ │ └── gc-cash-icon.pdf │ │ ├── gc-green-heart-icon.imageset │ │ │ ├── Contents.json │ │ │ └── heartIcon.pdf │ │ ├── gc-info-icon.imageset │ │ │ ├── Contents.json │ │ │ └── aboutIcon.pdf │ │ ├── gc-network-icon.imageset │ │ │ ├── Contents.json │ │ │ └── gc-network-icon.pdf │ │ ├── gc-red-cross-icon.imageset │ │ │ ├── Contents.json │ │ │ └── x.pdf │ │ ├── gc-rocket-icon.imageset │ │ │ ├── Contents.json │ │ │ └── gc-rocket-icon.pdf │ │ ├── gc-user-fill-icon.imageset │ │ │ ├── Contents.json │ │ │ └── profileLoggedInIcon.pdf │ │ └── gc-user-icon.imageset │ │ │ ├── Contents.json │ │ │ └── profileLoggedOutIcon.pdf │ ├── LaunchImage.launchimage │ │ ├── 00 iPhone 8 Plus.png │ │ ├── 00 iPhone 8.png │ │ ├── 00 iPhone SE.png │ │ ├── 00 iPhone X.png │ │ └── Contents.json │ ├── Launcher.imageset │ │ ├── 00 iPhone 8 Plus.png │ │ ├── 00 iPhone 8.png │ │ ├── 00 iPhone SE.png │ │ └── Contents.json │ ├── Logos │ │ ├── Contents.json │ │ ├── gc-logo-gray.imageset │ │ │ ├── Contents.json │ │ │ └── gc-logo-gray.pdf │ │ └── gc-logo.imageset │ │ │ ├── Contents.json │ │ │ └── gc-logo.pdf │ ├── bg-fade.imageset │ │ ├── Contents.json │ │ ├── fade.png │ │ ├── fade@2x.png │ │ └── fade@3x.png │ ├── gc-divine-robot.imageset │ │ ├── Contents.json │ │ └── divine-robot.pdf │ ├── guy1_black.imageset │ │ ├── Contents.json │ │ └── guy1_black.png │ ├── leftIcon.imageset │ │ ├── Contents.json │ │ ├── leftIcon.png │ │ ├── leftIcon@2x.png │ │ └── leftIcon@3x.png │ ├── nav-bar-bg.imageset │ │ ├── Contents.json │ │ ├── navbarBg.jpg │ │ ├── navbarBg@2x.jpg │ │ └── navbarBg@3x.jpg │ ├── rightIcon.imageset │ │ ├── Contents.json │ │ ├── rightIcon.png │ │ ├── rightIcon@2x.png │ │ └── rightIcon@3x.png │ ├── user-portrait.imageset │ │ ├── Contents.json │ │ └── portraitCardDefault.pdf │ └── video-placeholder.imageset │ │ ├── Contents.json │ │ └── video-placeholder.pdf ├── Base.lproj │ └── LaunchScreen.storyboard ├── Fonts │ ├── Futura │ │ ├── Futura.ttc │ │ ├── FuturaStd-Book.otf │ │ └── FuturaStd-MediumOblique.otf │ └── Roboto │ │ ├── Roboto-Bold.ttf │ │ ├── Roboto-Medium.ttf │ │ └── Roboto-Regular.ttf ├── Gitcoin-Bridging-Header.h ├── Gitcoin.entitlements ├── Info.plist ├── Library │ ├── Device.swift │ ├── Extensions │ │ ├── Observable+ignoreNil.swift │ │ ├── UIViewController+Spinner.swift │ │ └── UtilExtensions.swift │ ├── KeychainSwiftDistrib.swift │ └── Reachability.swift ├── Main.storyboard ├── Model │ ├── Bounty.swift │ └── UserKeywordResult.swift ├── Network │ ├── GitcoinAPIService.swift │ └── NetworkReachability.swift ├── SafeConfiguration.plist.dist ├── UI │ ├── Bounty Cards │ │ ├── BountyCardKolodaAnimator.swift │ │ ├── BountyCardOverlayView.swift │ │ ├── BountyCardOverlayView.xib │ │ ├── BountyCardView.swift │ │ ├── BountyCardView.xib │ │ ├── BountyCardViewController.swift │ │ └── BountyKolodaView.swift │ ├── Bounty Details │ │ ├── BountyCommentCell.swift │ │ ├── BountyCommentCell.xib │ │ ├── BountyDetailViewController.storyboard │ │ ├── BountyDetailViewController.swift │ │ ├── BountyDetailsContainerViewController.swift │ │ ├── BountyDiscussViewController.storyboard │ │ └── BountyDiscussViewController.swift │ ├── End of Bounties │ │ ├── EndOfBountiesCardView.swift │ │ └── EndOfBountiesCardView.xib │ ├── Info │ │ ├── InfoViewController.swift │ │ └── PlayerContainerView.swift │ ├── NavigationController.swift │ ├── Profile │ │ ├── ProfileBountyContainerViewController.swift │ │ ├── ProfileClaimedCell.swift │ │ ├── ProfileClaimedCell.xib │ │ ├── ProfileClaimedViewController.storyboard │ │ ├── ProfileClaimedViewController.swift │ │ ├── ProfileContainerViewController.storyboard │ │ ├── ProfileContainerViewController.swift │ │ ├── ProfileSavedViewController.storyboard │ │ ├── ProfileSavedViewController.swift │ │ ├── ProfileSignedInViewController.swift │ │ └── ProfileSignedOutViewController.swift │ ├── Views │ │ ├── GitCoinWSTagField.swift │ │ ├── GradientBackgroundView.swift │ │ └── UIView+.swift │ └── Webview │ │ └── WebViewController.swift └── Util │ ├── Colors.swift │ ├── Config.swift │ ├── Fonts.swift │ ├── Globals.swift │ ├── OctokitManager.swift │ ├── SavedBountiesManager.swift │ └── TrackingManager.swift ├── GitcoinTests ├── GitcoinTests.swift └── Info.plist ├── GitcoinUITests ├── GitcoinUITests.swift └── Info.plist ├── InputBarAccessoryView.framework ├── Headers │ └── InputBarAccessoryView-Swift.h ├── Info.plist ├── InputBarAccessoryView └── Modules │ ├── InputBarAccessoryView.swiftmodule │ ├── arm.swiftdoc │ ├── arm.swiftmodule │ ├── arm64.swiftdoc │ ├── arm64.swiftmodule │ ├── i386.swiftdoc │ ├── i386.swiftmodule │ ├── x86_64.swiftdoc │ └── x86_64.swiftmodule │ └── module.modulemap ├── LICENSE ├── Podfile ├── Podfile.lock ├── README.md └── img ├── app_store.png └── video.png /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # iOS CircleCI 2.0 configuration file 2 | version: 2 3 | jobs: 4 | build: 5 | 6 | # Specify the Xcode version to use 7 | macos: 8 | xcode: "8.3.3" 9 | 10 | steps: 11 | - checkout 12 | 13 | # Install CocoaPods 14 | - run: 15 | name: Install CocoaPods 16 | command: pod install 17 | 18 | # Build the app and run tests 19 | - run: 20 | name: Build and run tests 21 | command: fastlane scan 22 | environment: 23 | SCAN_DEVICE: iPhone 6 24 | SCAN_SCHEME: WebTests 25 | 26 | # Collect XML test results data to show in the UI, 27 | # and save the same XML files under test-results folder 28 | # in the Artifacts tab 29 | - store_test_results: 30 | path: test_output/report.xml 31 | - store_artifacts: 32 | path: /tmp/test-results 33 | destination: scan-test-results 34 | - store_artifacts: 35 | path: ~/Library/Logs/scan 36 | destination: scan-logs 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Xcode 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | Packages/ 39 | Package.pins 40 | Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | Pods/ 50 | 51 | # Carthage 52 | # 53 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 54 | Carthage/Checkouts 55 | 56 | Carthage/Build 57 | 58 | # fastlane 59 | # 60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 61 | # screenshots whenever they are needed. 62 | # For more information about the recommended setup visit: 63 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 64 | 65 | fastlane/report.xml 66 | fastlane/Preview.html 67 | fastlane/screenshots 68 | fastlane/test_output 69 | SafeConfiguration.plist 70 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | Contributions to this project are governed by the Contributor Covenant version 1.4 (https://www.contributor-covenant.org/version/1/4/code-of-conduct.html). All contributors and participants agree to abide by its terms. To report violations, send an email to founders@gitcoin.co 2 | 3 | -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/BetterSegmentedControl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/BetterSegmentedControl -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Headers/BetterSegmentedControl-Swift.h: -------------------------------------------------------------------------------- 1 | // Generated by Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2) 2 | #pragma clang diagnostic push 3 | #pragma clang diagnostic ignored "-Wgcc-compat" 4 | 5 | #if !defined(__has_include) 6 | # define __has_include(x) 0 7 | #endif 8 | #if !defined(__has_attribute) 9 | # define __has_attribute(x) 0 10 | #endif 11 | #if !defined(__has_feature) 12 | # define __has_feature(x) 0 13 | #endif 14 | #if !defined(__has_warning) 15 | # define __has_warning(x) 0 16 | #endif 17 | 18 | #if __has_attribute(external_source_symbol) 19 | # define SWIFT_STRINGIFY(str) #str 20 | # define SWIFT_MODULE_NAMESPACE_PUSH(module_name) _Pragma(SWIFT_STRINGIFY(clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in=module_name, generated_declaration))), apply_to=any(function, enum, objc_interface, objc_category, objc_protocol)))) 21 | # define SWIFT_MODULE_NAMESPACE_POP _Pragma("clang attribute pop") 22 | #else 23 | # define SWIFT_MODULE_NAMESPACE_PUSH(module_name) 24 | # define SWIFT_MODULE_NAMESPACE_POP 25 | #endif 26 | 27 | #if __has_include() 28 | # include 29 | #endif 30 | 31 | #pragma clang diagnostic ignored "-Wauto-import" 32 | #include 33 | #include 34 | #include 35 | #include 36 | 37 | #if !defined(SWIFT_TYPEDEFS) 38 | # define SWIFT_TYPEDEFS 1 39 | # if __has_include() 40 | # include 41 | # elif !defined(__cplusplus) || __cplusplus < 201103L 42 | typedef uint_least16_t char16_t; 43 | typedef uint_least32_t char32_t; 44 | # endif 45 | typedef float swift_float2 __attribute__((__ext_vector_type__(2))); 46 | typedef float swift_float3 __attribute__((__ext_vector_type__(3))); 47 | typedef float swift_float4 __attribute__((__ext_vector_type__(4))); 48 | typedef double swift_double2 __attribute__((__ext_vector_type__(2))); 49 | typedef double swift_double3 __attribute__((__ext_vector_type__(3))); 50 | typedef double swift_double4 __attribute__((__ext_vector_type__(4))); 51 | typedef int swift_int2 __attribute__((__ext_vector_type__(2))); 52 | typedef int swift_int3 __attribute__((__ext_vector_type__(3))); 53 | typedef int swift_int4 __attribute__((__ext_vector_type__(4))); 54 | typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2))); 55 | typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3))); 56 | typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4))); 57 | #endif 58 | 59 | #if !defined(SWIFT_PASTE) 60 | # define SWIFT_PASTE_HELPER(x, y) x##y 61 | # define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y) 62 | #endif 63 | #if !defined(SWIFT_METATYPE) 64 | # define SWIFT_METATYPE(X) Class 65 | #endif 66 | #if !defined(SWIFT_CLASS_PROPERTY) 67 | # if __has_feature(objc_class_property) 68 | # define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__ 69 | # else 70 | # define SWIFT_CLASS_PROPERTY(...) 71 | # endif 72 | #endif 73 | 74 | #if __has_attribute(objc_runtime_name) 75 | # define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X))) 76 | #else 77 | # define SWIFT_RUNTIME_NAME(X) 78 | #endif 79 | #if __has_attribute(swift_name) 80 | # define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X))) 81 | #else 82 | # define SWIFT_COMPILE_NAME(X) 83 | #endif 84 | #if __has_attribute(objc_method_family) 85 | # define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X))) 86 | #else 87 | # define SWIFT_METHOD_FAMILY(X) 88 | #endif 89 | #if __has_attribute(noescape) 90 | # define SWIFT_NOESCAPE __attribute__((noescape)) 91 | #else 92 | # define SWIFT_NOESCAPE 93 | #endif 94 | #if __has_attribute(warn_unused_result) 95 | # define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 96 | #else 97 | # define SWIFT_WARN_UNUSED_RESULT 98 | #endif 99 | #if __has_attribute(noreturn) 100 | # define SWIFT_NORETURN __attribute__((noreturn)) 101 | #else 102 | # define SWIFT_NORETURN 103 | #endif 104 | #if !defined(SWIFT_CLASS_EXTRA) 105 | # define SWIFT_CLASS_EXTRA 106 | #endif 107 | #if !defined(SWIFT_PROTOCOL_EXTRA) 108 | # define SWIFT_PROTOCOL_EXTRA 109 | #endif 110 | #if !defined(SWIFT_ENUM_EXTRA) 111 | # define SWIFT_ENUM_EXTRA 112 | #endif 113 | #if !defined(SWIFT_CLASS) 114 | # if __has_attribute(objc_subclassing_restricted) 115 | # define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA 116 | # define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 117 | # else 118 | # define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 119 | # define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA 120 | # endif 121 | #endif 122 | 123 | #if !defined(SWIFT_PROTOCOL) 124 | # define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA 125 | # define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA 126 | #endif 127 | 128 | #if !defined(SWIFT_EXTENSION) 129 | # define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__) 130 | #endif 131 | 132 | #if !defined(OBJC_DESIGNATED_INITIALIZER) 133 | # if __has_attribute(objc_designated_initializer) 134 | # define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) 135 | # else 136 | # define OBJC_DESIGNATED_INITIALIZER 137 | # endif 138 | #endif 139 | #if !defined(SWIFT_ENUM_ATTR) 140 | # if defined(__has_attribute) && __has_attribute(enum_extensibility) 141 | # define SWIFT_ENUM_ATTR __attribute__((enum_extensibility(open))) 142 | # else 143 | # define SWIFT_ENUM_ATTR 144 | # endif 145 | #endif 146 | #if !defined(SWIFT_ENUM) 147 | # define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type 148 | # if __has_feature(generalized_swift_name) 149 | # define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type 150 | # else 151 | # define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name) 152 | # endif 153 | #endif 154 | #if !defined(SWIFT_UNAVAILABLE) 155 | # define SWIFT_UNAVAILABLE __attribute__((unavailable)) 156 | #endif 157 | #if !defined(SWIFT_UNAVAILABLE_MSG) 158 | # define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg))) 159 | #endif 160 | #if !defined(SWIFT_AVAILABILITY) 161 | # define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__))) 162 | #endif 163 | #if !defined(SWIFT_DEPRECATED) 164 | # define SWIFT_DEPRECATED __attribute__((deprecated)) 165 | #endif 166 | #if !defined(SWIFT_DEPRECATED_MSG) 167 | # define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__))) 168 | #endif 169 | #if __has_feature(attribute_diagnose_if_objc) 170 | # define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning"))) 171 | #else 172 | # define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg) 173 | #endif 174 | #if __has_feature(modules) 175 | @import UIKit; 176 | @import CoreGraphics; 177 | #endif 178 | 179 | #pragma clang diagnostic ignored "-Wproperty-attribute-mismatch" 180 | #pragma clang diagnostic ignored "-Wduplicate-method-arg" 181 | #if __has_warning("-Wpragma-clang-attribute") 182 | # pragma clang diagnostic ignored "-Wpragma-clang-attribute" 183 | #endif 184 | #pragma clang diagnostic ignored "-Wunknown-pragmas" 185 | #pragma clang diagnostic ignored "-Wnullability" 186 | 187 | SWIFT_MODULE_NAMESPACE_PUSH("BetterSegmentedControl") 188 | @class UIColor; 189 | @class NSCoder; 190 | 191 | SWIFT_CLASS("_TtC22BetterSegmentedControl22BetterSegmentedControl") 192 | @interface BetterSegmentedControl : UIControl 193 | /// Whether the indicator should bounce when selecting a new index. Defaults to true 194 | @property (nonatomic, readonly) BOOL bouncesOnChange; 195 | /// Whether the the control should always send the .ValueChanged event, regardless of the index remaining unchanged after interaction. Defaults to false 196 | @property (nonatomic, readonly) BOOL alwaysAnnouncesValue; 197 | /// Whether to send the .ValueChanged event immediately or wait for animations to complete. Defaults to true 198 | @property (nonatomic, readonly) BOOL announcesValueImmediately; 199 | /// Whether the the control should ignore pan gestures. Defaults to false 200 | @property (nonatomic, readonly) BOOL panningDisabled; 201 | /// The control’s and indicator’s corner radii 202 | @property (nonatomic, readonly) CGFloat cornerRadius; 203 | /// The indicator view’s background color 204 | @property (nonatomic, readonly, strong) UIColor * _Nullable indicatorViewBackgroundColor; 205 | /// The indicator view’s inset. Defaults to 2.0 206 | @property (nonatomic, readonly) CGFloat indicatorViewInset; 207 | /// The indicator view’s border width 208 | @property (nonatomic, readonly) CGFloat indicatorViewBorderWidth; 209 | /// The indicator view’s border color 210 | @property (nonatomic, readonly, strong) UIColor * _Nullable indicatorViewBorderColor; 211 | /// The text color of the non-selected titles / options 212 | @property (nonatomic, readonly, strong) UIColor * _Nonnull titleColor; 213 | /// The text color of the selected title / option 214 | @property (nonatomic, readonly, strong) UIColor * _Nonnull selectedTitleColor; 215 | /// The titles’ border width 216 | @property (nonatomic, readonly) CGFloat titleBorderWidth; 217 | /// The titles’ number of lines 218 | @property (nonatomic, readonly) NSInteger titleNumberOfLines; 219 | /// The titles’ border color 220 | @property (nonatomic, readonly, strong) UIColor * _Nonnull titleBorderColor; 221 | - (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER; 222 | - (nonnull instancetype)initWithFrame:(CGRect)frame SWIFT_DEPRECATED_MSG("Use init(frame:titles:index:options:) instead."); 223 | - (nonnull instancetype)init SWIFT_UNAVAILABLE; 224 | - (void)layoutSubviews; 225 | @end 226 | 227 | @class UIGestureRecognizer; 228 | 229 | @interface BetterSegmentedControl (SWIFT_EXTENSION(BetterSegmentedControl)) 230 | - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer * _Nonnull)gestureRecognizer SWIFT_WARN_UNUSED_RESULT; 231 | @end 232 | 233 | SWIFT_MODULE_NAMESPACE_POP 234 | #pragma clang diagnostic pop 235 | -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Headers/BetterSegmentedControl-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double BetterSegmentedControlVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char BetterSegmentedControlVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Info.plist -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm.swiftdoc -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm.swiftmodule -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm64.swiftdoc -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/arm64.swiftmodule -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/i386.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/i386.swiftdoc -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/i386.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/i386.swiftmodule -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/x86_64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/x86_64.swiftdoc -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/x86_64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Frameworks/BetterSegmentedControl.framework/Modules/BetterSegmentedControl.swiftmodule/x86_64.swiftmodule -------------------------------------------------------------------------------- /Frameworks/BetterSegmentedControl.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module BetterSegmentedControl { 2 | umbrella header "BetterSegmentedControl-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | 8 | module BetterSegmentedControl.Swift { 9 | header "BetterSegmentedControl-Swift.h" 10 | requires objc 11 | } 12 | -------------------------------------------------------------------------------- /Gitcoin.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Gitcoin.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Gitcoin/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftyUserDefaults 11 | import SwiftyBeaver 12 | import Fabric 13 | import Crashlytics 14 | import Pushwoosh 15 | import UserNotifications 16 | import Mixpanel 17 | 18 | @UIApplicationMain 19 | class AppDelegate: UIResponder, UIApplicationDelegate, PushNotificationDelegate { 20 | 21 | var window: UIWindow? 22 | 23 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 24 | setupLogger() 25 | 26 | #if DEBUG 27 | logger.verbose("Launching app in DEBUG MODE") 28 | Mixpanel.initialize(token: "9c41aa33ab527580f8d07e31f252b9ad") // <- craig's dev token 29 | #else 30 | logger.verbose("Launching app in RELEASE MODE") 31 | Mixpanel.initialize(token: "ce3c7c698880b9c88f4201ead456a633") // <- gitcoin token 32 | #endif 33 | 34 | Fabric.with([Crashlytics.self]) 35 | 36 | // set custom delegate for push handling, in our case AppDelegate 37 | PushNotificationManager.push().delegate = self 38 | 39 | // set default Pushwoosh delegate for iOS10 foreground push handling 40 | if #available(iOS 10.0, *) { 41 | UNUserNotificationCenter.current().delegate = PushNotificationManager.push().notificationCenterDelegate 42 | } 43 | 44 | // track application open statistics 45 | PushNotificationManager.push().sendAppOpen() 46 | 47 | // register for push notifications! 48 | PushNotificationManager.push().registerForPushNotifications() 49 | 50 | Crashlytics.sharedInstance().setUserIdentifier(PushNotificationManager.push().getHWID()) 51 | 52 | NetworkReachability.shared.start() 53 | 54 | //setup custom navigation bar 55 | let navigationBarAppearace = UINavigationBar.appearance() 56 | let image = #imageLiteral(resourceName: "nav-bar-bg") 57 | 58 | navigationBarAppearace.setBackgroundImage(image.resizableImage(withCapInsets: UIEdgeInsetsMake(0, 0, 0, 0), resizingMode: .stretch), for: .default) 59 | 60 | UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) 61 | 62 | UIApplication.shared.applicationIconBadgeNumber = 0 63 | 64 | return false 65 | } 66 | 67 | func applicationWillEnterForeground(_ application: UIApplication) { 68 | NetworkReachability.shared.start() 69 | 70 | UIApplication.shared.applicationIconBadgeNumber = 0 71 | } 72 | 73 | func applicationDidEnterBackground(_ application: UIApplication) { 74 | NetworkReachability.shared.stop() 75 | } 76 | 77 | func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 78 | PushNotificationManager.push().handlePushRegistration(deviceToken as Data!) 79 | } 80 | 81 | func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { 82 | PushNotificationManager.push().handlePushRegistrationFailure(error) 83 | } 84 | 85 | func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], 86 | fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 87 | PushNotificationManager.push().handlePushReceived(userInfo) 88 | completionHandler(UIBackgroundFetchResult.noData) 89 | } 90 | 91 | // this event is fired when the push is received in the app 92 | func onPushReceived(_ pushManager: PushNotificationManager!, withNotification pushNotification: [AnyHashable : Any]!, onStart: Bool) { 93 | logger.verbose("Push notification received: \(pushNotification)") 94 | // shows a push is received. Implement passive reaction to a push, such as UI update or data download. 95 | } 96 | 97 | // this event is fired when user clicks on notification 98 | func onPushAccepted(_ pushManager: PushNotificationManager!, withNotification pushNotification: [AnyHashable : Any]!, onStart: Bool) { 99 | logger.verbose("Push notification accepted: \(pushNotification)") 100 | // shows a user tapped the notification. Implement user interaction, such as showing push details 101 | } 102 | 103 | 104 | func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 105 | 106 | let lastViewedBountyId = Defaults[UserDefaultKeyConstants.lastViewedBountyId] 107 | let userKeywords = Defaults[UserDefaultKeyConstants.userKeywords] 108 | 109 | _ = GitcoinAPIService.shared.provider.rx.request(.bounties(lastViewedBountyId: lastViewedBountyId, userKeywords: userKeywords)) 110 | .map(to: [Bounty].self) 111 | .subscribe { event in 112 | switch event { 113 | case .success(let repos): 114 | 115 | TrackingManager.shared.trackEvent(GitcoinEvent.didBackgroundBountyFetch(hasBounties: repos.count > 0)) 116 | TrackingManager.shared.trackEvent(GitcoinEvent.didBountyCountChange(count: repos.count)) 117 | completionHandler(UIBackgroundFetchResult.newData) 118 | 119 | case .error(_): 120 | 121 | completionHandler(UIBackgroundFetchResult.failed) 122 | } 123 | } 124 | } 125 | 126 | fileprivate func setupLogger(){ 127 | let console = ConsoleDestination() 128 | 129 | console.minLevel = .error 130 | 131 | logger.addDestination(console) 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "size" : "29x29", 10 | "idiom" : "iphone", 11 | "filename" : "Icon-App-29x29@3x.png", 12 | "scale" : "3x" 13 | }, 14 | { 15 | "size" : "60x45", 16 | "idiom" : "iphone", 17 | "filename" : "icon-messages-app-iPhone-60x45@2x.png", 18 | "scale" : "2x" 19 | }, 20 | { 21 | "size" : "60x45", 22 | "idiom" : "iphone", 23 | "filename" : "icon-messages-app-iPhone-60x45@3x.png", 24 | "scale" : "3x" 25 | }, 26 | { 27 | "idiom" : "ipad", 28 | "size" : "29x29", 29 | "scale" : "2x" 30 | }, 31 | { 32 | "size" : "67x50", 33 | "idiom" : "ipad", 34 | "filename" : "icon-messages-app-iPadAir-67x50@2x.png", 35 | "scale" : "2x" 36 | }, 37 | { 38 | "idiom" : "ipad", 39 | "size" : "74x55", 40 | "scale" : "2x" 41 | }, 42 | { 43 | "idiom" : "ios-marketing", 44 | "size" : "1024x1024", 45 | "scale" : "1x" 46 | }, 47 | { 48 | "size" : "27x20", 49 | "idiom" : "universal", 50 | "filename" : "icon-messages-app-27x20@2x.png", 51 | "scale" : "2x", 52 | "platform" : "ios" 53 | }, 54 | { 55 | "size" : "27x20", 56 | "idiom" : "universal", 57 | "filename" : "icon-messages-app-27x20@3x.png", 58 | "scale" : "3x", 59 | "platform" : "ios" 60 | }, 61 | { 62 | "size" : "32x24", 63 | "idiom" : "universal", 64 | "filename" : "icon-messages-transcript-32x24@2x.png", 65 | "scale" : "2x", 66 | "platform" : "ios" 67 | }, 68 | { 69 | "size" : "32x24", 70 | "idiom" : "universal", 71 | "filename" : "icon-messages-transcript-32x24@3x.png", 72 | "scale" : "3x", 73 | "platform" : "ios" 74 | }, 75 | { 76 | "size" : "1024x768", 77 | "idiom" : "ios-marketing", 78 | "filename" : "icon-messages-app-store-1024x768.png", 79 | "scale" : "1x", 80 | "platform" : "ios" 81 | } 82 | ], 83 | "info" : { 84 | "version" : 1, 85 | "author" : "xcode" 86 | } 87 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-27x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-27x20@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-27x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-27x20@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPadAir-67x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPadAir-67x50@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPhone-60x45@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPhone-60x45@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPhone-60x45@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-iPhone-60x45@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-store-1024x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-app-store-1024x768.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-transcript-32x24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-transcript-32x24@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-transcript-32x24@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Messages.stickersiconset/icon-messages-transcript-32x24@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "24x24", 5 | "idiom" : "watch", 6 | "filename" : "Icon-24@2x.png", 7 | "scale" : "2x", 8 | "role" : "notificationCenter", 9 | "subtype" : "38mm" 10 | }, 11 | { 12 | "size" : "27.5x27.5", 13 | "idiom" : "watch", 14 | "filename" : "Icon-27.5@2x.png", 15 | "scale" : "2x", 16 | "role" : "notificationCenter", 17 | "subtype" : "42mm" 18 | }, 19 | { 20 | "size" : "29x29", 21 | "idiom" : "watch", 22 | "filename" : "Icon-29@2x.png", 23 | "role" : "companionSettings", 24 | "scale" : "2x" 25 | }, 26 | { 27 | "size" : "29x29", 28 | "idiom" : "watch", 29 | "filename" : "Icon-29@3x.png", 30 | "role" : "companionSettings", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "watch", 36 | "filename" : "Icon-40@2x.png", 37 | "scale" : "2x", 38 | "role" : "appLauncher", 39 | "subtype" : "38mm" 40 | }, 41 | { 42 | "size" : "44x44", 43 | "idiom" : "watch", 44 | "filename" : "Icon-44@2x.png", 45 | "scale" : "2x", 46 | "role" : "longLook", 47 | "subtype" : "42mm" 48 | }, 49 | { 50 | "size" : "86x86", 51 | "idiom" : "watch", 52 | "filename" : "Icon-86@2x.png", 53 | "scale" : "2x", 54 | "role" : "quickLook", 55 | "subtype" : "38mm" 56 | }, 57 | { 58 | "size" : "98x98", 59 | "idiom" : "watch", 60 | "filename" : "Icon-98@2x.png", 61 | "scale" : "2x", 62 | "role" : "quickLook", 63 | "subtype" : "42mm" 64 | }, 65 | { 66 | "idiom" : "watch-marketing", 67 | "size" : "1024x1024", 68 | "scale" : "1x" 69 | } 70 | ], 71 | "info" : { 72 | "version" : 1, 73 | "author" : "xcode" 74 | } 75 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-24@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-27.5@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-29@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-29@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-44@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-86@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon - Watch.appiconset/Icon-98@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "ItunesArtwork@2x.png", 115 | "scale" : "1x" 116 | }, 117 | { 118 | "size" : "40x40", 119 | "idiom" : "iphone", 120 | "filename" : "Icon-App-40x40@1x.png", 121 | "scale" : "1x" 122 | }, 123 | { 124 | "size" : "60x60", 125 | "idiom" : "iphone", 126 | "filename" : "Icon-App-60x60@1x.png", 127 | "scale" : "1x" 128 | }, 129 | { 130 | "size" : "76x76", 131 | "idiom" : "ipad", 132 | "filename" : "Icon-App-76x76@3x.png", 133 | "scale" : "3x" 134 | } 135 | ], 136 | "info" : { 137 | "version" : 1, 138 | "author" : "xcode" 139 | } 140 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-60.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-72.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-72@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/Icon@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-get-started-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-get-started-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-get-started-btn.imageset/gc-get-started-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-get-started-btn.imageset/gc-get-started-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-join-slack-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-join-slack-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-join-slack-btn.imageset/gc-join-slack-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-join-slack-btn.imageset/gc-join-slack-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-learn-more-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-learn-more-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-learn-more-btn.imageset/gc-learn-more-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-learn-more-btn.imageset/gc-learn-more-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-logout-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-logout-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-logout-btn.imageset/gc-logout-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-logout-btn.imageset/gc-logout-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-refresh-bounties-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-refresh-bounties-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-refresh-bounties-btn.imageset/gc-refresh-bounties-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-refresh-bounties-btn.imageset/gc-refresh-bounties-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-signin-github-btn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-signin-github-btn.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Buttons/gc-signin-github-btn.imageset/gc-signin-github-btn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Buttons/gc-signin-github-btn.imageset/gc-signin-github-btn.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_like.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "overlay_like.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "overlay_like@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_like.imageset/overlay_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Card/overlay_like.imageset/overlay_like.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_like.imageset/overlay_like@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Card/overlay_like.imageset/overlay_like@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_skip.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "overlay_skip.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "overlay_skip@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_skip.imageset/overlay_skip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Card/overlay_skip.imageset/overlay_skip.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Card/overlay_skip.imageset/overlay_skip@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Card/overlay_skip.imageset/overlay_skip@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/CelestialWhite.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0xEF", 13 | "alpha" : "1.000", 14 | "blue" : "0xEE", 15 | "green" : "0xF4" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/CosmicTeal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x25", 13 | "alpha" : "1.000", 14 | "blue" : "0x99", 15 | "green" : "0xE8" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/DarkCosmicTeal.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x0F", 13 | "alpha" : "1.000", 14 | "blue" : "0x7C", 15 | "green" : "0xCE" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/MidnightBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x0D", 13 | "alpha" : "1.000", 14 | "blue" : "0x3C", 15 | "green" : "0x00" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/MilkyWayBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x15", 13 | "alpha" : "1.000", 14 | "blue" : "0x3E", 15 | "green" : "0x00" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/PolarisBlue.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x3E", 13 | "alpha" : "1.000", 14 | "blue" : "0xFF", 15 | "green" : "0x00" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/RegulusRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0xF9", 13 | "alpha" : "1.000", 14 | "blue" : "0x6C", 15 | "green" : "0x00" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/StarDustYellow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0xFF", 13 | "alpha" : "1.000", 14 | "blue" : "0x08", 15 | "green" : "0xCE" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Brand/VinusPurple.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x8E", 13 | "alpha" : "1.000", 14 | "blue" : "0xBE", 15 | "green" : "0x2A" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black12.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.000", 13 | "alpha" : "0.120", 14 | "blue" : "0.000", 15 | "green" : "0.000" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black26.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.000", 13 | "alpha" : "0.260", 14 | "blue" : "0.000", 15 | "green" : "0.000" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black38.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.000", 13 | "alpha" : "0.380", 14 | "blue" : "0.000", 15 | "green" : "0.000" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black54.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.000", 13 | "alpha" : "0.540", 14 | "blue" : "0.000", 15 | "green" : "0.000" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black70.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.000", 13 | "alpha" : "0.700", 14 | "blue" : "0.000", 15 | "green" : "0.000" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Black87.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0x00", 13 | "alpha" : "0.870", 14 | "blue" : "0x00", 15 | "green" : "0x00" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Colors/Text/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-cash-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-cash-icon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-cash-icon.imageset/gc-cash-icon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-cash-icon.imageset/gc-cash-icon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-green-heart-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "heartIcon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-green-heart-icon.imageset/heartIcon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-green-heart-icon.imageset/heartIcon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-info-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "aboutIcon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-info-icon.imageset/aboutIcon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-info-icon.imageset/aboutIcon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-network-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-network-icon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-network-icon.imageset/gc-network-icon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-network-icon.imageset/gc-network-icon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-red-cross-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "x.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-red-cross-icon.imageset/x.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-red-cross-icon.imageset/x.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-rocket-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-rocket-icon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-rocket-icon.imageset/gc-rocket-icon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-rocket-icon.imageset/gc-rocket-icon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-user-fill-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "profileLoggedInIcon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-user-fill-icon.imageset/profileLoggedInIcon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-user-fill-icon.imageset/profileLoggedInIcon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-user-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "profileLoggedOutIcon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Icons/gc-user-icon.imageset/profileLoggedOutIcon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Icons/gc-user-icon.imageset/profileLoggedOutIcon.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone 8 Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone 8 Plus.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone 8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone 8.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone SE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone SE.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone X.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/LaunchImage.launchimage/00 iPhone X.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "2436h", 7 | "filename" : "00 iPhone X.png", 8 | "minimum-system-version" : "11.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "extent" : "full-screen", 14 | "idiom" : "iphone", 15 | "subtype" : "736h", 16 | "filename" : "00 iPhone 8 Plus.png", 17 | "minimum-system-version" : "8.0", 18 | "orientation" : "portrait", 19 | "scale" : "3x" 20 | }, 21 | { 22 | "extent" : "full-screen", 23 | "idiom" : "iphone", 24 | "subtype" : "667h", 25 | "filename" : "00 iPhone 8.png", 26 | "minimum-system-version" : "8.0", 27 | "orientation" : "portrait", 28 | "scale" : "2x" 29 | }, 30 | { 31 | "orientation" : "portrait", 32 | "idiom" : "iphone", 33 | "extent" : "full-screen", 34 | "minimum-system-version" : "7.0", 35 | "scale" : "2x" 36 | }, 37 | { 38 | "extent" : "full-screen", 39 | "idiom" : "iphone", 40 | "subtype" : "retina4", 41 | "filename" : "00 iPhone SE.png", 42 | "minimum-system-version" : "7.0", 43 | "orientation" : "portrait", 44 | "scale" : "2x" 45 | } 46 | ], 47 | "info" : { 48 | "version" : 1, 49 | "author" : "xcode" 50 | } 51 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone 8 Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone 8 Plus.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone 8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone 8.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone SE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Launcher.imageset/00 iPhone SE.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Launcher.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "00 iPhone SE.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "00 iPhone 8.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "00 iPhone 8 Plus.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Logos/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Logos/gc-logo-gray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-logo-gray.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Logos/gc-logo-gray.imageset/gc-logo-gray.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Logos/gc-logo-gray.imageset/gc-logo-gray.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Logos/gc-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "gc-logo.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/Logos/gc-logo.imageset/gc-logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/Logos/gc-logo.imageset/gc-logo.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/bg-fade.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "fade.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "fade@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "fade@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/bg-fade.imageset/fade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/bg-fade.imageset/fade.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/bg-fade.imageset/fade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/bg-fade.imageset/fade@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/bg-fade.imageset/fade@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/bg-fade.imageset/fade@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/gc-divine-robot.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "divine-robot.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/gc-divine-robot.imageset/divine-robot.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/gc-divine-robot.imageset/divine-robot.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/guy1_black.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "guy1_black.png" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/guy1_black.imageset/guy1_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/guy1_black.imageset/guy1_black.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/leftIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "leftIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "leftIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "leftIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/leftIcon.imageset/leftIcon@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/nav-bar-bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "navbarBg.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "navbarBg@2x.jpg", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "navbarBg@3x.jpg", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg.jpg -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg@2x.jpg -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg@3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/nav-bar-bg.imageset/navbarBg@3x.jpg -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/rightIcon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "rightIcon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "rightIcon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "rightIcon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon@2x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/rightIcon.imageset/rightIcon@3x.png -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/user-portrait.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "portraitCardDefault.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/user-portrait.imageset/portraitCardDefault.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/user-portrait.imageset/portraitCardDefault.pdf -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/video-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "video-placeholder.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /Gitcoin/Assets.xcassets/video-placeholder.imageset/video-placeholder.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Assets.xcassets/video-placeholder.imageset/video-placeholder.pdf -------------------------------------------------------------------------------- /Gitcoin/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Gitcoin/Fonts/Futura/Futura.ttc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Futura/Futura.ttc -------------------------------------------------------------------------------- /Gitcoin/Fonts/Futura/FuturaStd-Book.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Futura/FuturaStd-Book.otf -------------------------------------------------------------------------------- /Gitcoin/Fonts/Futura/FuturaStd-MediumOblique.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Futura/FuturaStd-MediumOblique.otf -------------------------------------------------------------------------------- /Gitcoin/Fonts/Roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /Gitcoin/Fonts/Roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /Gitcoin/Fonts/Roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/Gitcoin/Fonts/Roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /Gitcoin/Gitcoin-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Gitcoin-Bridging-Header.h 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 4/14/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | #ifndef Gitcoin_Bridging_Header_h 10 | #define Gitcoin_Bridging_Header_h 11 | 12 | #endif /* Gitcoin_Bridging_Header_h */ 13 | -------------------------------------------------------------------------------- /Gitcoin/Gitcoin.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | 9 | -------------------------------------------------------------------------------- /Gitcoin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.2 19 | CFBundleURLTypes 20 | 21 | 22 | CFBundleURLName 23 | com.gitcoin.gitcoin 24 | CFBundleURLSchemes 25 | 26 | gitcoin 27 | pw-7065F-A3460 28 | 29 | 30 | 31 | CFBundleVersion 32 | 20 33 | Fabric 34 | 35 | APIKey 36 | a3b9ff62a212f6824a382f89426406cdb702b865 37 | Kits 38 | 39 | 40 | KitInfo 41 | 42 | KitName 43 | Crashlytics 44 | 45 | 46 | 47 | ITSAppUsesNonExemptEncryption 48 | 49 | LSApplicationCategoryType 50 | 51 | LSRequiresIPhoneOS 52 | 53 | Pushwoosh_APPID 54 | 7065F-A3460 55 | Pushwoosh_LOG_LEVEL 56 | ERROR 57 | UIAppFonts 58 | 59 | Futura.ttc 60 | Roboto-Regular.ttf 61 | FuturaStd-Book.otf 62 | Roboto-Medium.ttf 63 | Roboto-Bold.ttf 64 | FuturaStd-MediumOblique.otf 65 | 66 | UIBackgroundModes 67 | 68 | remote-notification 69 | fetch 70 | 71 | UILaunchStoryboardName 72 | LaunchScreen 73 | UIMainStoryboardFile 74 | Main 75 | UIRequiredDeviceCapabilities 76 | 77 | armv7 78 | 79 | UIStatusBarStyle 80 | UIStatusBarStyleLightContent 81 | UISupportedInterfaceOrientations 82 | 83 | UIInterfaceOrientationPortrait 84 | UIInterfaceOrientationPortraitUpsideDown 85 | 86 | UISupportedInterfaceOrientations~ipad 87 | 88 | UIInterfaceOrientationPortrait 89 | UIInterfaceOrientationPortraitUpsideDown 90 | UIInterfaceOrientationLandscapeLeft 91 | UIInterfaceOrientationLandscapeRight 92 | 93 | UIViewControllerBasedStatusBarAppearance 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Gitcoin/Library/Device.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Device.swift 3 | // imHome 4 | // 5 | // Created by Kevin Xu on 2/9/15. Updated on 6/20/15. 6 | // Copyright (c) 2015 Alpha Labs, Inc. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: - Device Structure 12 | 13 | struct Device { 14 | 15 | // MARK: - Singletons 16 | 17 | static var TheCurrentDevice: UIDevice { 18 | struct Singleton { 19 | static let device = UIDevice.current 20 | } 21 | return Singleton.device 22 | } 23 | 24 | static var TheCurrentDeviceVersion: Float { 25 | struct Singleton { 26 | static let version = Float(UIDevice.current.systemVersion) 27 | } 28 | return Singleton.version! 29 | } 30 | 31 | static var TheCurrentDeviceHeight: CGFloat { 32 | struct Singleton { 33 | static let height = UIScreen.main.bounds.size.height 34 | } 35 | return Singleton.height 36 | } 37 | 38 | // MARK: - Device Idiom Checks 39 | 40 | static var PHONE_OR_PAD: String { 41 | if isPhone() { 42 | return "iPhone" 43 | } else if isPad() { 44 | return "iPad" 45 | } 46 | return "Not iPhone nor iPad" 47 | } 48 | 49 | static var DEBUG_OR_RELEASE: String { 50 | #if DEBUG 51 | return "Debug" 52 | #else 53 | return "Release" 54 | #endif 55 | } 56 | 57 | static var SIMULATOR_OR_DEVICE: String { 58 | #if (arch(i386) || arch(x86_64)) && os(iOS) 59 | return "Simulator" 60 | #else 61 | return "Device" 62 | #endif 63 | } 64 | 65 | // static var CURRENT_DEVICE: String { 66 | // return GBDeviceInfo.deviceInfo().modelString 67 | // } 68 | 69 | static func isPhone() -> Bool { 70 | return TheCurrentDevice.userInterfaceIdiom == .phone 71 | } 72 | 73 | static func isPad() -> Bool { 74 | return TheCurrentDevice.userInterfaceIdiom == .pad 75 | } 76 | 77 | static func isDebug() -> Bool { 78 | return DEBUG_OR_RELEASE == "Debug" 79 | } 80 | 81 | static func isRelease() -> Bool { 82 | return DEBUG_OR_RELEASE == "Release" 83 | } 84 | 85 | static func isSimulator() -> Bool { 86 | return SIMULATOR_OR_DEVICE == "Simulator" 87 | } 88 | 89 | static func isDevice() -> Bool { 90 | return SIMULATOR_OR_DEVICE == "Device" 91 | } 92 | 93 | // MARK: - Device Version Checks 94 | 95 | enum Versions: Float { 96 | case Five = 5.0 97 | case Six = 6.0 98 | case Seven = 7.0 99 | case Eight = 8.0 100 | case Nine = 9.0 101 | } 102 | 103 | static func isVersion(version: Versions) -> Bool { 104 | return TheCurrentDeviceVersion >= version.rawValue && TheCurrentDeviceVersion < (version.rawValue + 1.0) 105 | } 106 | 107 | static func isVersionOrLater(version: Versions) -> Bool { 108 | return TheCurrentDeviceVersion >= version.rawValue 109 | } 110 | 111 | static func isVersionOrEarlier(version: Versions) -> Bool { 112 | return TheCurrentDeviceVersion < (version.rawValue + 1.0) 113 | } 114 | 115 | static var CURRENT_VERSION: String { 116 | return "\(TheCurrentDeviceVersion)" 117 | } 118 | 119 | // MARK: iOS 5 Checks 120 | 121 | static func IS_OS_5() -> Bool { 122 | return isVersion(version: .Five) 123 | } 124 | 125 | static func IS_OS_5_OR_LATER() -> Bool { 126 | return isVersionOrLater(version: .Five) 127 | } 128 | 129 | static func IS_OS_5_OR_EARLIER() -> Bool { 130 | return isVersionOrEarlier(version: .Five) 131 | } 132 | 133 | // MARK: iOS 6 Checks 134 | 135 | static func IS_OS_6() -> Bool { 136 | return isVersion(version: .Six) 137 | } 138 | 139 | static func IS_OS_6_OR_LATER() -> Bool { 140 | return isVersionOrLater(version: .Six) 141 | } 142 | 143 | static func IS_OS_6_OR_EARLIER() -> Bool { 144 | return isVersionOrEarlier(version: .Six) 145 | } 146 | 147 | // MARK: iOS 7 Checks 148 | 149 | static func IS_OS_7() -> Bool { 150 | return isVersion(version: .Seven) 151 | } 152 | 153 | static func IS_OS_7_OR_LATER() -> Bool { 154 | return isVersionOrLater(version: .Seven) 155 | } 156 | 157 | static func IS_OS_7_OR_EARLIER() -> Bool { 158 | return isVersionOrEarlier(version: .Seven) 159 | } 160 | 161 | // MARK: iOS 8 Checks 162 | 163 | static func IS_OS_8() -> Bool { 164 | return isVersion(version: .Eight) 165 | } 166 | 167 | static func IS_OS_8_OR_LATER() -> Bool { 168 | return isVersionOrLater(version: .Eight) 169 | } 170 | 171 | static func IS_OS_8_OR_EARLIER() -> Bool { 172 | return isVersionOrEarlier(version: .Eight) 173 | } 174 | 175 | // MARK: iOS 9 Checks 176 | 177 | static func IS_OS_9() -> Bool { 178 | return isVersion(version: .Nine) 179 | } 180 | 181 | static func IS_OS_9_OR_LATER() -> Bool { 182 | return isVersionOrLater(version: .Nine) 183 | } 184 | 185 | static func IS_OS_9_OR_EARLIER() -> Bool { 186 | return isVersionOrEarlier(version: .Nine) 187 | } 188 | 189 | // MARK: - Device Size Checks 190 | 191 | enum Heights: CGFloat { 192 | case Inches_3_5 = 480 193 | case Inches_4 = 568 194 | case Inches_4_7 = 667 195 | case Inches_5_5 = 736 196 | } 197 | 198 | static func isSize(height: Heights) -> Bool { 199 | return TheCurrentDeviceHeight == height.rawValue 200 | } 201 | 202 | static func isSizeOrLarger(height: Heights) -> Bool { 203 | return TheCurrentDeviceHeight >= height.rawValue 204 | } 205 | 206 | static func isSizeOrSmaller(height: Heights) -> Bool { 207 | return TheCurrentDeviceHeight <= height.rawValue 208 | } 209 | 210 | static var CURRENT_SIZE: String { 211 | if IS_3_5_INCHES() { 212 | return "3.5 Inches" 213 | } else if IS_4_INCHES() { 214 | return "4 Inches" 215 | } else if IS_4_7_INCHES() { 216 | return "4.7 Inches" 217 | } else if IS_5_5_INCHES() { 218 | return "5.5 Inches" 219 | } 220 | return "\(TheCurrentDeviceHeight) Points" 221 | } 222 | 223 | // MARK: Retina Check 224 | 225 | // static func IS_RETINA() -> Bool { 226 | // return UIScreen.mainScreen.respondsToSelector("scale") 227 | // } 228 | 229 | // MARK: 3.5 Inch Checks 230 | 231 | static func IS_3_5_INCHES() -> Bool { 232 | return isPhone() && isSize(height: .Inches_3_5) 233 | } 234 | 235 | static func IS_3_5_INCHES_OR_LARGER() -> Bool { 236 | return isPhone() && isSizeOrLarger(height: .Inches_3_5) 237 | } 238 | 239 | static func IS_3_5_INCHES_OR_SMALLER() -> Bool { 240 | return isPhone() && isSizeOrSmaller(height: .Inches_3_5) 241 | } 242 | 243 | // MARK: 4 Inch Checks 244 | 245 | static func IS_4_INCHES() -> Bool { 246 | return isPhone() && isSize(height: .Inches_4) 247 | } 248 | 249 | static func IS_4_INCHES_OR_LARGER() -> Bool { 250 | return isPhone() && isSizeOrLarger(height: .Inches_4) 251 | } 252 | 253 | static func IS_4_INCHES_OR_SMALLER() -> Bool { 254 | return isPhone() && isSizeOrSmaller(height: .Inches_4) 255 | } 256 | 257 | // MARK: 4.7 Inch Checks 258 | 259 | static func IS_4_7_INCHES() -> Bool { 260 | return isPhone() && isSize(height: .Inches_4_7) 261 | } 262 | 263 | static func IS_4_7_INCHES_OR_LARGER() -> Bool { 264 | return isPhone() && isSizeOrLarger(height: .Inches_4_7) 265 | } 266 | 267 | static func IS_4_7_INCHES_OR_SMALLER() -> Bool { 268 | return isPhone() && isSizeOrLarger(height: .Inches_4_7) 269 | } 270 | 271 | // MARK: 5.5 Inch Checks 272 | 273 | static func IS_5_5_INCHES() -> Bool { 274 | return isPhone() && isSize(height: .Inches_5_5) 275 | } 276 | 277 | static func IS_5_5_INCHES_OR_LARGER() -> Bool { 278 | return isPhone() && isSizeOrLarger(height: .Inches_5_5) 279 | } 280 | 281 | static func IS_5_5_INCHES_OR_SMALLER() -> Bool { 282 | return isPhone() && isSizeOrLarger(height: .Inches_5_5) 283 | } 284 | 285 | // MARK: - International Checks 286 | 287 | // static var CURRENT_REGION: String { 288 | // return NSLocale.currentLocale.objectForKey(NSLocaleCountryCode) as! String 289 | // } 290 | } 291 | -------------------------------------------------------------------------------- /Gitcoin/Library/Extensions/Observable+ignoreNil.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+ignoreNil.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 4/4/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | 12 | public protocol OptionalType { 13 | associatedtype Wrapped 14 | 15 | var optional: Wrapped? { get } 16 | } 17 | 18 | extension Optional: OptionalType { 19 | public var optional: Wrapped? { return self } 20 | } 21 | 22 | // Unfortunately the extra type annotations are required, otherwise the compiler gives an incomprehensible error. 23 | extension Observable where Element: OptionalType { 24 | func ignoreNil() -> Observable { 25 | return flatMap { value in 26 | value.optional.map { Observable.just($0) } ?? Observable.empty() 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Gitcoin/Library/Extensions/UIViewController+Spinner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Spinner.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 4/22/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIViewController{ 12 | 13 | func createActivityIndicator() -> UIActivityIndicatorView { 14 | let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 100.0, height: 100.0)) 15 | let screen = UIScreen.main.bounds 16 | let heightOffset:CGFloat = 0.0 17 | activityIndicator.activityIndicatorViewStyle = .whiteLarge 18 | activityIndicator.color = .white 19 | activityIndicator.hidesWhenStopped = true 20 | activityIndicator.layer.cornerRadius = 05 21 | activityIndicator.isOpaque = false 22 | activityIndicator.backgroundColor = UIColor.black.withAlphaComponent(0.6) 23 | 24 | UIApplication.shared.keyWindow?.addSubview(activityIndicator) 25 | activityIndicator.center = CGPoint(x: screen.width / 2, y: (screen.height / 2) + heightOffset) 26 | 27 | return activityIndicator 28 | } 29 | } 30 | 31 | 32 | extension UIView { 33 | func image() -> UIImage { 34 | UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0) 35 | guard let context = UIGraphicsGetCurrentContext() else { 36 | return UIImage() 37 | } 38 | layer.render(in: context) 39 | let image = UIGraphicsGetImageFromCurrentImageContext() 40 | UIGraphicsEndImageContext() 41 | return image! 42 | } 43 | 44 | func addGradientBackground(firstColor: UIColor, secondColor: UIColor){ 45 | clipsToBounds = true 46 | let gradientLayer = CAGradientLayer() 47 | gradientLayer.colors = [firstColor.cgColor, secondColor.cgColor] 48 | gradientLayer.frame = self.bounds 49 | gradientLayer.startPoint = CGPoint(x: 0, y: 0) 50 | gradientLayer.endPoint = CGPoint(x: 0, y: 1) 51 | print(gradientLayer.frame) 52 | self.layer.insertSublayer(gradientLayer, at: 0) 53 | } 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Gitcoin/Library/Extensions/UtilExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UtilExtensions.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 6/8/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIViewController { 12 | func topMostViewController() -> UIViewController { 13 | if self.presentedViewController == nil { 14 | return self 15 | } 16 | if let navigation = self.presentedViewController as? UINavigationController { 17 | return navigation.visibleViewController!.topMostViewController() 18 | } 19 | if let tab = self.presentedViewController as? UITabBarController { 20 | if let selectedTab = tab.selectedViewController { 21 | return selectedTab.topMostViewController() 22 | } 23 | return tab.topMostViewController() 24 | } 25 | return self.presentedViewController!.topMostViewController() 26 | } 27 | } 28 | 29 | extension UIApplication { 30 | func topMostViewController() -> UIViewController? { 31 | return self.keyWindow?.rootViewController?.topMostViewController() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Gitcoin/Model/Bounty.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Bounty.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/2/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Mapper 11 | import AFDateHelper 12 | 13 | struct Bounty: Mappable { 14 | let id: Int 15 | let title: String 16 | let avatarUrl: String? 17 | let githubUrl: String? 18 | let standardBountiesId: Int 19 | 20 | let valueTrue: String? 21 | let tokenName: String? 22 | 23 | let status: String? 24 | let keywords: String? 25 | let bountyOwnerEmail: String? 26 | 27 | 28 | var keywordArray: [String]? { 29 | return keywords?.components(separatedBy: ",") 30 | .map({ $0.trimmingCharacters(in: .whitespacesAndNewlines) }) 31 | .filter({ $0.count > 0 }) 32 | } 33 | 34 | let valueInUsdt: String? 35 | 36 | var usdtDisplayValue: String { 37 | if let valueInUsdt = valueInUsdt { 38 | return "\(valueInUsdt) USD" 39 | } 40 | 41 | return "- USD" 42 | } 43 | 44 | var tokenValueString: String? { 45 | var value = "" 46 | var token = "" 47 | 48 | if let v = valueTrue { 49 | value = String(describing: v) 50 | } 51 | 52 | if let t = tokenName { 53 | token = t 54 | } 55 | 56 | return "\(value) \(token)" 57 | } 58 | 59 | let bountyType: String? 60 | let projectLength: String? 61 | let organizationName: String? 62 | let ownerGithubUsername: String? 63 | 64 | var ownerGithubUrl: URL { 65 | return URL(string: "https://github.com/\(self.ownerGithubUsername)")! 66 | } 67 | 68 | let experienceLevel: String? 69 | 70 | let createdOn: Date? 71 | 72 | var createdAgo: String { 73 | if let createdOn = createdOn { 74 | return createdOn.toStringWithRelativeTime().capitalized 75 | }else{ 76 | return "A while ago" 77 | } 78 | } 79 | 80 | let expiresOn: Date? 81 | 82 | var expiresIn: String { 83 | if let expiresOn = expiresOn { 84 | return expiresOn.toStringWithRelativeTime().capitalized 85 | }else{ 86 | return "In a while" 87 | } 88 | } 89 | 90 | var idString: String { 91 | return String(self.id) 92 | } 93 | 94 | let descriptionText: String? 95 | 96 | let githubIssueNumber: Int? 97 | 98 | let githubOrgName: String? 99 | 100 | let githubRepoName: String? 101 | 102 | init(map: Mapper) throws { 103 | try id = map.from("pk") 104 | try title = map.from("title") 105 | try standardBountiesId = map.from("standard_bounties_id") 106 | avatarUrl = map.optionalFrom("avatar_url") 107 | githubUrl = map.optionalFrom("github_url") 108 | valueTrue = map.optionalFrom("value_true") 109 | tokenName = map.optionalFrom("token_name") 110 | valueInUsdt = map.optionalFrom("value_in_usdt") 111 | bountyType = map.optionalFrom("bounty_type") 112 | projectLength = map.optionalFrom("project_length") 113 | organizationName = map.optionalFrom("org_name") 114 | status = map.optionalFrom("status") 115 | bountyOwnerEmail = map.optionalFrom("bounty_owner_email") 116 | 117 | try ownerGithubUsername = map.from("bounty_owner_github_username") 118 | 119 | experienceLevel = map.optionalFrom("experience_level") 120 | 121 | if let dateString: String = map.optionalFrom("web3_created") { 122 | createdOn = Date(fromString: dateString, format: .isoDateTimeSec) 123 | }else{ 124 | createdOn = Date() 125 | } 126 | 127 | if let dateString: String = map.optionalFrom("expires_date") { 128 | expiresOn = Date(fromString: dateString, format: .isoDateTimeSec) 129 | }else{ 130 | expiresOn = Date() 131 | } 132 | 133 | keywords = map.optionalFrom("keywords") 134 | descriptionText = map.optionalFrom("issue_description_text") 135 | githubIssueNumber = map.optionalFrom("github_issue_number") 136 | githubOrgName = map.optionalFrom("github_org_name") 137 | githubRepoName = map.optionalFrom("github_repo_name") 138 | 139 | } 140 | 141 | func dictionaryForTracking() -> [String:Any]{ 142 | return ["id": self.idString, "title": self.title] 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /Gitcoin/Model/UserKeywordResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserKeywordResult.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/9/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Mapper 11 | 12 | struct UserKeywordResult: Mappable { 13 | 14 | let status: Int? 15 | let keywords: [String]? 16 | 17 | init(map: Mapper) throws { 18 | status = map.optionalFrom("status") // Optional property 19 | keywords = map.optionalFrom("keywords") // Optional property 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Gitcoin/Network/GitcoinAPIService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitcoinAPIService.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/2/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Moya 10 | import Octokit 11 | 12 | class GitcoinAPIService { 13 | static let shared = GitcoinAPIService() 14 | 15 | let provider: MoyaProvider 16 | 17 | init() { 18 | 19 | var plugins: [PluginType] = [] 20 | 21 | if let gitcoinApiUsername = Config.gitcoinApiUsername, 22 | let gitcoinApiPassword = Config.gitcoinApiPassword { 23 | 24 | if !gitcoinApiUsername.isEmpty && !gitcoinApiPassword.isEmpty { 25 | 26 | logger.debug("gitcoinAPI basic auth creds found.") 27 | 28 | plugins.append(CredentialsPlugin { _ -> URLCredential? in 29 | return URLCredential(user: gitcoinApiUsername, password: gitcoinApiPassword, persistence: .forSession) 30 | }) 31 | } 32 | } 33 | 34 | if Config.enableGitcoinAPILogging { 35 | 36 | logger.debug("gitcoinAPI logging on.") 37 | 38 | plugins.append(NetworkLoggerPlugin()) 39 | } 40 | 41 | plugins.append(NetworkActivityPlugin(networkActivityClosure: { (type, target) in 42 | switch type { 43 | case .began: 44 | DispatchQueue.main.async { 45 | UIApplication.shared.isNetworkActivityIndicatorVisible = true 46 | } 47 | case .ended: 48 | DispatchQueue.main.async { 49 | UIApplication.shared.isNetworkActivityIndicatorVisible = false 50 | } 51 | } 52 | })) 53 | 54 | self.provider = MoyaProvider(plugins: plugins) 55 | } 56 | 57 | } 58 | 59 | /// GitcoinAPIService defines the endpoints and contract to the gitcoin api 60 | // API endpoint definitions https://github.com/Moya/Moya/blob/master/docs/Examples/Basic.md 61 | enum GitcoinAPIServiceContract { 62 | // Bounties index 63 | case bounties(lastViewedBountyId: Int?, userKeywords: [String]?) 64 | 65 | // remove a bounty to the claimed list 66 | case removeClaimed(bounty: Bounty?) 67 | 68 | // list of claimed bouties for user 69 | case claimedList(username: String?) 70 | 71 | // After bounty swipes (left, right) X or ❤ we send event to api 72 | case fundingSave(bounty: Bounty?, user: User?, direction: String?) 73 | 74 | // Skills / Keywords 75 | case userKeywords(user: User) 76 | 77 | // get bounties list 78 | case bountyList(ids: String?) 79 | 80 | } 81 | 82 | // MARK: - TargetType Protocol Implementation 83 | extension GitcoinAPIServiceContract: TargetType { 84 | var baseURL: URL { 85 | return URL(string: Config.gitcoinApiBaseUrl)! 86 | } 87 | 88 | var path: String { 89 | switch self { 90 | case .bounties: 91 | return "api/v0.1/bounties" 92 | case .removeClaimed(let bounty): 93 | return "actions/bounty/\(bounty?.idString ?? "")/interest/remove/" 94 | case .claimedList(_): 95 | return "actions/api/v0.1/bounties" 96 | case .fundingSave(_, _, _): 97 | return "api/v0.1/funding/save" 98 | case .userKeywords(let user): 99 | return "api/v0.1/profile/\(user.login ?? "")/keywords" 100 | case .bountyList(_): 101 | return "api/v0.1/bounties" 102 | } 103 | } 104 | 105 | var method: Moya.Method { 106 | switch self { 107 | case .bounties: 108 | return .get 109 | case .removeClaimed: 110 | return .post 111 | case .claimedList: 112 | return .get 113 | case .fundingSave: 114 | return .post 115 | case .userKeywords: 116 | return .get 117 | case .bountyList: 118 | return .get 119 | } 120 | } 121 | var task: Task { 122 | switch self { 123 | case let .fundingSave(bounty, user, direction): 124 | let params = ["token": OctokitManager.shared.tokenConfiguration?.accessToken ?? "","bounty_id": bounty?.idString ?? "", "email_address": user?.email ?? "", "direction": direction ?? "", "github_username": user?.login ?? ""] 125 | 126 | return .requestParameters(parameters: params, encoding: JSONEncoding.default) 127 | 128 | case .removeClaimed(_): 129 | 130 | let params = ["token": OctokitManager.shared.tokenConfiguration?.accessToken ?? ""] 131 | 132 | return .requestParameters(parameters: params, encoding: URLEncoding.queryString) 133 | 134 | case let .claimedList(username): 135 | 136 | let params = ["started": username ?? ""] 137 | 138 | return .requestParameters(parameters: params, encoding: URLEncoding.queryString) 139 | 140 | case let .bounties(lastViewedBountyId, userKeywords): 141 | var params = ["idx_status": "open", "network": "mainnet", "order_by": "pk"] 142 | 143 | if let lastViewedBountyId = lastViewedBountyId { 144 | params["pk__gt"] = String(lastViewedBountyId) 145 | } 146 | 147 | // Filter data by user keywords/skills 148 | if let userKeywords = userKeywords, userKeywords.count > 0 { 149 | params["raw_data"] = userKeywords.joined(separator: ",") 150 | } 151 | 152 | // When pretend=1 the api won't send emails to connect user to repo owners 153 | if Config.enableGitcoinAPIPretendMode { 154 | params["pretend"] = "1" 155 | } 156 | 157 | return .requestParameters(parameters: params, encoding: URLEncoding.queryString) 158 | 159 | case let .bountyList(ids): 160 | 161 | let params = ["standard_bounties_id__in": ids ?? "", "network": "mainnet"] 162 | 163 | return .requestParameters(parameters: params, encoding: URLEncoding.queryString) 164 | 165 | default: 166 | return .requestPlain 167 | } 168 | } 169 | 170 | //TODO: build sample data 171 | var sampleData: Data { 172 | switch self { 173 | case .bounties: 174 | return "[]".utf8Encoded 175 | case .removeClaimed: 176 | return "[]".utf8Encoded 177 | case .claimedList: 178 | return "[]".utf8Encoded 179 | case .fundingSave: 180 | return "[]".utf8Encoded 181 | case .userKeywords: 182 | return "[]".utf8Encoded 183 | case .bountyList: 184 | return "[]".utf8Encoded 185 | } 186 | } 187 | var headers: [String: String]? { 188 | return ["Content-type": "application/json"] 189 | } 190 | } 191 | // MARK: - Helpers 192 | private extension String { 193 | var urlEscaped: String { 194 | return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! 195 | } 196 | 197 | var utf8Encoded: Data { 198 | return data(using: .utf8)! 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /Gitcoin/Network/NetworkReachability.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkReachability.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/2/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | 11 | /// Listen for changes in the network 12 | class NetworkReachability { 13 | 14 | static let shared = NetworkReachability() 15 | 16 | private let reachability = Reachability()! 17 | 18 | var isConnected = Variable(true) 19 | 20 | init() { 21 | reachability.whenReachable = { reachability in 22 | if reachability.connection == .wifi { 23 | logger.verbose("Reachable via WiFi") 24 | } else { 25 | logger.verbose("Reachable via Cellular") 26 | } 27 | 28 | self.isConnected.value = true 29 | } 30 | reachability.whenUnreachable = { _ in 31 | logger.verbose("Not reachable") 32 | 33 | self.isConnected.value = false 34 | } 35 | } 36 | 37 | func start(){ 38 | do { 39 | try reachability.startNotifier() 40 | } catch { 41 | logger.error("Unable to start notifier") 42 | } 43 | } 44 | 45 | func stop(){ 46 | reachability.stopNotifier() 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Gitcoin/SafeConfiguration.plist.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gitHubOAuthToken 6 | xxxxxxxx 7 | enableGitcoinAPILogging 8 | 9 | gitHubOAuthSecret 10 | xxxxxxx 11 | 12 | 13 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Cards/BountyCardKolodaAnimator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyCardKolodaAnimator.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Koloda 11 | import pop 12 | 13 | class BountyCardKolodaAnimator: KolodaViewAnimator { 14 | 15 | override func applyScaleAnimation(_ card: DraggableCardView, scale: CGSize, frame: CGRect, duration: TimeInterval, completion: AnimationCompletionBlock) { 16 | 17 | let scaleAnimation = POPSpringAnimation(propertyNamed: kPOPLayerScaleXY) 18 | scaleAnimation?.springBounciness = 9 19 | scaleAnimation?.springSpeed = 16 20 | scaleAnimation?.toValue = NSValue(cgSize: scale) 21 | card.layer.pop_add(scaleAnimation, forKey: "scaleAnimation") 22 | 23 | let frameAnimation = POPSpringAnimation(propertyNamed: kPOPViewFrame) 24 | frameAnimation?.springBounciness = 9 25 | frameAnimation?.springSpeed = 16 26 | frameAnimation?.toValue = NSValue(cgRect: frame) 27 | if let completion = completion { 28 | frameAnimation?.completionBlock = { _, finished in 29 | completion(finished) 30 | } 31 | } 32 | card.pop_add(frameAnimation, forKey: "frameAnimation") 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Cards/BountyCardOverlayView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyCardOverlayView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Koloda 11 | 12 | class BountyCardOverlayView: OverlayView { 13 | 14 | let overlayRightImageName = "overlay_like" 15 | let overlayLeftImageName = "overlay_skip" 16 | 17 | @IBOutlet lazy var overlayImageView: UIImageView! = { 18 | [unowned self] in 19 | 20 | var imageView = UIImageView(frame: self.bounds) 21 | self.addSubview(imageView) 22 | 23 | return imageView 24 | }() 25 | 26 | override var overlayState: SwipeResultDirection? { 27 | didSet { 28 | switch overlayState { 29 | case .left? : 30 | overlayImageView.image = UIImage(named: overlayLeftImageName) 31 | case .right? : 32 | overlayImageView.image = UIImage(named: overlayRightImageName) 33 | default: 34 | overlayImageView.image = nil 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Cards/BountyCardOverlayView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Cards/BountyCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyCardView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import Alamofire 12 | import AlamofireImage 13 | import RxCocoa 14 | 15 | class BountyCardView: UIView { 16 | 17 | @IBOutlet weak var titleLabel: UILabel! 18 | @IBOutlet weak var avatarImageView: UIImageView! 19 | 20 | @IBOutlet weak var fundingTokenAmountLabel: UILabel! 21 | 22 | @IBOutlet weak var fundingUSDAmountLabel: UILabel! 23 | @IBOutlet weak var keywordContainer: UIView! 24 | @IBOutlet weak var postedOnLabel: UILabel! 25 | @IBOutlet weak var descriptionText: UILabel! 26 | 27 | @IBOutlet weak var negativeCardActionButton: UIButton! 28 | 29 | //@IBOutlet weak var positiveCardActionButton: UIButton! 30 | 31 | let tagsField = GitCoinWSTagField() 32 | 33 | let disposeBag = DisposeBag() 34 | 35 | var kolodaView: BountyKolodaView! 36 | 37 | override func awakeFromNib() { 38 | super.awakeFromNib() 39 | 40 | observeUI() 41 | } 42 | 43 | class func fromNib(with bounty: Bounty, and _kolodaView: BountyKolodaView) -> BountyCardView { 44 | if let bountyCardView = Bundle.main.loadNibNamed(String(describing: BountyCardView.self), owner: nil, options: nil)![0] as? BountyCardView{ 45 | 46 | bountyCardView.kolodaView = _kolodaView 47 | 48 | bountyCardView.titleLabel.text = bounty.title 49 | 50 | bountyCardView.setupTagField(for: bounty) 51 | 52 | if let avatarUrl = bounty.avatarUrl { 53 | 54 | Alamofire.request(avatarUrl).responseImage { response in 55 | 56 | if let image = response.result.value { 57 | 58 | let circularImage = image.af_imageRoundedIntoCircle() 59 | 60 | bountyCardView.avatarImageView.image = circularImage 61 | } 62 | } 63 | } 64 | 65 | bountyCardView.descriptionText.text = bounty.descriptionText ?? "" 66 | 67 | bountyCardView.fundingTokenAmountLabel.text = bounty.tokenValueString 68 | 69 | bountyCardView.fundingUSDAmountLabel.text = bounty.usdtDisplayValue 70 | 71 | bountyCardView.postedOnLabel.text = bounty.createdAgo 72 | 73 | return bountyCardView 74 | } 75 | 76 | return BountyCardView() 77 | } 78 | 79 | fileprivate func setupTagField(for bounty: Bounty) { 80 | 81 | guard let keywords = bounty.keywordArray else { 82 | return 83 | } 84 | 85 | tagsField.readOnly = true 86 | tagsField.translatesAutoresizingMaskIntoConstraints = false 87 | keywordContainer.addSubview(tagsField) 88 | 89 | NSLayoutConstraint.activate([ 90 | tagsField.topAnchor.constraint(equalTo: keywordContainer.topAnchor), 91 | tagsField.leadingAnchor.constraint(equalTo: keywordContainer.leadingAnchor), 92 | tagsField.trailingAnchor.constraint(equalTo: keywordContainer.trailingAnchor), 93 | tagsField.bottomAnchor.constraint(equalTo: keywordContainer.bottomAnchor), 94 | ]) 95 | 96 | tagsField.addTags(keywords) 97 | } 98 | 99 | /// Subscribe to actions on various ui/buttons 100 | func observeUI(){ 101 | let negativeCardActionButtonSubscription = negativeCardActionButton.rx.tap.bind { 102 | self.kolodaView?.swipe(.left) 103 | } 104 | 105 | disposeBag.insert(negativeCardActionButtonSubscription) 106 | 107 | // let positiveCardActionButtonSubscription = positiveCardActionButton.rx.tap.bind { 108 | // self.kolodaView?.swipe(.right) 109 | // } 110 | // 111 | // disposeBag.insert(positiveCardActionButtonSubscription) 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Cards/BountyKolodaView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyKolodaView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Koloda 11 | 12 | class BountyKolodaView: KolodaView { 13 | 14 | let defaultVerticalOffset: CGFloat = 20 15 | let defaultHorizontalOffset: CGFloat = 20 16 | 17 | let backgroundCardHorizontalMarginMultiplier: CGFloat = 0.25 18 | let backgroundCardScalePercent: CGFloat = 1.1 19 | 20 | override func frameForCard(at index: Int) -> CGRect { 21 | if index == 0 { 22 | let topOffset: CGFloat = defaultVerticalOffset 23 | let xOffset: CGFloat = defaultHorizontalOffset 24 | let width = (self.frame).width - 2 * defaultHorizontalOffset 25 | let height = (self.frame).height - 2 * defaultVerticalOffset 26 | let yOffset: CGFloat = topOffset 27 | let frame = CGRect(x: xOffset, y: yOffset, width: width, height: height) 28 | 29 | return frame 30 | } else if index == 1 { 31 | let horizontalMargin = -self.bounds.width * backgroundCardHorizontalMarginMultiplier 32 | let width = self.bounds.width * backgroundCardScalePercent 33 | let height = width * backgroundCardScalePercent 34 | return CGRect(x: horizontalMargin, y: 0, width: width, height: height) 35 | } 36 | return CGRect.zero 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Details/BountyCommentCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyCommentCell.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 4/13/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BountyCommentCell: UITableViewCell { 12 | 13 | @IBOutlet var lblComment: UILabel! 14 | @IBOutlet var lblUser: UILabel! 15 | @IBOutlet weak var backingView: UIView! 16 | 17 | func set(comment: String) { 18 | lblComment.text = comment 19 | } 20 | 21 | func set(user: String, createdOn: Date?) { 22 | 23 | var created = "a while ago" 24 | 25 | if let createdOn = createdOn { 26 | created = createdOn.toStringWithRelativeTime().capitalized 27 | } 28 | 29 | lblUser.text = "\(user) commented \(created)" 30 | } 31 | 32 | func set(isCommentOwner: Bool = false){ 33 | 34 | if isCommentOwner == true{ 35 | backingView.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 0.0, alpha: 0.28) 36 | backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 0.0, alpha: 0.28) 37 | return 38 | } 39 | 40 | backingView.backgroundColor = UIColor(red: 204/255, green: 221/255, blue: 201/255, alpha: 1) 41 | backgroundColor = UIColor(red: 235/255, green: 242/255, blue: 234/255, alpha: 1) 42 | 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Details/BountyCommentCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Gitcoin/UI/Bounty Details/BountyDetailsContainerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BountyDetailsContainerViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 3/4/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import BetterSegmentedControl 11 | 12 | class BountyDetailsContainerViewController: UIViewController { 13 | 14 | var bounty: Bounty? 15 | var kolodaView: BountyKolodaView? 16 | var isBountyClaimed = false 17 | 18 | @IBOutlet weak var containerView: UIView! 19 | @IBOutlet weak var segControlContainer: UIView! 20 | @IBOutlet weak var controlXAxisConstraint: NSLayoutConstraint! 21 | 22 | 23 | // MARK: - Bounty Detail and Discuss View Controllers 24 | 25 | private lazy var detailViewController: BountyDetailViewController = { 26 | let storyboard = UIStoryboard(name: "BountyDetailViewController", bundle: Bundle.main) 27 | var viewController = storyboard.instantiateInitialViewController() as! BountyDetailViewController 28 | viewController.bounty = self.bounty 29 | viewController.kolodaView = self.kolodaView 30 | viewController.isBountyClaimed = isBountyClaimed 31 | self.add(asChildViewController: viewController) 32 | return viewController 33 | }() 34 | 35 | private lazy var discussViewController: BountyDiscussViewController = { 36 | let storyboard = UIStoryboard(name: "BountyDiscussViewController", bundle: Bundle.main) 37 | var viewController = storyboard.instantiateInitialViewController() as! BountyDiscussViewController 38 | viewController.bounty = self.bounty 39 | self.add(asChildViewController: viewController) 40 | return viewController 41 | }() 42 | 43 | override func viewDidLoad() { 44 | super.viewDidLoad() 45 | 46 | if let bounty = bounty{ 47 | title = bounty.title 48 | } 49 | 50 | let control = BetterSegmentedControl( 51 | frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width-20, height: segControlContainer.bounds.height), 52 | titles: ["Bounty Details", "Discuss with Funder"], 53 | index: 0, 54 | options: [.backgroundColor(.white), 55 | .titleColor(UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00)), 56 | .indicatorViewBackgroundColor(UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00)), 57 | .selectedTitleColor(.white), 58 | .titleBorderWidth(1.0), 59 | .cornerRadius(6.0), 60 | .titleFont(UIFont(name: "FuturaStd-Book", size: 14.0)!), 61 | .selectedTitleFont(UIFont(name: "FuturaStd-Book", size: 14.0)!)] 62 | ) 63 | 64 | control.addTarget(self, action: #selector(BountyDetailsContainerViewController.navigationSegmentedControlValueChanged(_:)), for: .valueChanged) 65 | 66 | 67 | 68 | let xConstraint = (UIScreen.main.bounds.size.width - control.bounds.width)/2.0 69 | controlXAxisConstraint.constant = xConstraint 70 | 71 | let customSubview = UIView(frame: CGRect(x: 0, y: 0, width: control.frame.width, height: control.frame.height)) 72 | customSubview.backgroundColor = .clear 73 | customSubview.layer.borderColor = UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00).cgColor 74 | customSubview.layer.borderWidth = 1.0 75 | customSubview.layer.cornerRadius = 6.0 76 | 77 | control.addSubview(customSubview) 78 | segControlContainer.addSubview(control) 79 | 80 | add(asChildViewController: detailViewController) 81 | } 82 | 83 | // MARK: - Segmented Action handlers 84 | @objc func navigationSegmentedControlValueChanged(_ sender: BetterSegmentedControl) { 85 | if sender.index == 0 { 86 | add(asChildViewController: detailViewController) 87 | remove(asChildViewController: discussViewController) 88 | 89 | } else { 90 | add(asChildViewController: discussViewController) 91 | remove(asChildViewController: detailViewController) 92 | } 93 | } 94 | 95 | private func add(asChildViewController viewController: UIViewController) { 96 | // Add Child View Controller 97 | addChildViewController(viewController) 98 | 99 | // Add Child View as Subview 100 | containerView.addSubview(viewController.view) 101 | 102 | // Configure Child View 103 | viewController.view.frame = containerView.bounds 104 | viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 105 | 106 | // Notify Child View Controller 107 | viewController.didMove(toParentViewController: self) 108 | } 109 | 110 | private func remove(asChildViewController viewController: UIViewController) { 111 | // Notify Child View Controller 112 | viewController.willMove(toParentViewController: nil) 113 | 114 | // Remove Child View From Superview 115 | viewController.view.removeFromSuperview() 116 | 117 | // Notify Child View Controller 118 | viewController.removeFromParentViewController() 119 | } 120 | 121 | } 122 | -------------------------------------------------------------------------------- /Gitcoin/UI/End of Bounties/EndOfBountiesCardView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EndOfBountiesCardView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/16/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | 12 | class EndOfBountiesCardView: UIView { 13 | 14 | @IBOutlet weak var joinSlackButton: UIButton! 15 | @IBOutlet weak var refreshBountiesButton: UIButton! 16 | 17 | let disposeBag = DisposeBag() 18 | 19 | var refreshBountiesClosure: (()->Void)? 20 | 21 | override func awakeFromNib() { 22 | super.awakeFromNib() 23 | 24 | observeUI() 25 | } 26 | 27 | /// Subscribe to actions on various ui/buttons 28 | func observeUI(){ 29 | let joinSlackButtonSubscription = joinSlackButton.rx.tap.bind { 30 | 31 | UIApplication.shared.open(URL(string: "https://gitcoin.co/slack")!, options: [:], completionHandler: { _ in 32 | 33 | TrackingManager.shared.trackEvent(.didTapJoinSlack) 34 | }) 35 | } 36 | 37 | disposeBag.insert(joinSlackButtonSubscription) 38 | 39 | let refreshBountiesButtonSubscription = refreshBountiesButton.rx.tap.bind { 40 | if let refreshBountiesClosure = self.refreshBountiesClosure { 41 | TrackingManager.shared.trackEvent(.didTapRefreshBounties) 42 | 43 | refreshBountiesClosure() 44 | } 45 | } 46 | 47 | disposeBag.insert(refreshBountiesButtonSubscription) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Gitcoin/UI/Info/InfoViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfoViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/15/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | import youtube_ios_player_helper 13 | 14 | class InfoViewController: UIViewController { 15 | 16 | @IBOutlet weak var playerView: YTPlayerView! 17 | 18 | @IBOutlet weak var versionLabel: UILabel! 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | var versionText = "" 24 | 25 | if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { 26 | versionText = "Version \(version) " 27 | } 28 | 29 | if let version = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { 30 | versionText = "\(versionText)Build \(version)" 31 | } 32 | 33 | self.versionLabel.text = versionText 34 | 35 | playerView.delegate = self 36 | 37 | playerView.load(withVideoId: "DJartWzDn0E") 38 | } 39 | 40 | override func viewWillLayoutSubviews() { 41 | UIApplication.shared.setStatusBarHidden(false, with: .none) 42 | } 43 | 44 | override func viewDidAppear(_ animated: Bool) { 45 | super.viewDidAppear(animated) 46 | 47 | TrackingManager.shared.trackEvent(.didViewInfo) 48 | } 49 | 50 | override func viewDidDisappear(_ animated: Bool) { 51 | super.viewDidDisappear(animated) 52 | 53 | TrackingManager.shared.trackEvent(.didCloseInfo) 54 | } 55 | } 56 | 57 | extension InfoViewController: YTPlayerViewDelegate{ 58 | func playerView(_ playerView: YTPlayerView, didChangeTo state: YTPlayerState) { 59 | if state == YTPlayerState.playing { 60 | TrackingManager.shared.trackEvent(.didPlayWhatIsGitCoinVideo) 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Gitcoin/UI/Info/PlayerContainerView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayerContainerView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/14/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// Since stack view's with fill proportionally distribution needs sub views 12 | /// with an intrinsic content size, and uiviews dont have this we need this 13 | /// container 14 | class PlayerContainerView: UIView { 15 | override var intrinsicContentSize: CGSize { 16 | 17 | var height = 177.0 18 | 19 | if Device.IS_3_5_INCHES() { 20 | height = 100.0 21 | } else if Device.IS_4_INCHES() { 22 | height = 120.0 23 | } else if Device.IS_4_7_INCHES() { 24 | height = 150.0 25 | } 26 | 27 | return CGSize(width: 1.0, height: height) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Gitcoin/UI/NavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NavigationController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/9/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Whisper 11 | import RxSwift 12 | 13 | class NavigationController: UINavigationController { 14 | 15 | let disposeBag = DisposeBag() 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | 20 | observeNetwork() 21 | } 22 | 23 | func observeNetwork(){ 24 | let networkSubscription = NetworkReachability.shared.isConnected 25 | .asObservable() 26 | .subscribeOn(MainScheduler.instance) 27 | .subscribe(onNext: { isConnected in 28 | 29 | if !isConnected { 30 | let message = Message(title: "No Connection", backgroundColor: UIColor.gitCoin.regulusRed) 31 | 32 | Whisper.show(whisper: message, to: self, action: .present) 33 | } else{ 34 | Whisper.hide(whisperFrom: self) 35 | } 36 | }) 37 | 38 | disposeBag.insert(networkSubscription) 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileBountyContainerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileBountyContainerViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 3/4/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import BetterSegmentedControl 11 | 12 | class ProfileBountyContainerViewController: UIViewController { 13 | 14 | @IBOutlet weak var containerView: UIView! 15 | @IBOutlet weak var segControlContainer: UIView! 16 | @IBOutlet weak var controlXAxisConstraint: NSLayoutConstraint! 17 | 18 | // MARK: - Bounty Detail and Discuss View Controllers 19 | 20 | private lazy var accountViewController: ProfileContainerViewController = { 21 | let storyboard = UIStoryboard(name: "ProfileContainerViewController", bundle: Bundle.main) 22 | var viewController = storyboard.instantiateInitialViewController() as! ProfileContainerViewController 23 | self.add(asChildViewController: viewController) 24 | return viewController 25 | }() 26 | 27 | private lazy var claimedViewController: ProfileClaimedViewController = { 28 | let storyboard = UIStoryboard(name: "ProfileClaimedViewController", bundle: Bundle.main) 29 | var viewController = storyboard.instantiateInitialViewController() as! ProfileClaimedViewController 30 | self.add(asChildViewController: viewController) 31 | return viewController 32 | }() 33 | 34 | private lazy var savedViewController: ProfileSavedViewController = { 35 | let storyboard = UIStoryboard(name: "ProfileSavedViewController", bundle: Bundle.main) 36 | var viewController = storyboard.instantiateInitialViewController() as! ProfileSavedViewController 37 | self.add(asChildViewController: viewController) 38 | return viewController 39 | }() 40 | 41 | override func viewDidLoad() { 42 | super.viewDidLoad() 43 | 44 | title = "PROFILE" 45 | 46 | let control = BetterSegmentedControl( 47 | frame: CGRect(x: 0, y: 0, width: segControlContainer.bounds.width-20, height: segControlContainer.bounds.height), 48 | titles: ["My Account", "Bounties Saved", "Started Bounties"], 49 | index: 0, 50 | options: [.backgroundColor(.white), 51 | .titleColor(UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00)), 52 | .indicatorViewBackgroundColor(UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00)), 53 | .selectedTitleColor(.white), 54 | .titleBorderWidth(1.0), 55 | .cornerRadius(6.0), 56 | .titleFont(UIFont(name: "FuturaStd-Book", size: 12.0)!), 57 | .selectedTitleFont(UIFont(name: "FuturaStd-Book", size: 12.0)!)] 58 | ) 59 | 60 | control.addTarget(self, action: #selector(BountyDetailsContainerViewController.navigationSegmentedControlValueChanged(_:)), for: .valueChanged) 61 | 62 | let xConstraint = (view.bounds.width - control.bounds.width)/2.0 63 | 64 | controlXAxisConstraint.constant = xConstraint 65 | 66 | let customSubview = UIView(frame: CGRect(x: 0, y: 0, width: control.frame.width, height: control.frame.height)) 67 | customSubview.backgroundColor = .clear 68 | customSubview.layer.borderColor = UIColor(red:13/255, green:0.0, blue:60/255, alpha:1.00).cgColor 69 | customSubview.layer.borderWidth = 1.0 70 | customSubview.layer.cornerRadius = 6.0 71 | 72 | control.addSubview(customSubview) 73 | segControlContainer.addSubview(control) 74 | 75 | add(asChildViewController: accountViewController) 76 | } 77 | 78 | // MARK: - Segmented Action handlers 79 | @objc func navigationSegmentedControlValueChanged(_ sender: BetterSegmentedControl) { 80 | if sender.index == 0 { 81 | add(asChildViewController: accountViewController) 82 | remove(asChildViewController: claimedViewController) 83 | remove(asChildViewController: savedViewController) 84 | } 85 | else if sender.index == 1 { 86 | add(asChildViewController: savedViewController) 87 | remove(asChildViewController: claimedViewController) 88 | remove(asChildViewController: accountViewController) 89 | } 90 | else { 91 | add(asChildViewController: claimedViewController) 92 | remove(asChildViewController: savedViewController) 93 | remove(asChildViewController: accountViewController) 94 | } 95 | } 96 | 97 | private func add(asChildViewController viewController: UIViewController) { 98 | // Add Child View Controller 99 | addChildViewController(viewController) 100 | 101 | // Add Child View as Subview 102 | containerView.addSubview(viewController.view) 103 | 104 | // Configure Child View 105 | viewController.view.frame = containerView.bounds 106 | viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 107 | 108 | // Notify Child View Controller 109 | viewController.didMove(toParentViewController: self) 110 | } 111 | 112 | private func remove(asChildViewController viewController: UIViewController) { 113 | // Notify Child View Controller 114 | viewController.willMove(toParentViewController: nil) 115 | 116 | // Remove Child View From Superview 117 | viewController.view.removeFromSuperview() 118 | 119 | // Notify Child View Controller 120 | viewController.removeFromParentViewController() 121 | } 122 | 123 | } 124 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileClaimedCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileClaimedCell.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 4/12/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Alamofire 11 | import AlamofireImage 12 | 13 | class ProfileClaimedCell: UITableViewCell { 14 | 15 | @IBOutlet var lblTitle: UILabel! 16 | @IBOutlet var lblDetails: UILabel! 17 | @IBOutlet weak var avatarImageView: UIImageView! 18 | 19 | override func awakeFromNib() { 20 | super.awakeFromNib() 21 | // Initialization code 22 | 23 | //self.addGradientBackground(firstColor: .lightText, secondColor: .lightGray ) 24 | } 25 | 26 | override func setSelected(_ selected: Bool, animated: Bool) { 27 | super.setSelected(selected, animated: animated) 28 | 29 | // Configure the view for the selected state 30 | } 31 | 32 | func set(title: String) { 33 | lblTitle.text = title 34 | } 35 | 36 | func set(details: Bounty?) { 37 | 38 | var text = "" 39 | 40 | if let bounty = details{ 41 | 42 | var tokenValueString = "" 43 | var usdtDisplayValueString = "" 44 | 45 | if let tokenValue = bounty.tokenValueString{ 46 | tokenValueString = tokenValue 47 | } 48 | 49 | if UIScreen.main.bounds.size.height > CGFloat(568.0) && !bounty.usdtDisplayValue.isEmpty { 50 | usdtDisplayValueString = "(\(bounty.usdtDisplayValue))" 51 | } 52 | 53 | let expires = bounty.expiresIn 54 | 55 | text = "\(tokenValueString) \(usdtDisplayValueString) // EXP: \(expires)" 56 | } 57 | 58 | lblDetails.text = text 59 | } 60 | 61 | func set(imageUrl: String?){ 62 | if let imageUrl = imageUrl{ 63 | Alamofire.request(imageUrl).responseImage { response in 64 | if let image = response.result.value { 65 | let circularImage = image.af_imageRoundedIntoCircle() 66 | 67 | self.avatarImageView.image = circularImage 68 | } 69 | } 70 | } 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileClaimedCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Futura-Medium 14 | 15 | 16 | Roboto-Medium 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileContainerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileContainerViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/15/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | import SwiftyUserDefaults 13 | import Octokit 14 | 15 | class ProfileContainerViewController: UIViewController { 16 | 17 | @IBOutlet weak var signedInContainerView: UIView! 18 | 19 | @IBOutlet weak var signedOutContainerView: UIView! 20 | 21 | let disposeBag = DisposeBag() 22 | 23 | override func viewDidLoad() { 24 | super.viewDidLoad() 25 | 26 | if OctokitManager.shared.isSignedIn { 27 | showSignedInViews() 28 | }else{ 29 | showSignedOutViews() 30 | } 31 | 32 | observeUser() 33 | } 34 | 35 | override func viewDidAppear(_ animated: Bool) { 36 | super.viewDidAppear(animated) 37 | 38 | TrackingManager.shared.trackEvent(.didViewProfile) 39 | } 40 | 41 | override func viewDidDisappear(_ animated: Bool) { 42 | super.viewDidDisappear(animated) 43 | 44 | TrackingManager.shared.trackEvent(.didCloseProfile) 45 | } 46 | 47 | /// Observe User Object: This subscription listens for changes in the user instance 48 | /// So this will be called anytime time OctokitManager.shared.user 49 | /// is changed. There by updating the ui base on the state of that 50 | /// user object 51 | func observeUser(){ 52 | 53 | let subscription = OctokitManager.shared.user.asObservable() 54 | .observeOn(MainScheduler.instance) 55 | .subscribe(onNext: { [weak self] user in 56 | 57 | // User logged in 58 | if let _ = user { 59 | self?.showSignedInViews() 60 | }else{ 61 | self?.showSignedOutViews() 62 | } 63 | }) 64 | 65 | disposeBag.insert(subscription) 66 | } 67 | 68 | fileprivate func showSignedInViews() { 69 | signedOutContainerView.isHidden = true 70 | signedInContainerView.isHidden = false 71 | 72 | signedOutContainerView.alpha = 0 73 | UIView.animate(withDuration: 1.0) { 74 | self.signedOutContainerView.alpha = 1 75 | } 76 | 77 | signedInContainerView.alpha = 1.0 78 | UIView.animate(withDuration: 1.0) { 79 | self.signedOutContainerView.alpha = 0 80 | } 81 | } 82 | 83 | fileprivate func showSignedOutViews() { 84 | signedOutContainerView.isHidden = false 85 | signedInContainerView.isHidden = true 86 | 87 | signedOutContainerView.alpha = 1.0 88 | UIView.animate(withDuration: 1.0) { 89 | self.signedOutContainerView.alpha = 0 90 | } 91 | 92 | signedInContainerView.alpha = 0 93 | UIView.animate(withDuration: 1.0) { 94 | self.signedOutContainerView.alpha = 1.0 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileSavedViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileClaimedViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 3/4/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SCLAlertView 11 | import RxSwift 12 | 13 | class ProfileSavedViewController: UIViewController { 14 | 15 | var data: [Bounty]? 16 | @IBOutlet var tableView: UITableView! 17 | @IBOutlet weak var noClaimedView: UIView! 18 | 19 | lazy var refreshControl: UIRefreshControl = { 20 | var control: UIRefreshControl = UIRefreshControl() 21 | return control 22 | }() 23 | 24 | lazy internal var activityIndicator: UIActivityIndicatorView! = { 25 | return self.createActivityIndicator() 26 | }() 27 | 28 | var disposable: Disposable? 29 | 30 | override func viewDidLoad() { 31 | 32 | tableView.rowHeight = 90 33 | tableView.delegate = self 34 | tableView.dataSource = self 35 | tableView.register(UINib(nibName: "ProfileClaimedCell", bundle: Bundle.main), forCellReuseIdentifier: "ProfileClaimedCell") 36 | tableView.tableFooterView = UIView(frame: .zero) 37 | tableView.addSubview(self.refreshControl) 38 | refreshControl.addTarget(self, action: #selector(loadSavedList), for: .valueChanged) 39 | 40 | } 41 | 42 | override func viewWillAppear(_ animated: Bool) { 43 | super.viewWillAppear(animated) 44 | 45 | activityIndicator.stopAnimating() 46 | disposable?.dispose() 47 | noClaimedView.isHidden = true 48 | loadSavedList() 49 | } 50 | 51 | override func viewDidAppear(_ animated: Bool) { 52 | super.viewDidAppear(animated) 53 | 54 | TrackingManager.shared.trackEvent(.didViewSavedBounties) 55 | } 56 | 57 | override func viewDidDisappear(_ animated: Bool) { 58 | activityIndicator.stopAnimating() 59 | disposable?.dispose() 60 | } 61 | 62 | func showNoDataAlert(){ 63 | 64 | noClaimedView.isHidden = false 65 | } 66 | 67 | @objc func loadSavedList(){ 68 | 69 | if !refreshControl.isRefreshing && (data?.count == 0 || data == nil){ 70 | activityIndicator.startAnimating() 71 | } 72 | 73 | if SavedBountiesManager.shared.currentIds().count == 0{ 74 | self.activityIndicator.stopAnimating() 75 | self.data = [] 76 | self.tableView.reloadData() 77 | self.showNoDataAlert() 78 | } 79 | else{ 80 | disposable = GitcoinAPIService.shared.provider.rx.request(.bountyList(ids: SavedBountiesManager.list())) 81 | .map(to: [Bounty].self) 82 | .subscribe { event in 83 | switch event { 84 | case .success(let saved): 85 | 86 | logger.verbose("Bounties Saved List: \(saved)") 87 | 88 | self.refreshControl.endRefreshing() 89 | self.activityIndicator.stopAnimating() 90 | 91 | if saved.count == 0{ 92 | self.showNoDataAlert() 93 | } 94 | 95 | self.data = saved 96 | self.tableView.reloadData() 97 | 98 | case .error(let error): 99 | logger.error(error) 100 | print("error = \(error)") 101 | self.activityIndicator.stopAnimating() 102 | self.showNoDataAlert() 103 | } 104 | 105 | } 106 | } 107 | } 108 | 109 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 110 | 111 | if segue.identifier == "savedDetailsSegue", 112 | let destination = segue.destination as? BountyDetailsContainerViewController, 113 | let bounty = sender as? Bounty{ 114 | 115 | destination.bounty = bounty 116 | } 117 | } 118 | } 119 | 120 | // MARK: - Table view delegate 121 | extension ProfileSavedViewController: UITableViewDelegate { 122 | 123 | func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 124 | 125 | if editingStyle == .delete { 126 | 127 | let appearance = SCLAlertView.SCLAppearance( 128 | showCloseButton: false 129 | ) 130 | let alertView = SCLAlertView(appearance: appearance) 131 | 132 | 133 | alertView.addButton("No") {} 134 | alertView.addButton("YES") { 135 | let bounty = self.data?[indexPath.row] 136 | 137 | self.activityIndicator.startAnimating() 138 | 139 | SavedBountiesManager.remove(id: bounty?.standardBountiesId) 140 | self.loadSavedList() 141 | } 142 | 143 | alertView.showWarning("Delete Saved Bounty", subTitle: "Do you really want to delete this bounty?") 144 | } 145 | } 146 | 147 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 148 | 149 | let bounty = self.data?[indexPath.row] 150 | 151 | performSegue(withIdentifier: "savedDetailsSegue", sender: bounty) 152 | } 153 | 154 | func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 155 | return true 156 | } 157 | } 158 | 159 | // MARK: - Table view data source 160 | extension ProfileSavedViewController: UITableViewDataSource { 161 | 162 | func numberOfSections(in tableView: UITableView) -> Int { 163 | return 1 164 | } 165 | 166 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 167 | if let bounties = self.data{ 168 | return bounties.count 169 | } 170 | return 0 171 | } 172 | 173 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 174 | let cell = self.tableView.dequeueReusableCell(withIdentifier: "ProfileClaimedCell", for: indexPath) as! ProfileClaimedCell 175 | cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator 176 | 177 | if let bounties = self.data{ 178 | let title = bounties[indexPath.row].title 179 | let avatarUrl = bounties[indexPath.row].avatarUrl 180 | 181 | 182 | cell.set(title: title) 183 | cell.set(imageUrl: avatarUrl) 184 | cell.set(details: bounties[indexPath.row]) 185 | 186 | return cell 187 | } 188 | 189 | return ProfileClaimedCell() 190 | } 191 | 192 | } 193 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileSignedInViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileSignedInViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/10/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | import Alamofire 13 | import AlamofireImage 14 | import SwiftyUserDefaults 15 | import Octokit 16 | 17 | class ProfileSignedInViewController: UIViewController { 18 | 19 | @IBOutlet weak var signOutButton: UIButton! 20 | @IBOutlet weak var nameLabel: UILabel! 21 | @IBOutlet weak var avatarImage: UIImageView! 22 | @IBOutlet weak var tagFieldViewContainer: UIView! 23 | 24 | let tagsField = GitCoinWSTagField() 25 | 26 | let disposeBag = DisposeBag() 27 | 28 | override func viewDidLoad() { 29 | super.viewDidLoad() 30 | 31 | setupTagField() 32 | observeUI() 33 | observeUser() 34 | observeUserActions() 35 | } 36 | 37 | func observeUI(){ 38 | 39 | let signedOutButtonSubscription = signOutButton.rx.tap.bind { 40 | OctokitManager.shared.signOut() 41 | 42 | return 43 | } 44 | 45 | disposeBag.insert(signedOutButtonSubscription) 46 | 47 | let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 48 | 49 | tap.cancelsTouchesInView = false 50 | 51 | view.addGestureRecognizer(tap) 52 | } 53 | 54 | @objc func dismissKeyboard() { 55 | //Causes the view (or one of its embedded text fields) to resign the first responder status. 56 | view.endEditing(true) 57 | } 58 | 59 | /// Observe User Object: This subscription listens for changes in the user instance 60 | /// So this will be called anytime time OctokitManager.shared.user 61 | /// is changed. There by updating the ui base on the state of that 62 | /// user object 63 | func observeUser(){ 64 | 65 | let subscription = OctokitManager.shared.user.asObservable() 66 | .observeOn(MainScheduler.instance) 67 | .subscribe(onNext: { [weak self] user in 68 | 69 | // User logged in 70 | if let user = user { 71 | 72 | if let name = user.name { 73 | self?.nameLabel.text = name 74 | } 75 | 76 | if let avatarUrl = user.avatarURL { 77 | 78 | Alamofire.request(avatarUrl).responseImage { response in 79 | 80 | if let image = response.result.value { 81 | let circularImage = image.af_imageRoundedIntoCircle() 82 | 83 | self?.avatarImage.image = circularImage 84 | } 85 | } 86 | } 87 | } 88 | }) 89 | 90 | disposeBag.insert(subscription) 91 | } 92 | 93 | /// Subscribe to user actions 94 | func observeUserActions(){ 95 | 96 | let subscription = OctokitManager.shared 97 | .userActionSubject 98 | .subscribeOn(MainScheduler.instance) 99 | .subscribe(onNext: { userAction in 100 | 101 | // Reset the last view bounty when logging out 102 | switch userAction { 103 | case .signedIn(let user): 104 | self.populateTagsFromApiKeywords(with: user) 105 | case .signedOut: 106 | break 107 | } 108 | }) 109 | 110 | disposeBag.insert(subscription) 111 | } 112 | 113 | fileprivate func setupTagField() { 114 | tagsField.delimiter = "" 115 | 116 | // Events 117 | tagsField.onDidAddTag = { _, tag in 118 | let keyword = tag.text.lowercased() 119 | 120 | if !Defaults[UserDefaultKeyConstants.userKeywords].contains(keyword) { 121 | Defaults[UserDefaultKeyConstants.userKeywords].append(keyword) 122 | 123 | logger.verbose("Persisted tag \(keyword) to defaults") 124 | 125 | TrackingManager.shared.trackEvent(.didEditKeywords(user: OctokitManager.shared.user.value, action: "added", keyword: keyword, keywords: Defaults[UserDefaultKeyConstants.userKeywords])) 126 | } 127 | } 128 | 129 | tagsField.onDidRemoveTag = { _, tag in 130 | let keyword = tag.text 131 | 132 | if let removeIndex = Defaults[UserDefaultKeyConstants.userKeywords].index(where: { $0 == keyword }) { 133 | Defaults[UserDefaultKeyConstants.userKeywords].remove(at: removeIndex) 134 | 135 | logger.verbose("Removed tag \(keyword)") 136 | 137 | TrackingManager.shared.trackEvent(.didEditKeywords(user: OctokitManager.shared.user.value, action: "removed", keyword: keyword, keywords: Defaults[UserDefaultKeyConstants.userKeywords])) 138 | } 139 | } 140 | 141 | tagsField.placeholder = "Enter a skill or keyword" 142 | tagsField.translatesAutoresizingMaskIntoConstraints = false 143 | tagFieldViewContainer.addSubview(tagsField) 144 | 145 | NSLayoutConstraint.activate([ 146 | tagsField.topAnchor.constraint(equalTo: tagFieldViewContainer.topAnchor), 147 | tagsField.leadingAnchor.constraint(equalTo: tagFieldViewContainer.leadingAnchor), 148 | tagsField.trailingAnchor.constraint(equalTo: tagFieldViewContainer.trailingAnchor) 149 | ]) 150 | 151 | tagsField.addTags(Defaults[UserDefaultKeyConstants.userKeywords]) 152 | } 153 | 154 | func populateTagsFromApiKeywords(with user: User){ 155 | _ = GitcoinAPIService.shared.provider.rx 156 | .request(.userKeywords(user: user)) 157 | .filterSuccessfulStatusCodes() 158 | .map(to: UserKeywordResult.self) 159 | .subscribeOn(MainScheduler.instance) 160 | .subscribe(onSuccess: { [weak self] userKeywordResult in 161 | 162 | if let keywords = userKeywordResult.keywords { 163 | for keyword in keywords { 164 | self?.tagsField.addTag(keyword.lowercased()) 165 | } 166 | }else{ 167 | 168 | } 169 | }, onError: { error in 170 | 171 | }) 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /Gitcoin/UI/Profile/ProfileSignedOutViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProfileSignedOutViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/10/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | 13 | class ProfileSignedOutViewController: UIViewController { 14 | 15 | @IBOutlet weak var signInButton: UIButton! 16 | 17 | let disposeBag = DisposeBag() 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | 22 | observeUI() 23 | } 24 | 25 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 26 | if segue.identifier == "webviewSegue", 27 | let destination = segue.destination as? WebViewController { 28 | 29 | destination.title = "SIGN IN" 30 | 31 | destination.currentURL = OctokitManager.shared.oAuthConfig.authenticate() 32 | } 33 | } 34 | 35 | func observeUI(){ 36 | 37 | let signInButtonSubscription = signInButton.rx.tap.bind { 38 | self.performSegue(withIdentifier: "webviewSegue", sender: nil) 39 | } 40 | 41 | disposeBag.insert(signInButtonSubscription) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Gitcoin/UI/Views/GitCoinWSTagField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitCoinWSTagField.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/24/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import WSTagsField 11 | 12 | class GitCoinWSTagField: WSTagsField { 13 | 14 | override init(frame: CGRect) { 15 | super.init(frame: frame) 16 | internalInit() 17 | } 18 | 19 | required init?(coder aDecoder: NSCoder) { 20 | super.init(coder: aDecoder) 21 | internalInit() 22 | } 23 | 24 | fileprivate func internalInit(){ 25 | contentInset = UIEdgeInsets(top: 5.0, left: 10.0, bottom: 10.0, right: 10.0) 26 | spaceBetweenTags = 10.0 27 | spaceBetweenLines = 10.0 28 | font = UIFont.robotoMediumFont(size: 12.0) 29 | tintColor = UIColor.gitCoin.midnightBlue 30 | textColor = .white 31 | fieldTextColor = .black 32 | selectedColor = UIColor.gitCoin.polarisBlue 33 | selectedTextColor = UIColor.gitCoin.celestialWhite 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Gitcoin/UI/Views/GradientBackgroundView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GradientBackgroundView.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/9/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @IBDesignable 12 | class GradientBackgroundView: UIView { 13 | 14 | @IBInspectable var topColor: UIColor = .clear { 15 | didSet { 16 | updateView() 17 | } 18 | } 19 | 20 | @IBInspectable var bottomColor: UIColor = .clear { 21 | didSet { 22 | updateView() 23 | } 24 | } 25 | 26 | override class var layerClass: AnyClass { 27 | get { 28 | return CAGradientLayer.self 29 | } 30 | } 31 | 32 | func updateView(){ 33 | let layer = self.layer as! CAGradientLayer 34 | 35 | layer.colors = [topColor.cgColor, bottomColor.cgColor] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Gitcoin/UI/Views/UIView+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/10/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import UIKit 11 | 12 | @IBDesignable 13 | class DesignableView: UIView { 14 | } 15 | 16 | @IBDesignable 17 | class DesignableButton: UIButton { 18 | } 19 | 20 | @IBDesignable 21 | class DesignableLabel: UILabel { 22 | } 23 | 24 | extension UIView { 25 | 26 | @IBInspectable 27 | var cornerRadius: CGFloat { 28 | get { 29 | return layer.cornerRadius 30 | } 31 | set { 32 | layer.cornerRadius = newValue 33 | } 34 | } 35 | 36 | @IBInspectable 37 | var borderWidth: CGFloat { 38 | get { 39 | return layer.borderWidth 40 | } 41 | set { 42 | layer.borderWidth = newValue 43 | } 44 | } 45 | 46 | @IBInspectable 47 | var borderColor: UIColor? { 48 | get { 49 | if let color = layer.borderColor { 50 | return UIColor(cgColor: color) 51 | } 52 | return nil 53 | } 54 | set { 55 | if let color = newValue { 56 | layer.borderColor = color.cgColor 57 | } else { 58 | layer.borderColor = nil 59 | } 60 | } 61 | } 62 | 63 | @IBInspectable 64 | var shadowRadius: CGFloat { 65 | get { 66 | return layer.shadowRadius 67 | } 68 | set { 69 | layer.shadowRadius = newValue 70 | } 71 | } 72 | 73 | @IBInspectable 74 | var shadowOpacity: Float { 75 | get { 76 | return layer.shadowOpacity 77 | } 78 | set { 79 | layer.shadowOpacity = newValue 80 | } 81 | } 82 | 83 | @IBInspectable 84 | var shadowOffset: CGSize { 85 | get { 86 | return layer.shadowOffset 87 | } 88 | set { 89 | layer.shadowOffset = newValue 90 | } 91 | } 92 | 93 | @IBInspectable 94 | var shadowColor: UIColor? { 95 | get { 96 | if let color = layer.shadowColor { 97 | return UIColor(cgColor: color) 98 | } 99 | return nil 100 | } 101 | set { 102 | if let color = newValue { 103 | layer.shadowColor = color.cgColor 104 | } else { 105 | layer.shadowColor = nil 106 | } 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Gitcoin/UI/Webview/WebViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WebViewController.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 1/11/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import WebKit 11 | 12 | class WebViewController: UIViewController { 13 | 14 | @IBOutlet weak var webView: WKWebView! 15 | 16 | var currentURL:URL? 17 | 18 | lazy fileprivate var refreshControl: UIRefreshControl! = { 19 | let refresh = UIRefreshControl() 20 | refresh.addTarget(self, action: #selector(refreshOptions(sender:)), for: .valueChanged) 21 | 22 | return refresh 23 | }() 24 | 25 | lazy internal var activityIndicator: UIActivityIndicatorView! = { 26 | return self.createActivityIndicator() 27 | }() 28 | 29 | override func viewDidLoad() { 30 | super.viewDidLoad() 31 | 32 | webView.scrollView.addSubview(refreshControl) 33 | webView.uiDelegate = self 34 | webView.navigationDelegate = self 35 | webView.scrollView.backgroundColor = webView.backgroundColor 36 | webView.scrollView.alwaysBounceHorizontal = false 37 | 38 | loadCurrentUrl() 39 | } 40 | 41 | @objc func refreshOptions(sender:UIRefreshControl){ 42 | webView!.reload() 43 | } 44 | 45 | override func viewWillAppear(_ animated: Bool) { 46 | super.viewWillAppear(animated) 47 | 48 | if currentURL == nil { 49 | loadCurrentUrl() 50 | } 51 | } 52 | 53 | fileprivate func loadCurrentUrl(){ 54 | guard let currentURL = currentURL else { return } 55 | 56 | webView.load(URLRequest(url: currentURL)) 57 | } 58 | } 59 | 60 | extension WebViewController: WKUIDelegate { 61 | 62 | } 63 | 64 | extension WebViewController: WKNavigationDelegate { 65 | func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 66 | 67 | if let url = navigationAction.request.url { 68 | 69 | if url.absoluteString.contains("authorization-callback") { 70 | OctokitManager.shared.oAuthConfig.handleOpenURL(url: url, completion: { (token) in 71 | OctokitManager.shared.tokenConfiguration = token 72 | 73 | DispatchQueue.main.async { 74 | self.navigationController?.popViewController(animated: true) 75 | } 76 | }) 77 | } 78 | } 79 | 80 | decisionHandler(.allow) 81 | } 82 | 83 | func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { 84 | 85 | if !refreshControl.isRefreshing{ 86 | activityIndicator.startAnimating() 87 | } 88 | } 89 | 90 | func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 91 | 92 | activityIndicator.stopAnimating() 93 | refreshControl.endRefreshing() 94 | } 95 | 96 | func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { 97 | 98 | activityIndicator.stopAnimating() 99 | refreshControl.endRefreshing() 100 | } 101 | 102 | func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 103 | 104 | activityIndicator.stopAnimating() 105 | refreshControl.endRefreshing() 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /Gitcoin/Util/Colors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Colors.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/9/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | struct gitCoin { 13 | static let celestialWhite = UIColor(named: "CelestialWhite")! 14 | static let starDustYellow = UIColor(named: "StarDustYellow")! 15 | static let cosmicTeal = UIColor(named: "CosmicTeal")! 16 | static let darkCosmicTeal = UIColor(named: "DarkCosmicTeal")! 17 | static let milkyWayBlue = UIColor(named: "MilkyWayBlue")! 18 | static let polarisBlue = UIColor(named: "PolarisBlue")! 19 | static let vinusPurple = UIColor(named: "VinusPurple")! 20 | static let regulusRed = UIColor(named: "RegulusRed")! 21 | static let midnightBlue = UIColor(named: "MidnightBlue")! 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Gitcoin/Util/Config.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Config.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/3/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | struct Config { 12 | 13 | public static let kGitCoinSavedBounties = "com.gitcoin.saved.bounties" 14 | 15 | private static var dictionaryValues: [String: Any]? { 16 | get { 17 | if let fileUrl = Bundle.main.url(forResource: "SafeConfiguration", withExtension: "plist"), 18 | let data = try? Data(contentsOf: fileUrl) { 19 | if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] { 20 | return result 21 | } 22 | } 23 | 24 | return nil 25 | } 26 | } 27 | 28 | static var gitHubOAuthToken: String? { 29 | get { 30 | if let gitHubOAuthToken = dictionaryValues?["gitHubOAuthToken"] as? String { 31 | return gitHubOAuthToken 32 | } 33 | 34 | return nil 35 | } 36 | } 37 | 38 | static var gitHubOAuthSecret: String? { 39 | get { 40 | if let val = dictionaryValues?["gitHubOAuthSecret"] as? String { 41 | return val 42 | } 43 | 44 | return nil 45 | } 46 | } 47 | 48 | static var gitcoinApiBaseUrl: String { 49 | #if DEBUG 50 | if let val = dictionaryValues?["gitcoinApiBaseUrl"] as? String { 51 | return val 52 | } 53 | #endif 54 | 55 | return "https://gitcoin.co/" 56 | //return "https://stage.gitcoin.co/" 57 | //return "https://origin.gitcoin.co/" 58 | } 59 | 60 | static var gitcoinApiUsername: String? { 61 | if let val = dictionaryValues?["gitcoinApiUsername"] as? String { 62 | return val 63 | } 64 | 65 | //return "gitcoin" 66 | return nil 67 | } 68 | 69 | static var gitcoinApiPassword: String? { 70 | if let val = dictionaryValues?["gitcoinApiPassword"] as? String { 71 | return val 72 | } 73 | 74 | //return "pushopensourceforward" 75 | return nil 76 | } 77 | 78 | static var enableGitcoinAPILogging: Bool { 79 | if let val = dictionaryValues?["enableGitcoinAPILogging"] as? Bool { 80 | return val 81 | } 82 | 83 | return false 84 | } 85 | 86 | /// MVP: pretend mode prevents the api from sending "New Match Alert" emails 87 | /// when a user swipes right on a bounty 88 | 89 | static var enableGitcoinAPIPretendMode: Bool { 90 | 91 | // force to false if in RELEASE mode 92 | #if DEBUG 93 | if let val = dictionaryValues?["enableGitcoinAPIPretendMode"] as? Bool { 94 | return val 95 | } 96 | 97 | return true 98 | #else 99 | return false 100 | #endif 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /Gitcoin/Util/Fonts.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Fonts.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 12/9/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIFont { 12 | class func futuraFont(size fontSize: CGFloat = 14.0) -> UIFont { 13 | return UIFont(name: "Futura", size: fontSize)! 14 | } 15 | 16 | class func robotoRegularFont(size fontSize: CGFloat = 14.0) -> UIFont { 17 | return UIFont(name: "Roboto-Regular", size: fontSize)! 18 | } 19 | 20 | class func robotoMediumFont(size fontSize: CGFloat = 14.0) -> UIFont { 21 | return UIFont(name: "Roboto-Medium", size: fontSize)! 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Gitcoin/Util/Globals.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Globals.swift 3 | // Gitcoin 4 | // 5 | // Created by Craig Heneveld on 11/7/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftyUserDefaults 11 | import SwiftyBeaver 12 | import SCLAlertView 13 | 14 | let logger = SwiftyBeaver.self 15 | 16 | /// UserDefaultKeyConstants: All UserDefaults persisted key definitions 17 | struct UserDefaultKeyConstants { 18 | static let lastViewedBountyId = DefaultsKey("lastViewedBountyId") 19 | 20 | static let userKeywords = DefaultsKey<[String]>("userKeywords") 21 | 22 | static let seenSwipeRightBountyAlert = DefaultsKey("seenSwipeRightBountyAlert") 23 | } 24 | 25 | func gitcoinAppearance(kDefaultShadowOpacity: CGFloat = 0.7, 26 | kCircleTopPosition: CGFloat = -12.0, 27 | kCircleBackgroundTopPosition: CGFloat = -15.0, 28 | kCircleHeight: CGFloat = 56.0, 29 | kCircleIconHeight: CGFloat = 20.0, 30 | kTitleTop:CGFloat = 30.0, 31 | kTitleHeight:CGFloat = 45.0, 32 | kTextHeight: CGFloat = 90.0, 33 | kTextFieldHeight: CGFloat = 50.0, 34 | kTextViewdHeight: CGFloat = 80.0, 35 | kButtonHeight: CGFloat = 50.0, 36 | kTitleFont: UIFont = UIFont.futuraFont(size: 20.0), 37 | kTextFont: UIFont = UIFont.robotoRegularFont(size: 14.0), 38 | kButtonFont: UIFont = UIFont.futuraFont(size: 16.0), 39 | showCloseButton: Bool = true, 40 | showCircularIcon: Bool = true, 41 | shouldAutoDismiss: Bool = true, 42 | contentViewCornerRadius: CGFloat = 25.0, 43 | fieldCornerRadius: CGFloat = 3.0, 44 | buttonCornerRadius: CGFloat = 15.0, 45 | hideWhenBackgroundViewIsTapped: Bool = false, 46 | contentViewColor: UIColor = .white, 47 | contentViewBorderColor: UIColor = .lightGray, 48 | titleColor: UIColor = .darkText) -> SCLAlertView.SCLAppearance { 49 | 50 | let screenSize = UIScreen.main.bounds 51 | let screenWidth = screenSize.width 52 | 53 | let kWindowWidth = screenWidth*0.7866666667 54 | let kWindowHeight = kWindowWidth 55 | 56 | return SCLAlertView.SCLAppearance(kDefaultShadowOpacity: kDefaultShadowOpacity, kCircleTopPosition: kCircleTopPosition, kCircleBackgroundTopPosition: kCircleBackgroundTopPosition, kCircleHeight: kCircleHeight, kCircleIconHeight: kCircleIconHeight, kTitleTop: kTitleTop, kTitleHeight: kTitleHeight, kWindowWidth: kWindowWidth, kWindowHeight: kWindowHeight, kTextHeight: kTextHeight, kTextFieldHeight: kTextFieldHeight, kTextViewdHeight: kTextViewdHeight, kButtonHeight: kButtonHeight, kTitleFont: kTitleFont, kTextFont: kTextFont, kButtonFont: kButtonFont, showCloseButton: showCloseButton, showCircularIcon: showCircularIcon, shouldAutoDismiss: shouldAutoDismiss, contentViewCornerRadius: contentViewCornerRadius, fieldCornerRadius: fieldCornerRadius, buttonCornerRadius: buttonCornerRadius, hideWhenBackgroundViewIsTapped: hideWhenBackgroundViewIsTapped, contentViewColor: contentViewColor, contentViewBorderColor: contentViewBorderColor, titleColor: titleColor) 57 | } 58 | -------------------------------------------------------------------------------- /Gitcoin/Util/SavedBountiesManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SavedBountiesManager.swift 3 | // Gitcoin 4 | // 5 | // Created by John Brunelle on 6/7/18. 6 | // Copyright © 2018 Gitcoin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class SavedBountiesManager: NSObject { 12 | static let shared = SavedBountiesManager() 13 | private override init() {} 14 | 15 | func currentIds() -> [Int]{ 16 | return UserDefaults.standard.object(forKey: Config.kGitCoinSavedBounties) as? [Int] ?? [Int]() 17 | } 18 | 19 | static func save(id: Int?){ 20 | 21 | guard let id = id else { return } 22 | var bountyArr = shared.currentIds() 23 | bountyArr.append(id) 24 | 25 | UserDefaults.standard.set(bountyArr, forKey: Config.kGitCoinSavedBounties) 26 | 27 | print("save bounty = \(id)") 28 | shared.printSavedBounties() 29 | } 30 | 31 | static func remove(id: Int?){ 32 | 33 | guard let id = id else { return } 34 | var bountyArr = shared.currentIds() 35 | 36 | if let index = bountyArr.index(of: id) { 37 | bountyArr.remove(at: index) 38 | } 39 | 40 | UserDefaults.standard.set(bountyArr, forKey: Config.kGitCoinSavedBounties) 41 | 42 | print("removed bounty = \(id)") 43 | shared.printSavedBounties() 44 | } 45 | 46 | static func removeByList(of bounties: [Bounty]){ 47 | for (_,item) in bounties.enumerated(){ 48 | SavedBountiesManager.remove(id: item.standardBountiesId) 49 | } 50 | } 51 | 52 | static func bountyExists(id: Int?) -> Bool{ 53 | 54 | guard let id = id else { return false} 55 | return shared.currentIds().contains(where: { $0 == id }) 56 | } 57 | 58 | static func list() -> String{ 59 | 60 | let bountyArr = shared.currentIds() 61 | let convertedArr = bountyArr.map{String($0)}.joined(separator: ", ") 62 | 63 | print("convertedArr = \(convertedArr)") 64 | shared.printSavedBounties() 65 | 66 | return convertedArr 67 | 68 | } 69 | 70 | fileprivate func printSavedBounties(){ 71 | let bountyArr = currentIds() 72 | print("Current Saved Bounties = \(bountyArr)") 73 | 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /GitcoinTests/GitcoinTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitcoinTests.swift 3 | // GitcoinTests 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Gitcoin 11 | 12 | class GitcoinTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /GitcoinTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /GitcoinUITests/GitcoinUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitcoinUITests.swift 3 | // GitcoinUITests 4 | // 5 | // Created by Craig Heneveld on 10/31/17. 6 | // Copyright © 2017 Gitcoin. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class GitcoinUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | 18 | // In UI tests it is usually best to stop immediately when a failure occurs. 19 | continueAfterFailure = false 20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 21 | XCUIApplication().launch() 22 | 23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 24 | } 25 | 26 | override func tearDown() { 27 | // Put teardown code here. This method is called after the invocation of each test method in the class. 28 | super.tearDown() 29 | } 30 | 31 | func testExample() { 32 | // Use recording to get started writing UI tests. 33 | // Use XCTAssert and related functions to verify your tests produce the correct results. 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /GitcoinUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Info.plist -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/InputBarAccessoryView: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/InputBarAccessoryView -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm.swiftdoc -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm.swiftmodule -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm64.swiftdoc -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/arm64.swiftmodule -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/i386.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/i386.swiftdoc -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/i386.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/i386.swiftmodule -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/x86_64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/x86_64.swiftdoc -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/x86_64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/InputBarAccessoryView.framework/Modules/InputBarAccessoryView.swiftmodule/x86_64.swiftmodule -------------------------------------------------------------------------------- /InputBarAccessoryView.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module InputBarAccessoryView { 2 | header "InputBarAccessoryView-Swift.h" 3 | requires objc 4 | } 5 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '11.0' 3 | 4 | target 'Gitcoin' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for Gitcoin 9 | 10 | pod 'Koloda', '~> 4.3.1' 11 | 12 | pod 'RxSwift', '~> 4.0' 13 | pod 'RxCocoa', '~> 4.0' 14 | 15 | pod 'Moya/RxSwift', '~> 10.0.2' 16 | pod 'Moya-ModelMapper/RxSwift', '~> 6.0.0' 17 | 18 | pod 'ModelMapper', '~> 6.0.0' 19 | 20 | pod 'AlamofireImage', '~> 3.3' 21 | 22 | pod 'SCLAlertView' , '~> 0.8' 23 | 24 | pod 'OctoKit.swift', '~> 0.8' 25 | 26 | pod 'SideMenu' 27 | 28 | pod 'SwiftyUserDefaults' 29 | 30 | pod 'SwiftyBeaver' 31 | 32 | pod 'SwiftSpinner' 33 | 34 | pod 'Fabric' 35 | 36 | pod 'Crashlytics' 37 | 38 | #pod 'AFDateHelper', '= 4.2.4' 39 | pod 'AFDateHelper' 40 | 41 | pod 'WSTagsField', '~> 3.1.0' 42 | 43 | pod 'TTTAttributedLabel' 44 | 45 | pod 'Pushwoosh' 46 | 47 | #pod 'Mixpanel-swift', '= 2.1.8' 48 | pod 'Mixpanel-swift', '= 2.3.3' 49 | 50 | #pod 'Whisper', '= 5.1.0' 51 | pod 'Whisper', '= 6.0.2' 52 | 53 | pod 'youtube-ios-player-helper', '~> 0.1' 54 | 55 | pod 'ALTextInputBar' 56 | 57 | target 'GitcoinTests' do 58 | inherit! :search_paths 59 | # Pods for testing 60 | end 61 | 62 | target 'GitcoinUITests' do 63 | inherit! :search_paths 64 | # Pods for testing 65 | end 66 | 67 | end 68 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AFDateHelper (4.2.7) 3 | - Alamofire (4.6.0) 4 | - AlamofireImage (3.3.0): 5 | - Alamofire (~> 4.5) 6 | - ALTextInputBar (1.1.8) 7 | - Crashlytics (3.9.3): 8 | - Fabric (~> 1.7.2) 9 | - Fabric (1.7.2) 10 | - Koloda (4.3.1): 11 | - pop (~> 1.0) 12 | - Mixpanel-swift (2.3.3): 13 | - Mixpanel-swift/Complete (= 2.3.3) 14 | - Mixpanel-swift/Complete (2.3.3) 15 | - ModelMapper (7.4.0) 16 | - Moya (10.0.2): 17 | - Moya/Core (= 10.0.2) 18 | - Moya-ModelMapper/Core (6.0.0): 19 | - ModelMapper 20 | - Moya (~> 10.0) 21 | - Moya-ModelMapper/RxSwift (6.0.0): 22 | - Moya-ModelMapper/Core 23 | - Moya/RxSwift (~> 10.0) 24 | - RxSwift 25 | - Moya/Core (10.0.2): 26 | - Alamofire (~> 4.1) 27 | - Result (~> 3.0) 28 | - Moya/RxSwift (10.0.2): 29 | - Moya/Core 30 | - RxSwift (~> 4.0) 31 | - NBNRequestKit (2.2.0) 32 | - OctoKit.swift (0.8.0): 33 | - NBNRequestKit (~> 2.0) 34 | - pop (1.0.10) 35 | - Pushwoosh (5.5.3) 36 | - Result (3.2.4) 37 | - RxCocoa (4.1.1): 38 | - RxSwift (~> 4.0) 39 | - RxSwift (4.1.1) 40 | - SCLAlertView (0.8) 41 | - SideMenu (3.1.5) 42 | - SwiftSpinner (1.5.0) 43 | - SwiftyBeaver (1.5.1) 44 | - SwiftyUserDefaults (3.0.0) 45 | - TTTAttributedLabel (2.0.0) 46 | - Whisper (6.0.2) 47 | - WSTagsField (3.1.0) 48 | - youtube-ios-player-helper (0.1.6) 49 | 50 | DEPENDENCIES: 51 | - AFDateHelper 52 | - AlamofireImage (~> 3.3) 53 | - ALTextInputBar 54 | - Crashlytics 55 | - Fabric 56 | - Koloda (~> 4.3.1) 57 | - Mixpanel-swift (= 2.3.3) 58 | - Moya-ModelMapper/RxSwift 59 | - Moya/RxSwift 60 | - OctoKit.swift (~> 0.8) 61 | - Pushwoosh 62 | - RxCocoa (~> 4.0) 63 | - RxSwift (~> 4.0) 64 | - SCLAlertView (~> 0.8) 65 | - SideMenu 66 | - SwiftSpinner 67 | - SwiftyBeaver 68 | - SwiftyUserDefaults 69 | - TTTAttributedLabel 70 | - Whisper (= 6.0.2) 71 | - WSTagsField (~> 3.1.0) 72 | - youtube-ios-player-helper (~> 0.1) 73 | 74 | SPEC CHECKSUMS: 75 | AFDateHelper: 4ad66fb19503041fbba8a3018cb7ef9c71b2ff88 76 | Alamofire: f41a599bd63041760b26d393ec1069d9d7b917f4 77 | AlamofireImage: 2e784dc5d00f04903a52c1d169181469c805c3df 78 | ALTextInputBar: 6c160c51958903c5f7b9d158e19f9c4113ae351b 79 | Crashlytics: dbb07d01876c171c5ccbdf7826410380189e452c 80 | Fabric: 9cd6a848efcf1b8b07497e0b6a2e7d336353ba15 81 | Koloda: 0d39b2aa188ccd1fac48d752acaf9802e683c625 82 | Mixpanel-swift: 6758dfe92c1f1173a7319e5722ab454f7cd15879 83 | ModelMapper: 467f49f6f187b4e6cde2599e7cc5968cefa3f19b 84 | Moya: 2b0531a9fef318e0bc484030c3db1e6f279ccb66 85 | Moya-ModelMapper: c59c0bbd042cf9d1d9b0acf38c5f930956bebed8 86 | NBNRequestKit: 30c39d8e23e94f935bfc2a25789c44e4a6e1bfdd 87 | OctoKit.swift: 2f51efbf888997fc625b91894777e76e9142d95b 88 | pop: 82ca6b068ce9278fd350fd9dd09482a0ce9492e6 89 | Pushwoosh: 6e5b9c2845fac05dec7f8955590c24733a57a59c 90 | Result: d2d07204ce72856f1fd9130bbe42c35a7b0fea10 91 | RxCocoa: fd0862fd2df95fa55562ad28ffd2522c25eb4a85 92 | RxSwift: c6e3b1c7b325c7d121cd4327e9d98b7ed746b570 93 | SCLAlertView: 6a77bb2edfc65e04dbe57725546cb4107a506b85 94 | SideMenu: 47dbf9e4d878062d8994aed43f6e4bf6c1fea30b 95 | SwiftSpinner: 4c058c7a1d6b444dd2e1d70988ead40783097133 96 | SwiftyBeaver: 4f74563624b2c1e821c522c54142b5dd5ebb0f30 97 | SwiftyUserDefaults: 0f1d45fc3aafb9064dac661e367f8f83fe21a4b4 98 | TTTAttributedLabel: 8cffe8e127e4e82ff3af1e5386d4cd0ad000b656 99 | Whisper: 169760fc4bab0abf24d5529f9276f95c25cf1025 100 | WSTagsField: 53055749c03769b2b297f2a629ba23a26931e3ff 101 | youtube-ios-player-helper: 21ab92db027c7ff86cb17a3843a3f6eafc8158d2 102 | 103 | PODFILE CHECKSUM: e88d4339af834ba766b211c4968a25ed180806d0 104 | 105 | COCOAPODS: 1.4.0 106 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Gitcoin iOS app 4 | 5 | [![CircleCI](https://circleci.com/gh/gitcoinco/ios/tree/master.svg?style=svg)](https://circleci.com/gh/gitcoinco/ios/tree/master) 6 | 7 | This is an app that allows one to explore funded issues from their iPhone. 8 | 9 | [Star](https://github.com/gitcoinco/ios/stargazers) and [watch](https://github.com/gitcoinco/ios/watchers) this github repository to stay up to date, we're pushing new code several times per week! 10 | 11 | ## Download it now 12 | 13 | 14 | 15 | 16 | 17 | ## Trailer 18 | 19 | Check out the trailer video: 20 | 21 | 22 | 23 | 24 | 25 | ## Gitcoin 26 | 27 | Gitcoin pushes Open Source Forward. Learn more at [https://gitcoin.co](https://gitcoin.co) 28 | 29 | ## Setup 30 | 31 | 1. [Install cocoapods](https://guides.cocoapods.org/using/getting-started.html), and run `pod install` from the repo 32 | 2. `cp Gitcoin/SafeConfiguration.plist.dist Gitcoin/SafeConfiguration.plist` 33 | 3. Edit your `SafeConfiguration.plist` file and add the following keys as strings: `gitHubOAuthToken`, `gitHubOAuthSecret` ([see here to create these values](https://github.com/settings/developers)) 34 | 4. Build the app in xcode (make sure to open the `Gitcoin.xcworkspace` file, not the `Gitcoin.xcodeproj` file) 35 | 36 | ## Legal 37 | 38 | ''' 39 | 40 | Copyright (C) 2017 Gitcoin Core 41 | 42 | This program is free software: you can redistribute it and/or modify 43 | it under the terms of the GNU Affero General Public License as published 44 | by the Free Software Foundation, either version 3 of the License, or 45 | (at your option) any later version. 46 | 47 | This program is distributed in the hope that it will be useful, 48 | but WITHOUT ANY WARRANTY; without even the implied warranty of 49 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 50 | GNU Affero General Public License for more details. 51 | 52 | You should have received a copy of the GNU Affero General Public License 53 | along with this program. If not, see . 54 | 55 | ''' 56 | 57 | ## Credits 58 | 59 | Thanks to @cheneveld for the initial app build and @john-brunelle for helping get this in the app store. 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /img/app_store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/img/app_store.png -------------------------------------------------------------------------------- /img/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gitcoinco/ios/222172ac7a5f9b78c4f0a692774e4401ec9b64ad/img/video.png --------------------------------------------------------------------------------