├── .gitignore ├── .swiftpm ├── playgrounds │ ├── DocumentThumbnail.plist │ ├── DocumentThumbnail.png │ └── Workspace.plist └── xcode │ └── package.xcworkspace │ └── contents.xcworkspacedata ├── App ├── Extensions │ ├── AppStorage+.swift │ ├── Array+Extensions.swift │ ├── AttributedString+Extensions.swift │ ├── Color+Extensions.swift │ ├── UINavigationController+Extensions.swift │ └── Workaround+Extensions.swift ├── Helpers │ ├── Constants.swift │ └── Router.swift ├── Resources │ ├── Localizebles │ │ ├── en.lproj │ │ │ └── Localizable.strings │ │ └── ja.lproj │ │ │ └── Localizable.strings │ └── SwiftGen │ │ └── .gitkeep ├── Screens │ ├── AppearanceSettings │ │ ├── AppearanceSettingsEnvironment.swift │ │ ├── AppearanceSettingsView.swift │ │ ├── AppearanceSettingsViewModel.swift │ │ └── Models │ │ │ └── AppearanceMode.swift │ ├── Info │ │ ├── InfoEnvironment.swift │ │ ├── InfoView.swift │ │ ├── InfoViewModel.swift │ │ ├── Models │ │ │ └── InfoType.swift │ │ └── Views │ │ │ ├── InfoButtonRow.swift │ │ │ ├── InfoNavigationRow.swift │ │ │ ├── InfoRowContent.swift │ │ │ └── InfoSection.swift │ ├── License │ │ ├── LicenseEnvironment.swift │ │ ├── LicenseView.swift │ │ ├── LicenseViewModel.swift │ │ └── Models │ │ │ └── LicenseModel.swift │ ├── LicenseDetail │ │ ├── LicenseDetailView.swift │ │ └── LicenseDetailViewModel.swift │ ├── MainApp.swift │ ├── Map │ │ ├── MapView.swift │ │ └── MapViewModel.swift │ ├── Root │ │ ├── Models │ │ │ └── ScheduleType.swift │ │ ├── RootEnvironment.swift │ │ ├── RootView.swift │ │ ├── RootViewModel.swift │ │ └── Views │ │ │ └── RootToolbarContent.swift │ ├── Session │ │ ├── Models │ │ │ ├── SessionModel.swift │ │ │ ├── SessionType.swift │ │ │ └── TrackType.swift │ │ ├── SessionEnvironment.swift │ │ ├── SessionView.swift │ │ ├── SessionViewModel.swift │ │ └── Views │ │ │ ├── SessionRow.swift │ │ │ ├── SessionSection.swift │ │ │ ├── SessionSheetWrapperView.swift │ │ │ └── SessionTag.swift │ ├── SessionDetail │ │ ├── SessionDetailEnvironment.swift │ │ ├── SessionDetailView.swift │ │ ├── SessionDetailViewModel.swift │ │ └── Views │ │ │ └── SessionDetailUserView.swift │ ├── SessionList │ │ ├── SessionListEnvironment.swift │ │ ├── SessionListView.swift │ │ ├── SessionListViewModel.swift │ │ └── Views │ │ │ └── SessionListRow.swift │ ├── StaffType │ │ ├── Models │ │ │ └── StaffType.swift │ │ ├── StaffTypeEnvironment.swift │ │ └── StaffTypeView.swift │ └── UserList │ │ ├── Models │ │ ├── SessionUser.swift │ │ └── StaffUser.swift │ │ ├── UserListEnvironment.swift │ │ ├── UserListView.swift │ │ ├── UserListViewModel.swift │ │ └── Views │ │ └── UserListRow.swift └── Views │ ├── CloseToolbarContent.swift │ ├── EmptyView.swift │ └── NavigationRow.swift ├── AppTest └── Screens │ ├── AppearanceSettings │ ├── AppearanceSettingsViewModelTest.swift │ └── Models │ │ └── AppearanceModeTest.swift │ ├── Info │ └── InfoViewModelTest.swift │ ├── Map │ └── MapViewModelTest.swift │ ├── Root │ └── RootViewModelTest.swift │ ├── Session │ ├── Models │ │ ├── SessionModelTest.swift │ │ └── TrackTypeTest.swift │ └── SessionViewModelTest.swift │ ├── SessionDetail │ └── SessionDetailViewModelTest.swift │ ├── SessionList │ ├── Models │ │ └── SessionModelTest+SessionList.swift │ └── SessionListViewModelTest.swift │ └── UserList │ └── UserListViewModelTest.swift ├── Assets.xcassets ├── AppIcon.appiconset │ ├── AppIcon.png │ └── Contents.json ├── Contents.json ├── Logo │ ├── Contents.json │ ├── logo_twitter.imageset │ │ ├── Contents.json │ │ └── logo_twitter.png │ └── logo_youtube.imageset │ │ ├── Contents.json │ │ └── logo_youtube.png ├── Map │ ├── Contents.json │ ├── map_floor.imageset │ │ ├── Contents.json │ │ └── map_floor.png │ └── map_university.imageset │ │ ├── Contents.json │ │ └── map_university.png └── StaffUser │ ├── Core │ ├── Contents.json │ ├── user501.imageset │ │ ├── Contents.json │ │ └── user501.jpeg │ ├── user502.imageset │ │ ├── Contents.json │ │ └── user502.png │ ├── user503.imageset │ │ ├── Contents.json │ │ └── user503.jpeg │ ├── user504.imageset │ │ ├── Contents.json │ │ └── user504.jpeg │ ├── user505.imageset │ │ ├── Contents.json │ │ └── user505.jpeg │ ├── user506.imageset │ │ ├── Contents.json │ │ └── user506.png │ ├── user507.imageset │ │ ├── Contents.json │ │ └── user507.jpeg │ ├── user508.imageset │ │ ├── Contents.json │ │ └── user508.jpeg │ ├── user509.imageset │ │ ├── Contents.json │ │ └── user509.jpeg │ ├── user510.imageset │ │ ├── Contents.json │ │ └── user510.jpeg │ ├── user511.imageset │ │ ├── Contents.json │ │ └── user511.jpeg │ ├── user512.imageset │ │ ├── Contents.json │ │ └── user512.jpeg │ ├── user513.imageset │ │ ├── Contents.json │ │ └── user513.jpeg │ ├── user514.imageset │ │ ├── Contents.json │ │ └── user514.jpeg │ ├── user515.imageset │ │ ├── Contents.json │ │ └── user515.jpeg │ ├── user516.imageset │ │ ├── Contents.json │ │ └── user516.jpeg │ ├── user517.imageset │ │ ├── Contents.json │ │ └── user517.jpeg │ ├── user518.imageset │ │ ├── Contents.json │ │ └── user518.jpeg │ ├── user519.imageset │ │ ├── Contents.json │ │ └── user519.jpeg │ ├── user520.imageset │ │ ├── Contents.json │ │ └── user520.png │ ├── user521.imageset │ │ ├── Contents.json │ │ └── user521.jpeg │ └── user522.imageset │ │ ├── Contents.json │ │ └── user522.jpeg │ ├── Network │ ├── Contents.json │ ├── user701.imageset │ │ ├── Contents.json │ │ └── user701.jpeg │ ├── user702.imageset │ │ ├── Contents.json │ │ └── user702.jpeg │ ├── user703.imageset │ │ ├── Contents.json │ │ └── user703.jpeg │ ├── user704.imageset │ │ ├── Contents.json │ │ └── user704.jpeg │ └── user705.imageset │ │ ├── Contents.json │ │ └── user705.jpeg │ ├── Session │ ├── Contents.json │ ├── user1.imageset │ │ ├── Contents.json │ │ └── user1.jpeg │ ├── user10.imageset │ │ ├── Contents.json │ │ └── user10.jpeg │ ├── user11.imageset │ │ ├── Contents.json │ │ └── user11.jpeg │ ├── user12.imageset │ │ ├── Contents.json │ │ └── user12.png │ ├── user13.imageset │ │ ├── Contents.json │ │ └── user13.jpeg │ ├── user14.imageset │ │ ├── Contents.json │ │ └── user14.jpeg │ ├── user15.imageset │ │ ├── Contents.json │ │ └── user15.jpeg │ ├── user16.imageset │ │ ├── Contents.json │ │ └── user16.jpeg │ ├── user17.imageset │ │ ├── Contents.json │ │ └── user17.jpeg │ ├── user18.imageset │ │ ├── Contents.json │ │ └── user18.jpeg │ ├── user19.imageset │ │ ├── Contents.json │ │ └── user19.jpeg │ ├── user2.imageset │ │ ├── Contents.json │ │ └── user2.jpeg │ ├── user20.imageset │ │ ├── Contents.json │ │ └── user20.jpeg │ ├── user21.imageset │ │ ├── Contents.json │ │ └── user21.png │ ├── user22.imageset │ │ ├── Contents.json │ │ └── user22.jpeg │ ├── user23.imageset │ │ ├── Contents.json │ │ └── user23.jpeg │ ├── user24.imageset │ │ ├── Contents.json │ │ └── user24.jpeg │ ├── user25.imageset │ │ ├── Contents.json │ │ └── user25.jpeg │ ├── user26.imageset │ │ ├── Contents.json │ │ └── user26.jpeg │ ├── user27.imageset │ │ ├── Contents.json │ │ └── user27.jpeg │ ├── user28.imageset │ │ ├── Contents.json │ │ └── user28.png │ ├── user29.imageset │ │ ├── Contents.json │ │ └── user29.png │ ├── user3.imageset │ │ ├── Contents.json │ │ └── user3.jpeg │ ├── user30.imageset │ │ ├── Contents.json │ │ └── user30.jpeg │ ├── user31.imageset │ │ ├── Contents.json │ │ └── user31.jpeg │ ├── user32.imageset │ │ ├── Contents.json │ │ └── user32.png │ ├── user33.imageset │ │ ├── Contents.json │ │ └── user33.jpeg │ ├── user34.imageset │ │ ├── Contents.json │ │ └── user34.jpeg │ ├── user35.imageset │ │ ├── Contents.json │ │ └── user35.png │ ├── user36.imageset │ │ ├── Contents.json │ │ └── user36.jpeg │ ├── user37.imageset │ │ ├── Contents.json │ │ └── user37.jpeg │ ├── user38.imageset │ │ ├── Contents.json │ │ └── user38.jpeg │ ├── user39.imageset │ │ ├── Contents.json │ │ └── user39.jpeg │ ├── user4.imageset │ │ ├── Contents.json │ │ └── user4.jpeg │ ├── user40.imageset │ │ ├── Contents.json │ │ └── user40.png │ ├── user41.imageset │ │ ├── Contents.json │ │ └── user41.jpeg │ ├── user42.imageset │ │ ├── Contents.json │ │ └── user42.jpeg │ ├── user43.imageset │ │ ├── Contents.json │ │ └── user43.jpeg │ ├── user44.imageset │ │ ├── Contents.json │ │ └── user44.jpeg │ ├── user45.imageset │ │ ├── Contents.json │ │ └── user45.png │ ├── user46.imageset │ │ ├── Contents.json │ │ └── user46.jpeg │ ├── user47.imageset │ │ ├── Contents.json │ │ └── user47.jpeg │ ├── user48.imageset │ │ ├── Contents.json │ │ └── user48.png │ ├── user49.imageset │ │ ├── Contents.json │ │ └── user49.jpeg │ ├── user5.imageset │ │ ├── Contents.json │ │ └── user5.jpeg │ ├── user50.imageset │ │ ├── Contents.json │ │ └── user50.jpeg │ ├── user51.imageset │ │ ├── Contents.json │ │ └── user51.jpeg │ ├── user52.imageset │ │ ├── Contents.json │ │ └── user52.jpeg │ ├── user56.imageset │ │ ├── Contents.json │ │ └── user56.jpeg │ ├── user58.imageset │ │ ├── Contents.json │ │ └── user58.jpeg │ ├── user59.imageset │ │ ├── Contents.json │ │ └── user59.png │ ├── user6.imageset │ │ ├── Contents.json │ │ └── user6.jpeg │ ├── user60.imageset │ │ ├── Contents.json │ │ └── user60.jpeg │ ├── user61.imageset │ │ ├── Contents.json │ │ └── user61.jpeg │ ├── user62.imageset │ │ ├── Contents.json │ │ └── user62.jpeg │ ├── user63.imageset │ │ ├── Contents.json │ │ └── user63.jpeg │ ├── user64.imageset │ │ ├── Contents.json │ │ └── user64.jpeg │ ├── user65.imageset │ │ ├── Contents.json │ │ └── user65.jpeg │ ├── user66.imageset │ │ ├── Contents.json │ │ └── user66.jpeg │ ├── user67.imageset │ │ ├── Contents.json │ │ └── user67.jpeg │ ├── user68.imageset │ │ ├── Contents.json │ │ └── user68.jpeg │ ├── user69.imageset │ │ ├── Contents.json │ │ └── user69.jpeg │ ├── user7.imageset │ │ ├── Contents.json │ │ └── user7.jpeg │ ├── user71.imageset │ │ ├── Contents.json │ │ └── user71.jpeg │ ├── user72.imageset │ │ ├── Contents.json │ │ └── user72.jpeg │ ├── user73.imageset │ │ ├── Contents.json │ │ └── user73.png │ ├── user74.imageset │ │ ├── Contents.json │ │ └── user74.jpeg │ ├── user75.imageset │ │ ├── Contents.json │ │ └── user75.jpeg │ ├── user76.imageset │ │ ├── Contents.json │ │ └── user76.jpeg │ ├── user77.imageset │ │ ├── Contents.json │ │ └── user77.jpeg │ ├── user78.imageset │ │ ├── Contents.json │ │ └── user78.jpeg │ ├── user79.imageset │ │ ├── Contents.json │ │ └── user79.jpeg │ ├── user8.imageset │ │ ├── Contents.json │ │ └── user8.jpeg │ ├── user80.imageset │ │ ├── Contents.json │ │ └── user80.jpeg │ ├── user81.imageset │ │ ├── Contents.json │ │ └── user81.jpeg │ ├── user82.imageset │ │ ├── Contents.json │ │ └── user82.jpeg │ ├── user83.imageset │ │ ├── Contents.json │ │ └── user83.jpeg │ ├── user84.imageset │ │ ├── Contents.json │ │ └── user84.jpeg │ ├── user85.imageset │ │ ├── Contents.json │ │ └── user85.png │ ├── user86.imageset │ │ ├── Contents.json │ │ └── user86.png │ ├── user87.imageset │ │ ├── Contents.json │ │ └── user87.jpeg │ ├── user88.imageset │ │ ├── Contents.json │ │ └── user88.jpeg │ ├── user89.imageset │ │ ├── Contents.json │ │ └── user89.jpeg │ ├── user9.imageset │ │ ├── Contents.json │ │ └── user9.jpeg │ ├── user90.imageset │ │ ├── Contents.json │ │ └── user90.jpeg │ ├── user91.imageset │ │ ├── Contents.json │ │ └── user91.jpeg │ ├── user92.imageset │ │ ├── Contents.json │ │ └── user92.jpeg │ ├── user93.imageset │ │ ├── Contents.json │ │ └── user93.jpeg │ ├── user94.imageset │ │ ├── Contents.json │ │ └── user94.jpeg │ ├── user95.imageset │ │ ├── Contents.json │ │ └── user95.jpeg │ └── user96.imageset │ │ ├── Contents.json │ │ └── user96.jpeg │ └── Temporary │ ├── Contents.json │ ├── user601.imageset │ ├── Contents.json │ └── user601.jpeg │ ├── user602.imageset │ ├── Contents.json │ └── user602.jpeg │ ├── user603.imageset │ ├── Contents.json │ └── user603.jpeg │ ├── user604.imageset │ ├── Contents.json │ └── user604.jpeg │ ├── user605.imageset │ ├── Contents.json │ └── user605.jpeg │ ├── user606.imageset │ ├── Contents.json │ └── user606.png │ ├── user607.imageset │ ├── Contents.json │ └── user607.png │ ├── user608.imageset │ ├── Contents.json │ └── user608.jpeg │ ├── user609.imageset │ ├── Contents.json │ └── user609.jpeg │ ├── user610.imageset │ ├── Contents.json │ └── user610.jpeg │ ├── user611.imageset │ ├── Contents.json │ └── user611.jpeg │ ├── user612.imageset │ ├── Contents.json │ └── user612.jpeg │ ├── user613.imageset │ ├── Contents.json │ └── user613.jpeg │ ├── user614.imageset │ ├── Contents.json │ └── user614.jpeg │ └── user615.imageset │ ├── Contents.json │ └── user615.jpeg ├── Makefile ├── Package.resolved ├── Package.swift ├── README.md ├── Resources ├── Plist │ └── App.plist └── Stencil │ ├── plist-runtime-swift5-revision.stencil │ ├── strings-structured-swift5-revision.stencil │ └── xcassets-swift5-revision.stencil └── swiftgen.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## User settings 6 | xcuserdata/ 7 | 8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 9 | *.xcscmblueprint 10 | *.xccheckout 11 | 12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 13 | build/ 14 | DerivedData/ 15 | *.moved-aside 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | 28 | ## App packaging 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Swift Playground 4.1 でアプリをクローンした際に、クラッシュするため、一旦リポジトリにも含めておく 40 | # Package.resolved 41 | CachedManifest.plist 42 | 43 | # 44 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata 45 | # hence it is not needed unless you have added a package configuration file to your project 46 | # .swiftpm 47 | 48 | .build/ 49 | 50 | # CocoaPods 51 | # 52 | # We recommend against adding the Pods directory to your .gitignore. However 53 | # you should judge for yourself, the pros and cons are mentioned at: 54 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 55 | # 56 | # Pods/ 57 | # 58 | # Add this line if you want to avoid checking in source code from the Xcode workspace 59 | # *.xcworkspace 60 | 61 | # Carthage 62 | # 63 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 64 | # Carthage/Checkouts 65 | 66 | Carthage/Build/ 67 | 68 | # Accio dependency management 69 | Dependencies/ 70 | .accio/ 71 | 72 | # fastlane 73 | # 74 | # It is recommended to not store the screenshots in the git repo. 75 | # Instead, use fastlane to re-generate the screenshots whenever they are needed. 76 | # For more information about the recommended setup visit: 77 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 78 | 79 | fastlane/report.xml 80 | fastlane/Preview.html 81 | fastlane/screenshots/**/*.png 82 | fastlane/test_output 83 | 84 | # Code Injection 85 | # 86 | # After new code Injection tools there's a generated folder /iOSInjectionProject 87 | # https://github.com/johnno1962/injectionforxcode 88 | 89 | iOSInjectionProject/ 90 | 91 | # SwiftGen 92 | App/Resources/SwiftGen/Assets.swift 93 | App/Resources/SwiftGen/LocalizedStrings.swift 94 | App/Resources/SwiftGen/Plist.swift 95 | 96 | # LicensePlist 97 | Resources/License 98 | 99 | .DS_Store -------------------------------------------------------------------------------- /.swiftpm/playgrounds/DocumentThumbnail.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | DocumentThumbnailConfiguration 6 | 7 | accentColorHash 8 | 9 | Fkd2iMDgBpnGz6RJejYS1+g8UyBitkslD+2JCBKO1Ug= 10 | 11 | appIconHash 12 | 13 | rFONEJv15411IG0tKjiq4rJWKuRu/FG1LT8FiWO0YC4= 14 | 15 | thumbnailIsPrerendered 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /.swiftpm/playgrounds/DocumentThumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/.swiftpm/playgrounds/DocumentThumbnail.png -------------------------------------------------------------------------------- /.swiftpm/playgrounds/Workspace.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AppSettings 6 | 7 | appIconPlaceholderGlyphName 8 | open-book 9 | appSettingsVersion 10 | 1 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /App/Extensions/AppStorage+.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Key 4 | enum AppStorageKey: String { 5 | case appearanceMode 6 | } 7 | 8 | // MARK: - Extension 9 | extension AppStorage { 10 | 11 | init( 12 | wrappedValue: Value, 13 | _ key: AppStorageKey, 14 | store: UserDefaults? = nil 15 | ) where Value: RawRepresentable, Value.RawValue == Int { 16 | self.init(wrappedValue: wrappedValue, key.rawValue, store: store) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /App/Extensions/Array+Extensions.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | /* 4 | AppStorageに配列を使用できるようにする拡張 5 | */ 6 | 7 | // MARK: - Array Extension 8 | extension Array: RawRepresentable where Element: Codable { 9 | 10 | public init?(rawValue: String) { 11 | guard let data = rawValue.data(using: .utf8) else { return nil } 12 | 13 | do { 14 | self = try JSONDecoder().decode([Element].self, from: data) 15 | } catch { 16 | self = [] 17 | } 18 | } 19 | 20 | public var rawValue: String { 21 | do { 22 | let data = try JSONEncoder().encode(self) 23 | let result = String(data: data, encoding: .utf8) 24 | return result ?? defaultRawValue 25 | } catch { 26 | return defaultRawValue 27 | } 28 | } 29 | 30 | private var defaultRawValue: String { 31 | "[]" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /App/Extensions/AttributedString+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension AttributedString { 4 | func ranges(of stringToFind: T) -> [Range] { 5 | var ranges: [Range] = [] 6 | var substring = self[self.startIndex ..< self.endIndex] 7 | while let range = substring.range(of: stringToFind) { 8 | ranges.append(range) 9 | substring = self[range.upperBound...] 10 | } 11 | return ranges 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /App/Extensions/Color+Extensions.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | 4 | // MARK: - Color Extension 5 | extension Color { 6 | static let secondarySystemBackground = Color(UIColor.secondarySystemBackground) 7 | } 8 | -------------------------------------------------------------------------------- /App/Extensions/UINavigationController+Extensions.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | // MARK: - UINavigationController Extension 4 | extension UINavigationController { 5 | 6 | /// 戻るボタンのタイトルを消す 7 | open override func viewWillLayoutSubviews() { 8 | super.viewWillLayoutSubviews() 9 | navigationBar.topItem?.backButtonDisplayMode = .minimal 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /App/Extensions/Workaround+Extensions.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import SwiftUIWorkaround 3 | 4 | extension Workaround { 5 | func preferredAppearanceMode(_ colorScheme: Binding) -> some View { 6 | self.preferredColorScheme(.init(get: { 7 | colorScheme.wrappedValue.colorScheme 8 | }, set: { newValue in 9 | colorScheme.wrappedValue = newValue.appearanceMode 10 | })) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /App/Helpers/Constants.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Constants 4 | enum Constants { 5 | // MARK: URL 6 | static let twitterBaseUrl = "https://twitter.com" 7 | static let youtubeBaseUrl = "https://www.youtube.com/watch?v=" 8 | static let iosdcUrl = "https://iosdc.jp/2022/" 9 | static let blogUrl = "https://blog.iosdc.jp/" 10 | static let privacyPolicyUrl = "https://crane-hiromu.github.io/PadOSDC-iOS-App-Privacy-Policy.io/" 11 | static let github = "https://github.com/crane-hiromu/PadOSDC_Japan_App" 12 | 13 | // MARK: Language Type 14 | enum LanguageType: String { 15 | case en, ja 16 | 17 | static var current: LanguageType? { 18 | LanguageType(rawValue: Locale.current.languageCode ?? "") 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /App/Helpers/Router.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Protocol 4 | protocol RouterProtocol { 5 | // View 6 | static func routeToRoot() -> RootView 7 | static func routeToSession(with scheduleType: ScheduleType) -> SessionView 8 | static func routeToSessionList() -> SessionListView 9 | static func routeToInfo() -> InfoView 10 | static func routeToAppearanceSettings() -> AppearanceSettingsView 11 | static func routeToMap() -> MapView 12 | static func routeToSessionDetail(with model: SessionModel) -> SessionDetailView 13 | static func routeToUserList(with models: [User]) -> UserListView 14 | static func routeToLicense() -> LicenseView 15 | static func routeToLicenseDetail(with model: LicenseModel) -> LicenseDetailView 16 | static func routeToStaffType() -> StaffTypeView 17 | // Web 18 | static func routeToWeb(with url: URL) 19 | } 20 | 21 | // MARK: - Router 22 | enum Router: RouterProtocol { 23 | 24 | // MARK: View 25 | 26 | static func routeToRoot() -> RootView { 27 | .init( 28 | viewModel: .init(), 29 | environment: .init() 30 | ) 31 | } 32 | 33 | static func routeToSession(with scheduleType: ScheduleType) -> SessionView { 34 | .init( 35 | viewModel: .init( 36 | output: .init(scheduleType: scheduleType), 37 | binding: .init(scheduleType: scheduleType) 38 | ), 39 | environment: .init() 40 | ) 41 | } 42 | 43 | static func routeToSessionList() -> SessionListView { 44 | .init( 45 | viewModel: .init(), 46 | environment: .init() 47 | ) 48 | } 49 | 50 | static func routeToInfo() -> InfoView { 51 | .init( 52 | viewModel: .init(), 53 | environment: .init() 54 | ) 55 | } 56 | 57 | static func routeToAppearanceSettings() -> AppearanceSettingsView { 58 | .init( 59 | viewModel: .init(), 60 | environment: .init() 61 | ) 62 | } 63 | 64 | static func routeToMap() -> MapView { 65 | .init(viewModel: .init()) 66 | } 67 | 68 | static func routeToSessionDetail(with model: SessionModel) -> SessionDetailView { 69 | .init( 70 | viewModel: .init(output: .init(model: model)), 71 | environment: .init() 72 | ) 73 | } 74 | 75 | static func routeToUserList(with models: [User]) -> UserListView { 76 | .init( 77 | viewModel: .init(output: .init(models: models)), 78 | environment: .init() 79 | ) 80 | } 81 | 82 | static func routeToLicense() -> LicenseView { 83 | .init(viewModel: .init(), environment: .init()) 84 | } 85 | 86 | static func routeToLicenseDetail(with model: LicenseModel) -> LicenseDetailView { 87 | .init( 88 | viewModel: .init( 89 | output: .init(model: model) 90 | ) 91 | ) 92 | } 93 | 94 | static func routeToStaffType() -> StaffTypeView { 95 | .init(environment: .init()) 96 | } 97 | 98 | // MARK: Web 99 | 100 | static func routeToWeb(with url: URL) { 101 | UIApplication.shared.open(url) 102 | } 103 | } 104 | 105 | // MARK: - Internal Extension 106 | extension EnvironmentValues { 107 | 108 | private struct RouterProtocolKey: EnvironmentKey { 109 | static var defaultValue: RouterProtocol.Type = Router.self 110 | } 111 | 112 | var router: RouterProtocol.Type { 113 | get { self[RouterProtocolKey.self] } 114 | set { self[RouterProtocolKey.self] = newValue } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /App/Resources/Localizebles/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | // MARK: - Screens 2 | 3 | // MARK: AppearanceSettings 4 | "AppearanceSettings_Nav_Title" = "Appearance"; 5 | "AppearanceSettings_Picker_Light" = "Light"; 6 | "AppearanceSettings_Picker_Dark" = "Dark"; 7 | "AppearanceSettings_Picker_Automatic" = "Automatic"; 8 | 9 | // MARK: Info 10 | "Info_Type_Appearance" = "Appearance"; 11 | "Info_Type_Language" = "Language"; 12 | "Info_Type_Map" = "Map"; 13 | "Info_Type_About" = "About"; 14 | "Info_Type_Staff" = "Staff"; 15 | "Info_Type_Speaker" = "Speaker"; 16 | "Info_Type_Blog" = "Blog"; 17 | "Info_Type_Source" = "Source code"; 18 | "Info_Type_Privacy" = "Privacy Policy"; 19 | "Info_Type_License" = "License"; 20 | "Info_Nav_Title" = "Infomation"; 21 | "Info_Section_Setting" = "Setting"; 22 | "Info_Section_Infomation" = "Infomation"; 23 | 24 | // MARK: Session 25 | "Session_Row_Tag_Track" = "Track"; 26 | "Session_Row_Tag_Sponsor" = "Sponsor"; 27 | "Session_Row_Tag_LT" = "LT"; 28 | 29 | // MARK: SessionList 30 | "SessionList_Search_Placeholder" = "Title, Description, Speaker"; 31 | 32 | // MARK: UserList 33 | "UserList_Nav_Title_Staff" = "Staff"; 34 | "UserList_Nav_Title_Speaker" = "Speaker"; 35 | 36 | // MARK: StaffType 37 | "StaffType_Name_Core" = "Core"; 38 | "StaffType_Name_Temporary" = "Temporary"; 39 | "StaffType_Name_Network" = "Network"; 40 | "StaffType_Title_Staff" = "Staff"; 41 | 42 | // MARK: - Views 43 | "EmptyView_Label_Text" = "No matching session found."; 44 | 45 | -------------------------------------------------------------------------------- /App/Resources/Localizebles/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | // MARK: - Screens 2 | 3 | // MARK: AppearanceSettings 4 | "AppearanceSettings_Nav_Title" = "外観"; 5 | "AppearanceSettings_Picker_Light" = "ライト"; 6 | "AppearanceSettings_Picker_Dark" = "ダーク"; 7 | "AppearanceSettings_Picker_Automatic" = "自動"; 8 | 9 | // MARK: Info 10 | "Info_Type_Appearance" = "外観"; 11 | "Info_Type_Language" = "言語"; 12 | "Info_Type_About" = "iOSDC について"; 13 | "Info_Type_Map" = "マップ"; 14 | "Info_Type_Staff" = "スタッフ"; 15 | "Info_Type_Speaker" = "スピーカー"; 16 | "Info_Type_Blog" = "ブログ"; 17 | "Info_Type_Source" = "ソースコード"; 18 | "Info_Type_Privacy" = "プライバシーポリシー"; 19 | "Info_Type_License" = "ライセンス"; 20 | "Info_Nav_Title" = "情報"; 21 | "Info_Section_Setting" = "設定"; 22 | "Info_Section_Infomation" = "情報"; 23 | 24 | // MARK: Session 25 | "Session_Row_Tag_Track" = "トラック"; 26 | "Session_Row_Tag_Sponsor" = "スポンサー"; 27 | "Session_Row_Tag_LT" = "LT"; 28 | 29 | // MARK: SessionList 30 | "SessionList_Search_Placeholder" = "タイトル、説明、登壇者"; 31 | 32 | // MARK: UserList 33 | "UserList_Nav_Title_Staff" = "スタッフ"; 34 | "UserList_Nav_Title_Speaker" = "スピーカー"; 35 | 36 | // MARK: StaffType 37 | "StaffType_Name_Core" = "コア"; 38 | "StaffType_Name_Temporary" = "当日"; 39 | "StaffType_Name_Network" = "ネットワーク"; 40 | "StaffType_Title_Staff" = "スタッフ"; 41 | 42 | // MARK: - Views 43 | "EmptyView_Label_Text" = "該当するセッションが見つかりませんでした。"; 44 | -------------------------------------------------------------------------------- /App/Resources/SwiftGen/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/App/Resources/SwiftGen/.gitkeep -------------------------------------------------------------------------------- /App/Screens/AppearanceSettings/AppearanceSettingsEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct AppearanceSettingsEnvironment: DynamicProperty { 5 | } 6 | -------------------------------------------------------------------------------- /App/Screens/AppearanceSettings/AppearanceSettingsView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct AppearanceSettingsView: View { 5 | @ObservedObject var viewModel: AppearanceSettingsViewModel 6 | let environment: AppearanceSettingsEnvironment 7 | 8 | var body: some View { 9 | List { 10 | Picker(selection: $viewModel.binding.appearanceMode) { 11 | Text(L10n.appearanceSettingsPickerLight).tag(AppearanceMode.light) 12 | Text(L10n.appearanceSettingsPickerDark).tag(AppearanceMode.dark) 13 | Text(L10n.appearanceSettingsPickerAutomatic).tag(AppearanceMode.auto) 14 | } label: { 15 | // NOP 16 | }.pickerStyle(.inline) 17 | } 18 | .navigationBarTitle(L10n.appearanceSettingsNavTitle, displayMode: .inline) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /App/Screens/AppearanceSettings/AppearanceSettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | import Combine 4 | import CombineStorable 5 | 6 | // MARK: - ViewModel 7 | final class AppearanceSettingsViewModel: NSObject, Storable, ObservableObject { 8 | let input: Input 9 | let output: Output 10 | @ObservedObject var binding: Binding 11 | 12 | init( 13 | input: Input = .init(), 14 | output: Output = .init(), 15 | binding: Binding = .init() 16 | ) { 17 | self.input = input 18 | self.output = output 19 | self.binding = binding 20 | super.init() 21 | bind(input: input, output: output, binding: binding) 22 | } 23 | } 24 | 25 | // MARK: - Property 26 | extension AppearanceSettingsViewModel { 27 | 28 | final class Input { 29 | init() {} 30 | } 31 | 32 | final class Output { 33 | init() {} 34 | } 35 | 36 | final class Binding: ObservableObject { 37 | @AppStorage var appearanceMode: AppearanceMode 38 | 39 | init( 40 | appearanceMode: AppearanceMode = .default, 41 | userDefaults: UserDefaults = UserDefaults.standard 42 | ) { 43 | self._appearanceMode = AppStorage( 44 | wrappedValue: appearanceMode, 45 | .appearanceMode, 46 | store: userDefaults 47 | ) 48 | } 49 | } 50 | } 51 | 52 | // MARK: - Private 53 | private extension AppearanceSettingsViewModel { 54 | 55 | func bind(input: Input, output: Output, binding: Binding) { 56 | // 親孫でのbindを可能にする 57 | binding.objectWillChange 58 | .sink { [weak self] _ in 59 | self?.objectWillChange.send() 60 | } 61 | .store(in: &cancellables) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /App/Screens/AppearanceSettings/Models/AppearanceMode.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Type 4 | enum AppearanceMode: Int { 5 | case light 6 | case dark 7 | case auto 8 | 9 | static var `default`: Self = .dark 10 | } 11 | 12 | extension AppearanceMode { 13 | var colorScheme: ColorScheme? { 14 | switch self { 15 | case .light: 16 | return .light 17 | case .dark: 18 | return .dark 19 | case .auto: 20 | return nil 21 | } 22 | } 23 | } 24 | 25 | // MARK: - Optional Extension 26 | extension Optional where Wrapped == ColorScheme { 27 | var appearanceMode: AppearanceMode { 28 | switch self { 29 | case .light: 30 | return .light 31 | case .dark: 32 | return .dark 33 | default: 34 | return .auto 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /App/Screens/Info/InfoEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct InfoEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | @Environment(\.dismiss) var dismiss 7 | } 8 | -------------------------------------------------------------------------------- /App/Screens/Info/InfoView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import SwiftUIWorkaround 3 | 4 | // MARK: - View 5 | struct InfoView: View { 6 | @ObservedObject var viewModel: InfoViewModel 7 | let environment: InfoEnvironment 8 | 9 | var body: some View { 10 | NavigationView { 11 | ScrollView { infoListView } 12 | .toolbar { closeToolbarContent } 13 | .frame(maxWidth: .infinity) 14 | .navigationBarTitle("", displayMode: .inline) 15 | } 16 | .onReceive(viewModel.output.openSns) { 17 | environment.router.routeToWeb(with: $0) 18 | } 19 | .onReceive(viewModel.output.dismissView) { 20 | environment.dismiss() 21 | } 22 | .accentColor(.gray) 23 | .workaround.preferredAppearanceMode(viewModel.binding.$appearanceMode) 24 | } 25 | } 26 | 27 | // MARK: - Private View 28 | private extension InfoView { 29 | 30 | var infoListView: some View { 31 | Group { 32 | settingListView 33 | infomationListView 34 | Spacer() 35 | } 36 | .padding() 37 | } 38 | 39 | var settingListView: some View { 40 | LazyVStack(spacing: 8) { 41 | InfoSection(title: L10n.infoSectionSetting) 42 | 43 | InfoNavigationRow( 44 | type: .appearance, 45 | destination: appearanceView 46 | ) 47 | InfoButtonRow( 48 | type: .language, 49 | action: { viewModel.input.didTapButton.send(.language) } 50 | ) 51 | } 52 | } 53 | 54 | var infomationListView: some View { 55 | LazyVStack(spacing: 8) { 56 | InfoSection(title: L10n.infoSectionInfomation) 57 | 58 | InfoButtonRow( 59 | type: .about, 60 | action: { viewModel.input.didTapButton.send(.about) } 61 | ) 62 | InfoNavigationRow( 63 | type: .map, 64 | destination: mapView 65 | ) 66 | InfoNavigationRow( 67 | type: .staff, 68 | destination: staffTypeView 69 | ) 70 | InfoNavigationRow( 71 | type: .speaker, 72 | destination: speakerListView 73 | ) 74 | InfoButtonRow( 75 | type: .blog, 76 | action: { viewModel.input.didTapButton.send(.blog) } 77 | ) 78 | InfoButtonRow( 79 | type: .code, 80 | action: { viewModel.input.didTapButton.send(.code) } 81 | ) 82 | InfoButtonRow( 83 | type: .privacyPolicy, 84 | action: { viewModel.input.didTapButton.send(.privacyPolicy) } 85 | ) 86 | InfoNavigationRow( 87 | type: .license, 88 | destination: licenseView 89 | ) 90 | } 91 | } 92 | 93 | var appearanceView: AppearanceSettingsView { 94 | environment.router.routeToAppearanceSettings() 95 | } 96 | 97 | var mapView: MapView { 98 | environment.router.routeToMap() 99 | } 100 | 101 | var staffTypeView: StaffTypeView { 102 | environment.router.routeToStaffType() 103 | } 104 | 105 | var speakerListView: UserListView { 106 | environment.router.routeToUserList( 107 | with: SessionUserType.allCases.map(\.user).sorted { $0.name < $1.name } 108 | ) 109 | } 110 | 111 | var licenseView: LicenseView { 112 | environment.router.routeToLicense() 113 | } 114 | 115 | var closeToolbarContent: CloseToolbarContent { 116 | .init { 117 | viewModel.input.didTapClose.send(()) 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /App/Screens/Info/InfoViewModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Combine 3 | import CombineStorable 4 | 5 | // MARK: - ViewModel 6 | final class InfoViewModel: NSObject, Storable, ObservableObject { 7 | 8 | let input: Input 9 | let output: Output 10 | @ObservedObject var binding: Binding 11 | 12 | init( 13 | input: Input = .init(), 14 | output: Output = .init(), 15 | binding: Binding = .init() 16 | ) { 17 | self.input = input 18 | self.output = output 19 | self.binding = binding 20 | super.init() 21 | bind(input: input, output: output, binding: binding) 22 | } 23 | } 24 | 25 | // MARK: - Property 26 | extension InfoViewModel { 27 | 28 | final class Input { 29 | let didTapButton: PassthroughSubject 30 | let didTapClose: PassthroughSubject 31 | 32 | init( 33 | didTapButton: PassthroughSubject = .init(), 34 | didTapClose: PassthroughSubject = .init() 35 | ) { 36 | self.didTapButton = didTapButton 37 | self.didTapClose = didTapClose 38 | } 39 | } 40 | 41 | final class Output { 42 | let openSns: PassthroughSubject 43 | let dismissView: PassthroughSubject 44 | 45 | init( 46 | openSns: PassthroughSubject = .init(), 47 | dismissView: PassthroughSubject = .init() 48 | ) { 49 | self.openSns = openSns 50 | self.dismissView = dismissView 51 | } 52 | } 53 | 54 | final class Binding: ObservableObject { 55 | @AppStorage var appearanceMode: AppearanceMode 56 | 57 | init( 58 | appearanceMode: AppearanceMode = .default, 59 | userDefaults: UserDefaults = UserDefaults.standard 60 | ) { 61 | self._appearanceMode = AppStorage( 62 | wrappedValue: appearanceMode, 63 | .appearanceMode, 64 | store: userDefaults 65 | ) 66 | } 67 | } 68 | } 69 | 70 | // MARK: - Private 71 | private extension InfoViewModel { 72 | 73 | func bind(input: Input, output: Output, binding: Binding) { 74 | // 親孫でのbindを可能にする 75 | binding.objectWillChange 76 | .sink { [weak self] _ in 77 | self?.objectWillChange.send() 78 | } 79 | .store(in: &cancellables) 80 | 81 | input 82 | .didTapButton 83 | .compactMap { $0.url } 84 | .compactMap { URL(string: "\($0)") } 85 | .sink { output.openSns.send($0) } 86 | .store(in: &cancellables) 87 | 88 | input 89 | .didTapClose 90 | .sink { output.dismissView.send($0) } 91 | .store(in: &cancellables) 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /App/Screens/Info/Models/InfoType.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Type 4 | enum InfoType { 5 | case appearance, language 6 | case about, map, staff, speaker, blog, code, privacyPolicy, license 7 | 8 | var label: String { 9 | switch self { 10 | case .appearance: return L10n.infoTypeAppearance 11 | case .language: return L10n.infoTypeLanguage 12 | case .map: return L10n.infoTypeMap 13 | case .about: return L10n.infoTypeAbout 14 | case .staff: return L10n.infoTypeStaff 15 | case .speaker: return L10n.infoTypeSpeaker 16 | case .blog: return L10n.infoTypeBlog 17 | case .code: return L10n.infoTypeSource 18 | case .privacyPolicy: return L10n.infoTypePrivacy 19 | case .license: return L10n.infoTypeLicense 20 | } 21 | } 22 | 23 | var icon: String { 24 | switch self { 25 | case .appearance: return "moon.circle" 26 | case .language: return "character.book.closed.hi" 27 | case .map: return "mappin.and.ellipse" 28 | case .about: return "smiley" 29 | case .staff: return "person.crop.rectangle.stack" 30 | case .speaker: return "swift" 31 | case .blog: return "magazine" 32 | case .code: return "ellipsis.curlybraces" 33 | case .privacyPolicy: return "eye" 34 | case .license: return "list.bullet.rectangle" 35 | } 36 | } 37 | 38 | var url: String? { 39 | switch self { 40 | case .appearance: return nil 41 | case .language: return UIApplication.openSettingsURLString 42 | case .map: return nil 43 | case .about: return Constants.iosdcUrl 44 | case .staff: return nil 45 | case .speaker: return nil 46 | case .blog: return Constants.blogUrl 47 | case .code: return Constants.github 48 | case .privacyPolicy: return Constants.privacyPolicyUrl 49 | case .license: return nil 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /App/Screens/Info/Views/InfoButtonRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Button 4 | struct InfoButtonRow: View { 5 | let type: InfoType 6 | let action: () -> Void 7 | 8 | var body: some View { 9 | Button(action: action) { 10 | InfoRowContent(type: type) 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /App/Screens/Info/Views/InfoNavigationRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - NavigationLink 4 | struct InfoNavigationRow: View { 5 | let type: InfoType 6 | let destination: Destination 7 | 8 | var body: some View { 9 | NavigationLink( 10 | destination: destination, 11 | label: { InfoRowContent(type: type) } 12 | ) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /App/Screens/Info/Views/InfoRowContent.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Row Content 4 | struct InfoRowContent: View { 5 | let type: InfoType 6 | 7 | var body: some View { 8 | HStack(spacing: 12) { 9 | Image(systemName: type.icon) 10 | .frame(width: 24, height: 24) 11 | Text(type.label) 12 | .font(.title2) 13 | Spacer() 14 | } 15 | .frame(maxWidth: .infinity) 16 | .padding(.all, 16) 17 | .background(Color.secondarySystemBackground) 18 | .cornerRadius(12) 19 | .foregroundColor(.primary) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /App/Screens/Info/Views/InfoSection.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct InfoSection: View { 5 | let title: String 6 | 7 | var body: some View { 8 | HStack(spacing: 8) { 9 | Text(title) 10 | .padding(.top, 16) 11 | .foregroundColor(.gray) 12 | Spacer() 13 | } 14 | .padding([.leading, .trailing], 16) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /App/Screens/License/LicenseEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct LicenseEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | } 7 | -------------------------------------------------------------------------------- /App/Screens/License/LicenseView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct LicenseView: View { 5 | @ObservedObject var viewModel: LicenseViewModel 6 | let environment: LicenseEnvironment 7 | 8 | var body: some View { 9 | List(viewModel.output.models, id: \.id) { 10 | NavigationRow( 11 | name: $0.name, 12 | destination: environment.router.routeToLicenseDetail(with: $0) 13 | ) 14 | } 15 | .navigationBarTitle(L10n.infoTypeLicense, displayMode: .inline) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /App/Screens/License/LicenseViewModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Foundation 3 | import Combine 4 | import CombineStorable 5 | 6 | // MARK: - ViewModel 7 | final class LicenseViewModel: NSObject, ObservableObject, Storable { 8 | let input: Input 9 | let output: Output 10 | @ObservedObject var binding: Binding 11 | 12 | init( 13 | input: Input = .init(), 14 | output: Output = .init(), 15 | binding: Binding = .init() 16 | ) { 17 | self.input = input 18 | self.output = output 19 | self.binding = binding 20 | super.init() 21 | bind(input: input, output: output, binding: binding) 22 | } 23 | } 24 | 25 | // MARK: - Property 26 | extension LicenseViewModel { 27 | 28 | final class Input { 29 | // NOP 30 | } 31 | 32 | final class Output: ObservableObject { 33 | // fixme: update stencil 34 | let models: [LicenseModel] = [ 35 | LicenseModel(name: PlistFiles.CombineStorable.name, plist: PlistFiles.CombineStorable.preferenceSpecifiers), 36 | LicenseModel(name: PlistFiles.PlaygroundTester.name, plist: PlistFiles.PlaygroundTester.preferenceSpecifiers), 37 | LicenseModel(name: PlistFiles.SwiftUIWorkaround.name, plist: PlistFiles.SwiftUIWorkaround.preferenceSpecifiers) 38 | ] 39 | } 40 | 41 | final class Binding: ObservableObject { 42 | // NOP 43 | } 44 | } 45 | 46 | 47 | // MARK: - Private 48 | private extension LicenseViewModel { 49 | 50 | func bind(input: Input, output: Output, binding: Binding) { 51 | // 親孫でのbindを可能にする 52 | binding.objectWillChange 53 | .sink { [weak self] _ in 54 | self?.objectWillChange.send() 55 | } 56 | .store(in: &cancellables) 57 | } 58 | } 59 | 60 | -------------------------------------------------------------------------------- /App/Screens/License/Models/LicenseModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Model 4 | final class LicenseModel { 5 | let name: String 6 | let description: String 7 | 8 | init( 9 | name: String, 10 | plist: [[String: Any]] 11 | ) { 12 | self.name = name.replaceExtension 13 | self.description = plist.compactMap { 14 | $0["FooterText"] as? String 15 | }.first ?? "" 16 | } 17 | } 18 | 19 | // MARK: - Identifiable 20 | extension LicenseModel: Identifiable { 21 | var id: UUID { UUID() } 22 | } 23 | 24 | /* fixme: いずれ stenceil ファイル側で制御する */ 25 | private extension String { 26 | 27 | var replaceExtension: String { 28 | replacingOccurrences(of: ".plist", with: "") 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /App/Screens/LicenseDetail/LicenseDetailView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct LicenseDetailView: View { 5 | @ObservedObject var viewModel: LicenseDetailViewModel 6 | 7 | var body: some View { 8 | ScrollView { 9 | Text(viewModel.output.model.description) 10 | .padding() 11 | } 12 | .navigationBarTitle(viewModel.output.model.name, displayMode: .inline) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /App/Screens/LicenseDetail/LicenseDetailViewModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Foundation 3 | import Combine 4 | import CombineStorable 5 | 6 | 7 | // MARK: - ViewModel 8 | final class LicenseDetailViewModel: NSObject, ObservableObject, Storable { 9 | let input: Input 10 | let output: Output 11 | @ObservedObject var binding: Binding 12 | 13 | init( 14 | input: Input = .init(), 15 | output: Output = .init(), 16 | binding: Binding = .init() 17 | ) { 18 | self.input = input 19 | self.output = output 20 | self.binding = binding 21 | super.init() 22 | } 23 | } 24 | 25 | // MARK: - Property 26 | extension LicenseDetailViewModel { 27 | 28 | final class Input { 29 | // NOP 30 | } 31 | 32 | final class Output: ObservableObject { 33 | let model: LicenseModel 34 | 35 | init(model: LicenseModel = .init(name: "", plist: [])) { 36 | self.model = model 37 | } 38 | } 39 | 40 | final class Binding: ObservableObject { 41 | // NOP 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /App/Screens/MainApp.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import PlaygroundTester 3 | 4 | // MARK: - APP 5 | @main 6 | struct MainApp: App { 7 | 8 | // MARK: Property 9 | 10 | @Environment(\.router) private var router 11 | 12 | // MARK: Initializer 13 | 14 | init() { 15 | PlaygroundTester.PlaygroundTesterConfiguration.isTesting = false 16 | } 17 | 18 | // MARK: View 19 | 20 | var body: some Scene { 21 | WindowGroup { 22 | PlaygroundTester.PlaygroundTesterWrapperView { 23 | router.routeToRoot() 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /App/Screens/Map/MapView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct MapView: View { 5 | @ObservedObject var viewModel: MapViewModel 6 | 7 | var body: some View { 8 | ZStack { 9 | Color(uiColor: .systemBackground) 10 | 11 | VStack { 12 | mapUniversityImage 13 | mapFloorImage 14 | } 15 | .frame(maxWidth: 672, alignment: .center) // iPad readable width 16 | .offset(viewModel.binding.offset) 17 | .scaleEffect(viewModel.binding.scale) 18 | .gesture(SimultaneousGesture(magnificationGesture, dragGesture)) 19 | } 20 | .clipped() 21 | .onDisappear { viewModel.input.didDisappear.send(()) } 22 | .navigationBarTitle(L10n.infoTypeMap, displayMode: .inline) 23 | } 24 | } 25 | 26 | // MARK: - Private 27 | private extension MapView { 28 | 29 | var mapUniversityImage: some View { 30 | Asset.mapUniversity.swiftUIImage 31 | .resizable() 32 | .aspectRatio(contentMode: .fit) 33 | } 34 | 35 | var mapFloorImage: some View { 36 | Asset.mapFloor.swiftUIImage 37 | .resizable() 38 | .aspectRatio(contentMode: .fit) 39 | } 40 | 41 | var magnificationGesture: some Gesture { 42 | MagnificationGesture() 43 | .onChanged { viewModel.input.didChangeImageMagnification.send($0) } 44 | .onEnded { viewModel.input.didEndImageMagnification.send($0) } 45 | } 46 | 47 | var dragGesture: some Gesture { 48 | DragGesture() 49 | .onChanged { viewModel.input.didChangeImageOffset.send($0.translation) } 50 | .onEnded{ viewModel.input.didEndImageOffset.send($0.translation) } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /App/Screens/Root/Models/ScheduleType.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Type 4 | enum ScheduleType: Int, CaseIterable { 5 | case day0, day1, day2 6 | 7 | var icon: String { 8 | switch self { 9 | case .day0: return "square.3.stack.3d.top.fill" 10 | case .day1: return "square.3.stack.3d.middle.fill" 11 | case .day2: return "square.3.stack.3d.bottom.fill" 12 | } 13 | } 14 | 15 | var day: String { 16 | switch self { 17 | case .day0: return "9/10" 18 | case .day1: return "9/11" 19 | case .day2: return "9/12" 20 | } 21 | } 22 | 23 | var sessions: [SessionType] { 24 | switch self { 25 | case .day0: return SessionDay0Type.allCases 26 | case .day1: return SessionDay1Type.allCases 27 | case .day2: return SessionDay2Type.allCases 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /App/Screens/Root/RootEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct RootEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | } 7 | -------------------------------------------------------------------------------- /App/Screens/Root/RootView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import SwiftUIWorkaround 3 | 4 | // MARK: - View 5 | struct RootView: View { 6 | @ObservedObject var viewModel: RootViewModel 7 | let environment: RootEnvironment 8 | 9 | var body: some View { 10 | TabView { tabViews } 11 | .fullScreenCover( 12 | isPresented: $viewModel.binding.isShownSessionList, 13 | onDismiss: { viewModel.input.didCloseSessionList.send(()) }, 14 | content: { environment.router.routeToSessionList() } 15 | ) 16 | .fullScreenCover( 17 | isPresented: $viewModel.binding.isShownInfo, 18 | onDismiss: { viewModel.input.didCloseInfo.send(()) }, 19 | content: { environment.router.routeToInfo() } 20 | ) 21 | .navigationViewStyle(.stack) 22 | .workaround.preferredAppearanceMode(viewModel.binding.$appearanceMode) 23 | } 24 | } 25 | 26 | // MARK: - Private 27 | private extension RootView { 28 | 29 | var tabViews: some View { 30 | ForEach(ScheduleType.allCases, id: \.rawValue) { scheduleType in 31 | NavigationView { 32 | environment.router.routeToSession(with: scheduleType) 33 | .toolbar { rootToolbarContent } 34 | .navigationBarTitle("iOSDC Japan 2022", displayMode: .inline) 35 | } 36 | .tabItem { scheduleTabItem(scheduleType) } 37 | } 38 | } 39 | 40 | func scheduleTabItem(_ scheduleType: ScheduleType) -> some View { 41 | VStack(spacing: 0) { 42 | Image(systemName: scheduleType.icon) 43 | Text(scheduleType.day) 44 | } 45 | } 46 | 47 | var rootToolbarContent: some ToolbarContent { 48 | RootToolbarContent( 49 | leadingContent: { leadingBarItem }, 50 | trailingContent: { trailingBarItem } 51 | ) 52 | } 53 | 54 | var leadingBarItem: some View { 55 | Button(action: { 56 | viewModel.binding.isShownSessionList = true 57 | }) { 58 | Image(systemName: "magnifyingglass") 59 | } 60 | } 61 | 62 | var trailingBarItem: some View { 63 | Button(action: { 64 | viewModel.binding.isShownInfo = true 65 | }) { 66 | Image(systemName: "info.circle") 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /App/Screens/Root/RootViewModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Foundation 3 | import Combine 4 | import CombineStorable 5 | 6 | // MARK: - ViewModel 7 | final class RootViewModel: NSObject, ObservableObject, Storable { 8 | 9 | let input: Input 10 | let output: Output 11 | @ObservedObject var binding: Binding 12 | 13 | init( 14 | input: Input = .init(), 15 | output: Output = .init(), 16 | binding: Binding = .init() 17 | ) { 18 | self.input = input 19 | self.output = output 20 | self.binding = binding 21 | super.init() 22 | bind(input: input, output: output, binding: binding) 23 | } 24 | } 25 | 26 | // MARK: - Property 27 | extension RootViewModel { 28 | 29 | final class Input { 30 | let didCloseSessionList: PassthroughSubject<(), Never> 31 | let didCloseInfo: PassthroughSubject<(), Never> 32 | 33 | init( 34 | didCloseSessionList: PassthroughSubject<(), Never> = .init(), 35 | didCloseInfo: PassthroughSubject<(), Never> = .init() 36 | ) { 37 | self.didCloseSessionList = didCloseSessionList 38 | self.didCloseInfo = didCloseInfo 39 | } 40 | } 41 | 42 | final class Output: ObservableObject { 43 | // nop 44 | } 45 | 46 | final class Binding: ObservableObject { 47 | @Published var isShownSessionList: Bool 48 | @Published var isShownInfo: Bool 49 | @AppStorage var appearanceMode: AppearanceMode 50 | 51 | init( 52 | isShownSessionList: Bool = false, 53 | isShownInfo: Bool = false, 54 | appearanceMode: AppearanceMode = .default, 55 | userDefaults: UserDefaults = UserDefaults.standard 56 | ) { 57 | self.isShownSessionList = isShownSessionList 58 | self.isShownInfo = isShownInfo 59 | self._appearanceMode = AppStorage( 60 | wrappedValue: appearanceMode, 61 | .appearanceMode, 62 | store: userDefaults 63 | ) 64 | } 65 | } 66 | } 67 | 68 | // MARK: - Private 69 | private extension RootViewModel { 70 | 71 | func bind(input: Input, output: Output, binding: Binding) { 72 | // 親孫でのbindを可能にする 73 | binding 74 | .objectWillChange 75 | .sink { [weak self] _ in 76 | self?.objectWillChange.send() 77 | } 78 | .store(in: &cancellables) 79 | 80 | input 81 | .didCloseSessionList 82 | .sink { binding.isShownSessionList = false } 83 | .store(in: &cancellables) 84 | 85 | input 86 | .didCloseInfo 87 | .sink { binding.isShownInfo = false } 88 | .store(in: &cancellables) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /App/Screens/Root/Views/RootToolbarContent.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - ToolbarContent 4 | struct RootToolbarContent: ToolbarContent { 5 | @ViewBuilder let leadingContent: () -> L 6 | @ViewBuilder let trailingContent: () -> R 7 | 8 | var body: some ToolbarContent { 9 | ToolbarItem(placement: .navigationBarLeading, content: leadingContent) 10 | ToolbarItem(placement: .navigationBarTrailing, content: trailingContent) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /App/Screens/Session/Models/SessionModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Model 4 | struct SessionModel: Identifiable { 5 | let id: UUID 6 | let track: TrackType 7 | let title: String 8 | let description: String? 9 | let user: SessionUser? 10 | let archiveParameter: String? 11 | let isSponsor: Bool 12 | let isLT: Bool 13 | 14 | init( 15 | id: UUID = .init(), 16 | track: TrackType, 17 | title: String, 18 | description: String? = nil, 19 | user: SessionUser? = nil, 20 | archiveParameter: String? = nil, 21 | isSponsor: Bool = false, 22 | isLT: Bool = false 23 | ) { 24 | self.id = id 25 | self.track = track 26 | self.title = title 27 | self.description = description 28 | self.user = user 29 | self.archiveParameter = archiveParameter 30 | self.isSponsor = isSponsor 31 | self.isLT = isLT 32 | } 33 | } 34 | 35 | // MARK: - Internal 36 | extension SessionModel { 37 | 38 | func contains(query: String) -> Bool { 39 | title.lowercased().contains(query.lowercased()) 40 | || (description?.lowercased() ?? "").contains(query.lowercased()) 41 | || (user?.name.lowercased() ?? "").contains(query.lowercased()) 42 | || (user?.twAccount?.lowercased() ?? "").contains(query.lowercased()) 43 | } 44 | } 45 | 46 | // MARK: - SessionListRowTitleLabel & SessionListRowBodyLabel 47 | extension SessionModel { 48 | 49 | private var highlightTextColor: AttributeScopes.SwiftUIAttributes.ForegroundColorAttribute.Value { 50 | .blue 51 | } 52 | 53 | func attributedText(with text: String, and highlightText: String) -> AttributedString { 54 | var attributedText = AttributedString(text) 55 | let lowercasedAttributedText = AttributedString(text.lowercased()) 56 | if let range = lowercasedAttributedText.range(of: highlightText.lowercased()) { 57 | attributedText[range].foregroundColor = highlightTextColor 58 | } 59 | return attributedText 60 | } 61 | 62 | func attributedTitleText(with highlightText: String) -> AttributedString { 63 | attributedText(with: title, and: highlightText) 64 | } 65 | 66 | func attributedBodyText(with highlightText: String) -> AttributedString? { 67 | guard let bodyText = description else { return nil } 68 | 69 | var attributedLines: [AttributedString] = [] 70 | bodyText.enumerateLines { line, _ in 71 | let text = attributedText(with: line, and: highlightText) 72 | attributedLines.append(text) 73 | } 74 | 75 | let firstAttributedIndex = attributedLines.firstIndex { attributedString in 76 | attributedString.runs.contains { $0.foregroundColor == highlightTextColor } 77 | } 78 | /// ハイライトテキストが存在しなければnilを返す 79 | guard let firstAttributedIndex = firstAttributedIndex else { return nil } 80 | 81 | /// 最初にハイライトする文字の前後1行づつを取り出す 82 | let lowerIndex = max(firstAttributedIndex - 1, attributedLines.startIndex) 83 | let upperIndex = min(firstAttributedIndex + 1, attributedLines.endIndex) 84 | let displayLines = attributedLines[lowerIndex.. Bool { 98 | lhs.id == rhs.id && lhs.title == rhs.title 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /App/Screens/Session/Models/TrackType.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // MARK: - Type 4 | enum TrackType: String, CaseIterable { 5 | case a, b, c, d, e 6 | 7 | var name: String { 8 | "\(L10n.sessionRowTagTrack) \(rawValue.uppercased())" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /App/Screens/Session/SessionEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct SessionEnvironment: DynamicProperty { 4 | @Environment(\.router) var router 5 | } 6 | -------------------------------------------------------------------------------- /App/Screens/Session/SessionView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import UIKit 3 | 4 | // MARK: - View 5 | struct SessionView: View { 6 | @ObservedObject var viewModel: SessionViewModel 7 | let environment: SessionEnvironment 8 | 9 | var body: some View { 10 | ScrollView { sessionList } 11 | .sheet( 12 | item: $viewModel.binding.modalModel, 13 | onDismiss: { viewModel.input.didCloseModal.send(()) }, 14 | content: { SessionSheetWrapperView(model: $0, router: environment.router) } 15 | ) 16 | } 17 | } 18 | 19 | // MARK: - Private 20 | private extension SessionView { 21 | 22 | var sessionList: some View { 23 | ForEach(viewModel.output.scheduleType.sessions, id: \.id) { type in 24 | SessionSection( 25 | isExpanded: $viewModel.binding.expandFlags[type.index], 26 | sessionType: type, 27 | didTapRow: { viewModel.input.didTapSession.send($0) } 28 | ) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /App/Screens/Session/SessionViewModel.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | import Foundation 3 | import Combine 4 | import CombineStorable 5 | 6 | // MARK: - ViewModel 7 | final class SessionViewModel: NSObject, ObservableObject, Storable { 8 | let input: Input 9 | let output: Output 10 | @ObservedObject var binding: Binding 11 | 12 | init( 13 | input: Input = .init(), 14 | output: Output, 15 | binding: Binding 16 | ) { 17 | self.input = input 18 | self.output = output 19 | self.binding = binding 20 | super.init() 21 | bind(input: input, output: output, binding: binding) 22 | } 23 | } 24 | 25 | // MARK: - Property 26 | extension SessionViewModel { 27 | 28 | final class Input { 29 | let didTapSession: PassthroughSubject 30 | let didCloseModal: PassthroughSubject<(), Never> 31 | 32 | init( 33 | didTapSession: PassthroughSubject = .init(), 34 | didCloseModal: PassthroughSubject<(), Never> = .init() 35 | ) { 36 | self.didTapSession = didTapSession 37 | self.didCloseModal = didCloseModal 38 | } 39 | } 40 | 41 | final class Output: ObservableObject { 42 | let scheduleType: ScheduleType 43 | 44 | init(scheduleType: ScheduleType) { 45 | self.scheduleType = scheduleType 46 | } 47 | } 48 | 49 | final class Binding: ObservableObject { 50 | @Published var modalModel: SessionModel? 51 | @AppStorage var expandFlags: [Bool] 52 | 53 | init( 54 | modalModel: SessionModel? = nil, 55 | scheduleType: ScheduleType, 56 | userDefaults: UserDefaults = UserDefaults.standard 57 | ) { 58 | self.modalModel = modalModel 59 | 60 | let key = "expandFlags_\(scheduleType.day)" 61 | let value = Array(repeating: true, count: scheduleType.sessions.count) 62 | self._expandFlags = AppStorage(wrappedValue: value, key, store: userDefaults) 63 | } 64 | } 65 | } 66 | 67 | // MARK: - Private 68 | private extension SessionViewModel { 69 | 70 | func bind(input: Input, output: Output, binding: Binding) { 71 | // 親孫でのbindを可能にする 72 | binding.objectWillChange 73 | .sink { [weak self] _ in 74 | self?.objectWillChange.send() 75 | } 76 | .store(in: &cancellables) 77 | 78 | input 79 | .didTapSession 80 | .sink { binding.modalModel = $0 } 81 | .store(in: &cancellables) 82 | 83 | input 84 | .didCloseModal 85 | .sink { binding.modalModel = nil } 86 | .store(in: &cancellables) 87 | } 88 | } 89 | 90 | -------------------------------------------------------------------------------- /App/Screens/Session/Views/SessionRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Row 4 | struct SessionRow: View { 5 | let model: SessionModel 6 | let didTap: () -> Void 7 | 8 | var body: some View { 9 | Button(action: didTap) { 10 | HStack { 11 | VStack(alignment: .leading, spacing: 4) { 12 | HStack(spacing: 4) { 13 | SessionRowTrackTag(name: model.track.name) 14 | SessionRowSponsorTag(isSponsor: model.isSponsor) 15 | SessionRowLtTag(isLT: model.isLT) 16 | SessionRowUserTag(user: model.user) 17 | } 18 | .padding(.bottom, 4) 19 | 20 | SessionRowTitleLabel(title: model.title) 21 | } 22 | .padding(.all, 2) 23 | 24 | Spacer() 25 | } 26 | } 27 | .padding(.all, 8) 28 | .background(Color.secondarySystemBackground) 29 | .cornerRadius(12) 30 | } 31 | } 32 | 33 | // MARK: - Track Tag 34 | struct SessionRowTrackTag: View { 35 | 36 | let name: String 37 | 38 | var body: some View { 39 | SessionTag(text: name, color: .gray) 40 | } 41 | } 42 | 43 | // MARK: - Sponsor Tag 44 | struct SessionRowSponsorTag: View { 45 | 46 | let isSponsor: Bool 47 | 48 | var body: some View { 49 | if isSponsor { 50 | SessionTag(text: L10n.sessionRowTagSponsor, color: .green) 51 | } 52 | } 53 | } 54 | 55 | // MARK: - LT Tag 56 | struct SessionRowLtTag: View { 57 | 58 | let isLT: Bool 59 | 60 | var body: some View { 61 | if isLT { 62 | SessionTag(text: L10n.sessionRowTagLT, color: .yellow) 63 | } 64 | } 65 | } 66 | 67 | // MARK: - User Tag 68 | struct SessionRowUserTag: View { 69 | 70 | let user: SessionUser? 71 | 72 | var body: some View { 73 | if let user = user { 74 | SessionTag(text: user.name, color: .blue) 75 | } 76 | } 77 | } 78 | 79 | // MARK: - Title Label 80 | private struct SessionRowTitleLabel: View { 81 | 82 | let title: String 83 | 84 | var body: some View { 85 | Text(title) 86 | .font(.body) 87 | .lineLimit(1) 88 | .foregroundColor(.primary) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /App/Screens/Session/Views/SessionSection.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Section 4 | struct SessionSection: View { 5 | @Binding var isExpanded: Bool 6 | let sessionType: SessionType 7 | let didTapRow: (SessionModel) -> Void 8 | 9 | var body: some View { 10 | DisclosureGroup(isExpanded: $isExpanded) { 11 | ForEach(sessionType.models, id: \.id) { model in 12 | SessionRow(model: model) { 13 | didTapRow(model) 14 | } 15 | } 16 | } label: { 17 | SessionSectionLabel(time: sessionType.time) 18 | } 19 | .padding(.init(top: 8, leading: 16, bottom: 4, trailing: 16)) 20 | } 21 | } 22 | 23 | // MARK: - Private View 24 | private struct SessionSectionLabel: View { 25 | let time: String 26 | 27 | var body: some View { 28 | Text(time) 29 | .font(.title2) 30 | .foregroundColor(.primary) 31 | .padding([.leading, .trailing], 8) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /App/Screens/Session/Views/SessionSheetWrapperView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - SessionSheetWrapperView 4 | struct SessionSheetWrapperView: View { 5 | let model: SessionModel? 6 | let router: RouterProtocol.Type 7 | 8 | var body: some View { 9 | if let model = model { 10 | SessionSheetView(model: model, router: router) 11 | } else { 12 | // ここを通りえないが画面として例外を用意しておく 13 | EmptyView(type: .session, size: .init(width: 360, height: 400)) 14 | } 15 | } 16 | } 17 | 18 | // MARK: - SessionSheetView 19 | private struct SessionSheetView: View { 20 | let model: SessionModel 21 | let router: RouterProtocol.Type 22 | 23 | var body: some View { 24 | NavigationView { 25 | router.routeToSessionDetail(with: model) 26 | .navigationBarTitle(model.track.name, displayMode: .inline) 27 | } 28 | .navigationViewStyle(.stack) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /App/Screens/Session/Views/SessionTag.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Tag 4 | struct SessionTag: View { 5 | let text: String 6 | let color: Color 7 | 8 | var body: some View { 9 | Text(text) 10 | .fontWeight(.semibold) 11 | .font(.caption) 12 | .foregroundColor(.white) 13 | .padding(.init(top: 2, leading: 6, bottom: 2, trailing: 6)) 14 | .background(color) 15 | .cornerRadius(12) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /App/Screens/SessionDetail/SessionDetailEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct SessionDetailEnvironment: DynamicProperty { 4 | @Environment(\.router) var router 5 | @Environment(\.dismiss) var dismiss 6 | } 7 | -------------------------------------------------------------------------------- /App/Screens/SessionDetail/SessionDetailView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct SessionDetailView: View { 5 | let viewModel: SessionDetailViewModel 6 | let environment: SessionDetailEnvironment 7 | 8 | var body: some View { 9 | ScrollView { sessionDetailList } 10 | .toolbar { closeToolbarContent } 11 | .onReceive(viewModel.output.openSns) { 12 | environment.router.routeToWeb(with: $0) 13 | } 14 | .onReceive(viewModel.output.dismissView) { 15 | environment.dismiss() 16 | } 17 | .frame(maxWidth: .infinity) 18 | } 19 | } 20 | 21 | // MARK: - Private 22 | private extension SessionDetailView { 23 | 24 | var sessionDetailList: some View { 25 | VStack(alignment: .leading, spacing: 12) { 26 | SessionDetailNameLabel( 27 | text: viewModel.output.model.title 28 | ) 29 | HStack(spacing: 16) { 30 | SessionDetailUserView( 31 | user: viewModel.output.model.user, 32 | didTapSns: { viewModel.input.didTapSns.send(()) } 33 | ) 34 | SessionDetailUserYoutubeButton( 35 | user: viewModel.output.model.user, 36 | didTap: { viewModel.input.didTapYoutube.send(()) } 37 | ) 38 | } 39 | SessionDetailDescriptionLabel( 40 | text: viewModel.output.model.description 41 | ) 42 | } 43 | .padding() 44 | } 45 | 46 | var closeToolbarContent: CloseToolbarContent { 47 | .init { 48 | viewModel.input.didTapClose.send(()) 49 | } 50 | } 51 | } 52 | 53 | // MARK: - Label 54 | private struct SessionDetailNameLabel: View { 55 | let text: String 56 | 57 | var body: some View { 58 | Text(text) 59 | .font(.title3) 60 | .frame(maxWidth: .infinity) 61 | } 62 | } 63 | 64 | // MARK: - Label 65 | private struct SessionDetailDescriptionLabel: View { 66 | let text: String? 67 | 68 | var body: some View { 69 | if let text = text { 70 | Text(text) 71 | .font(.body) 72 | .padding(.all, 16) 73 | .background(Color.secondarySystemBackground) 74 | .cornerRadius(12) 75 | } 76 | } 77 | } 78 | 79 | // MARK: - Button 80 | private struct SessionDetailUserYoutubeButton: View { 81 | let user: SessionUser? 82 | let didTap: () -> Void 83 | 84 | var body: some View { 85 | if let _ = user { 86 | Button(action: didTap) { 87 | HStack(spacing: 8) { 88 | Image("logo_youtube") 89 | .resizable() 90 | .frame(width: 28.4, height: 20) 91 | } 92 | } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /App/Screens/SessionDetail/SessionDetailViewModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SwiftUI 3 | import Combine 4 | import CombineStorable 5 | 6 | // MARK: - ViewModel 7 | final class SessionDetailViewModel: NSObject, Storable { 8 | let input: Input 9 | let output: Output 10 | 11 | init( 12 | input: Input = .init(), 13 | output: Output 14 | ) { 15 | self.input = input 16 | self.output = output 17 | super.init() 18 | bind(input: input, output: output) 19 | } 20 | } 21 | 22 | // MARK: - Property 23 | extension SessionDetailViewModel { 24 | 25 | final class Input { 26 | let didTapSns: PassthroughSubject 27 | let didTapYoutube: PassthroughSubject 28 | let didTapClose: PassthroughSubject 29 | 30 | init( 31 | didTapSns: PassthroughSubject = .init(), 32 | didTapYoutube: PassthroughSubject = .init(), 33 | didTapClose: PassthroughSubject = .init() 34 | ) { 35 | self.didTapSns = didTapSns 36 | self.didTapYoutube = didTapYoutube 37 | self.didTapClose = didTapClose 38 | } 39 | } 40 | 41 | final class Output { 42 | let model: SessionModel 43 | let openSns: PassthroughSubject 44 | let dismissView: PassthroughSubject 45 | 46 | init( 47 | model: SessionModel, 48 | openSns: PassthroughSubject = .init(), 49 | dismissView: PassthroughSubject = .init() 50 | ) { 51 | self.model = model 52 | self.openSns = openSns 53 | self.dismissView = dismissView 54 | } 55 | } 56 | } 57 | 58 | // MARK: - Private 59 | private extension SessionDetailViewModel { 60 | 61 | func bind(input: Input, output: Output) { 62 | input 63 | .didTapSns 64 | .compactMap { output.model.user?.twAccount } 65 | .compactMap { URL(string: "\(Constants.twitterBaseUrl)/\($0)") } 66 | .sink { output.openSns.send($0) } 67 | .store(in: &cancellables) 68 | 69 | input 70 | .didTapYoutube 71 | .compactMap { output.model.archiveParameter } 72 | .compactMap { URL(string: "\(Constants.youtubeBaseUrl)\($0)") } 73 | .sink { output.openSns.send($0) } 74 | .store(in: &cancellables) 75 | 76 | input 77 | .didTapClose 78 | .sink { output.dismissView.send($0) } 79 | .store(in: &cancellables) 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /App/Screens/SessionDetail/Views/SessionDetailUserView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct SessionDetailUserView: View { 5 | let user: User? 6 | let didTapSns: () -> Void 7 | 8 | var body: some View { 9 | if let user = user { 10 | HStack(spacing: 8) { 11 | SessionDetailUserImage(icon: user.icon) 12 | SessionDetailUserNameLabel(name: user.name) 13 | SessionDetailUserTwitterButton( 14 | account: user.twAccount, 15 | didTap: didTapSns 16 | ) 17 | } 18 | } 19 | } 20 | } 21 | 22 | // MARK: - Image 23 | private struct SessionDetailUserImage: View { 24 | let icon: String? 25 | 26 | var body: some View { 27 | if let img = icon { 28 | Image(img) 29 | .resizable() 30 | .frame(width: 20, height: 20) 31 | .cornerRadius(12) 32 | } else { 33 | Image(systemName: "person.circle") 34 | .resizable() 35 | .frame(width: 20, height: 20) 36 | .cornerRadius(12) 37 | } 38 | } 39 | } 40 | 41 | // MARK: - Label 42 | private struct SessionDetailUserNameLabel: View { 43 | let name: String 44 | 45 | var body: some View { 46 | Text(name) 47 | .font(.headline) 48 | .padding(.trailing, 4) 49 | } 50 | } 51 | 52 | // MARK: - Button 53 | private struct SessionDetailUserTwitterButton: View { 54 | let account: String? 55 | let didTap: () -> Void 56 | 57 | var body: some View { 58 | if let account = account { 59 | Button(action: didTap) { 60 | HStack(spacing: 8) { 61 | Image("logo_twitter") 62 | .resizable() 63 | .frame(width: 20, height: 20) 64 | Text(account) 65 | .font(.headline) 66 | .foregroundColor(.cyan) 67 | } 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /App/Screens/SessionList/SessionListEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct SessionListEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | @Environment(\.dismiss) var dismiss 7 | } 8 | -------------------------------------------------------------------------------- /App/Screens/SessionList/SessionListView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct SessionListView: View { 5 | @ObservedObject var viewModel: SessionListViewModel 6 | let environment: SessionListEnvironment 7 | 8 | var body: some View { 9 | NavigationView { 10 | sessionListWrapper 11 | .toolbar { closeToolbarContent } 12 | .frame(maxWidth: .infinity) 13 | .navigationBarTitle(Text(""), displayMode: .inline) 14 | } 15 | .searchable( 16 | text: $viewModel.binding.searchText.value, 17 | placement: .navigationBarDrawer(displayMode: .always), 18 | prompt: Text(L10n.sessionListSearchPlaceholder) 19 | ) 20 | .sheet( 21 | isPresented: $viewModel.binding.isShownModal, 22 | onDismiss: { viewModel.input.didCloseModal.send(()) }, 23 | content: { sessionSheetView } 24 | ) 25 | .onReceive(viewModel.output.dismissView) { 26 | environment.dismiss() 27 | } 28 | } 29 | } 30 | 31 | // MARK: - Private 32 | private extension SessionListView { 33 | 34 | var sessionListWrapper: some View { 35 | GeometryReader { proxy in 36 | if viewModel.binding.models.isEmpty { 37 | EmptyView(type: .session, size: proxy.size) 38 | } else { 39 | sessionList 40 | } 41 | } 42 | } 43 | 44 | var sessionList: some View { 45 | ScrollView { 46 | LazyVStack(spacing: 8) { 47 | ForEach(viewModel.binding.models, id: \.self) { model in 48 | SessionListRow( 49 | model: model, 50 | searchText: $viewModel.binding.searchText.value, 51 | didTap: { viewModel.input.didTapSession.send(model) } 52 | ) 53 | } 54 | } 55 | .padding(.all, 16) 56 | } 57 | } 58 | 59 | var closeToolbarContent: CloseToolbarContent { 60 | .init { 61 | viewModel.input.didTapClose.send(()) 62 | } 63 | } 64 | 65 | var sessionSheetView: SessionSheetWrapperView { 66 | .init(model: viewModel.output.modalModel, router: environment.router) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /App/Screens/SessionList/Views/SessionListRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Row 4 | struct SessionListRow: View { 5 | let model: SessionModel 6 | @Binding var searchText: String 7 | let didTap: () -> Void 8 | 9 | var body: some View { 10 | Button(action: didTap) { 11 | HStack { 12 | VStack(alignment: .leading, spacing: 4) { 13 | HStack(spacing: 4) { 14 | SessionRowTrackTag(name: model.track.name) 15 | SessionRowSponsorTag(isSponsor: model.isSponsor) 16 | SessionRowLtTag(isLT: model.isLT) 17 | SessionRowUserTag(user: model.user) 18 | } 19 | .padding(.bottom, 4) 20 | 21 | SessionListRowTitleLabel(text: model.attributedTitleText(with: searchText)) 22 | SessionListRowBodyLabel(text: model.attributedBodyText(with: searchText)) 23 | } 24 | .padding(.all, 2) 25 | 26 | Spacer() 27 | } 28 | } 29 | .padding(.all, 8) 30 | .background(Color.secondarySystemBackground) 31 | .cornerRadius(12) 32 | } 33 | } 34 | 35 | // MARK: - Title Label 36 | private struct SessionListRowTitleLabel: View { 37 | let text: AttributedString 38 | 39 | var body: some View { 40 | Text(text) 41 | .font(.headline) 42 | .foregroundColor(.primary) 43 | .multilineTextAlignment(.leading) 44 | } 45 | } 46 | 47 | // MARK: - Body Label 48 | private struct SessionListRowBodyLabel: View { 49 | let text: AttributedString? 50 | 51 | var body: some View { 52 | if let attributedText = text { 53 | Text(attributedText) 54 | .font(.body) 55 | .foregroundColor(.primary) 56 | .multilineTextAlignment(.leading) 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /App/Screens/StaffType/Models/StaffType.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Type 4 | enum StaffType: Int, CaseIterable { 5 | case core, temporary, network 6 | 7 | private var name: String { 8 | switch self { 9 | case .core: return L10n.staffTypeNameCore 10 | case .temporary: return L10n.staffTypeNameTemporary 11 | case .network: return L10n.staffTypeNameNetwork 12 | } 13 | } 14 | 15 | var title: String { 16 | "\(name)\(L10n.staffTypeTitleStaff)" 17 | } 18 | 19 | var users: [User] { 20 | switch self { 21 | case .core: 22 | return CoreStaffUserType.allCases.map(\.user) 23 | case .temporary: 24 | return TemporaryStaffUserType.allCases.map(\.user).sorted { $0.name < $1.name } 25 | case .network: 26 | return NetworkStaffUserType.allCases.map(\.user).sorted { $0.name < $1.name } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /App/Screens/StaffType/StaffTypeEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct StaffTypeEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | } 7 | -------------------------------------------------------------------------------- /App/Screens/StaffType/StaffTypeView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct StaffTypeView: View { 5 | let environment: StaffTypeEnvironment 6 | 7 | var body: some View { 8 | List(StaffType.allCases, id: \.rawValue) { 9 | NavigationRow( 10 | name: $0.title, 11 | destination: environment.router.routeToUserList(with: $0.users) 12 | ) 13 | } 14 | .navigationBarTitle(L10n.userListNavTitleStaff, displayMode: .inline) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /App/Screens/UserList/UserListEnvironment.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Environment 4 | struct UserListEnvironment: DynamicProperty { 5 | @Environment(\.router) var router 6 | } 7 | -------------------------------------------------------------------------------- /App/Screens/UserList/UserListView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct UserListView: View { 5 | @ObservedObject var viewModel: UserListViewModel 6 | let environment: UserListEnvironment 7 | 8 | var body: some View { 9 | ScrollView { userList } 10 | .frame(maxWidth: .infinity) 11 | .navigationBarTitle(" ", displayMode: .inline) 12 | .onReceive(viewModel.output.openSns) { 13 | environment.router.routeToWeb(with: $0) 14 | } 15 | } 16 | } 17 | 18 | // MARK: - Private 19 | private extension UserListView { 20 | 21 | var userList: some View { 22 | LazyVStack(spacing: 0) { 23 | ForEach(viewModel.output.models, id: \.name) { user in 24 | HStack { 25 | UserListRow( 26 | user: user, 27 | didTap: { viewModel.input.didTapSns.send(user) } 28 | ) 29 | Spacer() 30 | } 31 | .padding(.all, 4) 32 | .background(Color.secondarySystemBackground) 33 | .cornerRadius(12) 34 | } 35 | .padding([.top, .bottom], 4) 36 | } 37 | .padding(.all, 16) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /App/Screens/UserList/UserListViewModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Combine 3 | import CombineStorable 4 | 5 | // MARK: - ViewModel 6 | final class UserListViewModel: NSObject, Storable, ObservableObject { 7 | 8 | let input: Input 9 | let output: Output 10 | 11 | init( 12 | input: Input = .init(), 13 | output: Output 14 | ) { 15 | self.input = input 16 | self.output = output 17 | super.init() 18 | bind(input: input, output: output) 19 | } 20 | } 21 | 22 | // MARK: - Property 23 | extension UserListViewModel { 24 | 25 | final class Input { 26 | let didTapSns: PassthroughSubject 27 | 28 | init(didTapSns: PassthroughSubject = .init()) { 29 | self.didTapSns = didTapSns 30 | } 31 | } 32 | 33 | final class Output { 34 | let models: [User] 35 | let openSns: PassthroughSubject 36 | 37 | init( 38 | models: [User], 39 | openSns: PassthroughSubject = .init() 40 | ) { 41 | self.models = models 42 | self.openSns = openSns 43 | } 44 | } 45 | } 46 | 47 | // MARK: - Private 48 | private extension UserListViewModel { 49 | 50 | func bind(input: Input, output: Output) { 51 | input 52 | .didTapSns 53 | .compactMap { $0?.twAccount } 54 | .compactMap { URL(string: "\(Constants.twitterBaseUrl)/\($0)") } 55 | .sink { output.openSns.send($0) } 56 | .store(in: &cancellables) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /App/Screens/UserList/Views/UserListRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Row 4 | struct UserListRow: View { 5 | let user: User 6 | let didTap: () -> Void 7 | 8 | var body: some View { 9 | SessionDetailUserView( 10 | user: user, 11 | didTapSns: didTap 12 | ) 13 | .padding([.leading, .trailing], 8) 14 | .frame(height: 40) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /App/Views/CloseToolbarContent.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - ToolbarContent 4 | struct CloseToolbarContent: ToolbarContent { 5 | let didTapClose: () -> Void 6 | 7 | var body: some ToolbarContent { 8 | ToolbarItem(placement: .navigationBarLeading) { 9 | Button(action: didTapClose) { 10 | Image(systemName: "xmark") 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /App/Views/EmptyView.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - View 4 | struct EmptyView: View { 5 | let type: EmptyType 6 | let size: CGSize 7 | 8 | var body: some View { 9 | VStack(alignment: .center, spacing: 16) { 10 | Spacer() 11 | Image(systemName: type.icon) 12 | .resizable() 13 | .frame(width: 60, height: 60) 14 | Text(type.text) 15 | Spacer() 16 | } 17 | .frame(width: size.width, height: size.height) 18 | } 19 | } 20 | 21 | // MARK: - Type 22 | enum EmptyType { 23 | case session 24 | 25 | var icon: String { 26 | switch self { 27 | case .session: return "exclamationmark.octagon" 28 | } 29 | } 30 | 31 | var text: String { 32 | switch self { 33 | case .session: return L10n.emptyViewLabelText 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /App/Views/NavigationRow.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | // MARK: - Row 4 | struct NavigationRow: View { 5 | let name: String 6 | let destination: Destination 7 | 8 | var body: some View { 9 | NavigationLink( 10 | destination: destination, 11 | label: { label } 12 | ) 13 | } 14 | } 15 | 16 | // MARK: - Private 17 | private extension NavigationRow { 18 | 19 | var label: some View { 20 | Text(name) 21 | .foregroundColor(.primary) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /AppTest/Screens/AppearanceSettings/AppearanceSettingsViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | import PlaygroundTester 4 | import Foundation 5 | 6 | // MARK: - Test 7 | @objcMembers 8 | final class AppearanceSettingsViewModelTest: TestCase { 9 | 10 | func testAppearanceMode() { 11 | // type: .light 12 | do { 13 | let userDefaults: UserDefaults = .init(suiteName: "test_light") ?? .standard 14 | let viewModel = AppearanceSettingsViewModel(binding: .init( 15 | appearanceMode: .light, 16 | userDefaults: userDefaults 17 | )) 18 | AssertEqual(viewModel.binding.appearanceMode, other: .light) 19 | } 20 | 21 | // type: .dark 22 | do { 23 | let userDefaults: UserDefaults = .init(suiteName: "test_dark") ?? .standard 24 | let viewModel = AppearanceSettingsViewModel(binding: .init( 25 | appearanceMode: .dark, 26 | userDefaults: userDefaults 27 | )) 28 | AssertEqual(viewModel.binding.appearanceMode, other: .dark) 29 | } 30 | 31 | // type: .auto 32 | do { 33 | let userDefaults: UserDefaults = .init(suiteName: "test_auto") ?? .standard 34 | let viewModel = AppearanceSettingsViewModel(binding: .init( 35 | appearanceMode: .auto, 36 | userDefaults: userDefaults 37 | )) 38 | AssertEqual(viewModel.binding.appearanceMode, other: .auto) 39 | } 40 | } 41 | } 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /AppTest/Screens/AppearanceSettings/Models/AppearanceModeTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | import PlaygroundTester 3 | import SwiftUI 4 | 5 | // MARK: - Test 6 | @objcMembers 7 | final class AppearanceModeTest: TestCase { 8 | 9 | func testColorScheme() { 10 | AssertEqual(AppearanceMode.light.colorScheme, other: .light) 11 | AssertEqual(AppearanceMode.dark.colorScheme, other: .dark) 12 | AssertNil(AppearanceMode.auto.colorScheme) 13 | } 14 | 15 | func testAppearanceMode() { 16 | // type is .light 17 | do { 18 | var colorScheme: ColorScheme? 19 | colorScheme = .light 20 | AssertEqual(colorScheme.appearanceMode, other: .light) 21 | } 22 | 23 | // type is .dark 24 | do { 25 | var colorScheme: ColorScheme? 26 | colorScheme = .dark 27 | AssertEqual(colorScheme.appearanceMode, other: .dark) 28 | } 29 | 30 | // type is nil 31 | do { 32 | var colorScheme: ColorScheme? 33 | colorScheme = nil 34 | AssertEqual(colorScheme.appearanceMode, other: .auto) 35 | } 36 | } 37 | } 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /AppTest/Screens/Root/RootViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | /* 4 | Combineのテストが対応していないので、Expectationで代用する。 5 | */ 6 | 7 | import PlaygroundTester 8 | import Combine 9 | import Foundation 10 | 11 | // MARK: - Test 12 | @objcMembers 13 | final class RootViewModelTest: TestCase { 14 | 15 | // MARK: Property 16 | 17 | private let userDefaults: UserDefaults = .init(suiteName: "test_root") ?? .standard 18 | 19 | // MARK: Test 20 | 21 | func testDidCloseSessionList() { 22 | var cancellables: Set = [] 23 | let expectation = Expectation(name: "Wait for didCloseSessionList") 24 | let viewModel = RootViewModel(binding: .init(userDefaults: userDefaults)) 25 | 26 | viewModel.binding.isShownSessionList = true 27 | Assert(viewModel.binding.isShownSessionList) 28 | 29 | viewModel.binding.$isShownSessionList 30 | .dropFirst() 31 | .sink { flag in 32 | AssertFalse(flag) 33 | expectation.fulfill() 34 | } 35 | .store(in: &cancellables) 36 | 37 | viewModel.input.didCloseSessionList.send(()) 38 | 39 | AssertExpectations([expectation], timeout: 1) 40 | } 41 | 42 | func testDidCloseInfo() { 43 | var cancellables: Set = [] 44 | let expectation = Expectation(name: "Wait for didCloseSessionList") 45 | let viewModel = RootViewModel(binding: .init(userDefaults: userDefaults)) 46 | 47 | viewModel.binding.isShownInfo = true 48 | Assert(viewModel.binding.isShownInfo) 49 | 50 | viewModel.binding.$isShownInfo 51 | .dropFirst() 52 | .sink { flag in 53 | AssertFalse(flag) 54 | expectation.fulfill() 55 | } 56 | .store(in: &cancellables) 57 | 58 | viewModel.input.didCloseInfo.send(()) 59 | 60 | AssertExpectations([expectation], timeout: 1) 61 | } 62 | } 63 | 64 | #endif 65 | -------------------------------------------------------------------------------- /AppTest/Screens/Session/Models/SessionModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | import PlaygroundTester 4 | 5 | // MARK: - Test 6 | @objcMembers 7 | final class SessionModelTest: TestCase { 8 | 9 | func testContains() { 10 | // title 11 | do { 12 | // lower 13 | do { 14 | let model = SessionModel(track: .a, title: "test title") 15 | Assert(model.contains(query: "test")) 16 | Assert(model.contains(query: "TEST")) 17 | Assert(model.contains(query: "TEst")) 18 | AssertFalse(model.contains(query: "xxxx")) 19 | } 20 | // upper 21 | do { 22 | let model = SessionModel(track: .a, title: "TEST TITLE") 23 | Assert(model.contains(query: "test")) 24 | Assert(model.contains(query: "TEST")) 25 | Assert(model.contains(query: "TEst")) 26 | AssertFalse(model.contains(query: "xxxx")) 27 | } 28 | } 29 | 30 | // description 31 | do { 32 | // lower 33 | do { 34 | let model = SessionModel(track: .a, title: "", description: "test description") 35 | Assert(model.contains(query: "test")) 36 | Assert(model.contains(query: "TEST")) 37 | Assert(model.contains(query: "TEst")) 38 | AssertFalse(model.contains(query: "xxxx")) 39 | } 40 | // upper 41 | do { 42 | let model = SessionModel(track: .a, title: "", description: "TEST DESCRIPTION") 43 | Assert(model.contains(query: "test")) 44 | Assert(model.contains(query: "TEST")) 45 | Assert(model.contains(query: "TEst")) 46 | AssertFalse(model.contains(query: "xxxx")) 47 | } 48 | } 49 | 50 | // name 51 | do { 52 | // lower 53 | do { 54 | let model = SessionModel(track: .a, title: "", user: .init(name: "test name")) 55 | Assert(model.contains(query: "test")) 56 | Assert(model.contains(query: "TEST")) 57 | Assert(model.contains(query: "TEst")) 58 | AssertFalse(model.contains(query: "xxxx")) 59 | } 60 | // upper 61 | do { 62 | let model = SessionModel(track: .a, title: "", user: .init(name: "TEST NAME")) 63 | Assert(model.contains(query: "test")) 64 | Assert(model.contains(query: "TEST")) 65 | Assert(model.contains(query: "TEst")) 66 | AssertFalse(model.contains(query: "xxxx")) 67 | } 68 | } 69 | 70 | // description 71 | do { 72 | // lower 73 | do { 74 | let user = SessionUser(icon: nil, name: "", twAccount: "test twAccount") 75 | let model = SessionModel(track: .a, title: "", user: user) 76 | Assert(model.contains(query: "test")) 77 | Assert(model.contains(query: "TEST")) 78 | Assert(model.contains(query: "TEst")) 79 | AssertFalse(model.contains(query: "xxxx")) 80 | } 81 | // upper 82 | do { let user = SessionUser(icon: nil, name: "", twAccount: "TEST TWACCOUNT") 83 | let model = SessionModel(track: .a, title: "", user: user) 84 | Assert(model.contains(query: "test")) 85 | Assert(model.contains(query: "TEST")) 86 | Assert(model.contains(query: "TEst")) 87 | AssertFalse(model.contains(query: "xxxx")) 88 | } 89 | } 90 | } 91 | } 92 | 93 | #endif 94 | -------------------------------------------------------------------------------- /AppTest/Screens/Session/Models/TrackTypeTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | import PlaygroundTester 4 | 5 | // MARK: - Test 6 | @objcMembers 7 | final class TrackTypeTest: TestCase { 8 | 9 | func testName() { 10 | // A 11 | switch Constants.LanguageType.current { 12 | case .en: AssertEqual(TrackType.a.name, other: "Track A") 13 | case .ja: AssertEqual(TrackType.a.name, other: "トラック A") 14 | case .none: assertionFailure("non supported") 15 | } 16 | 17 | // B 18 | switch Constants.LanguageType.current { 19 | case .en: AssertEqual(TrackType.b.name, other: "Track B") 20 | case .ja: AssertEqual(TrackType.b.name, other: "トラック B") 21 | case .none: assertionFailure("non supported") 22 | } 23 | 24 | // C 25 | switch Constants.LanguageType.current { 26 | case .en: AssertEqual(TrackType.c.name, other: "Track C") 27 | case .ja: AssertEqual(TrackType.c.name, other: "トラック C") 28 | case .none: assertionFailure("non supported") 29 | } 30 | 31 | // D 32 | switch Constants.LanguageType.current { 33 | case .en: AssertEqual(TrackType.d.name, other: "Track D") 34 | case .ja: AssertEqual(TrackType.d.name, other: "トラック D") 35 | case .none: assertionFailure("non supported") 36 | } 37 | 38 | 39 | // E 40 | switch Constants.LanguageType.current { 41 | case .en: AssertEqual(TrackType.e.name, other: "Track E") 42 | case .ja: AssertEqual(TrackType.e.name, other: "トラック E") 43 | case .none: assertionFailure("non supported") 44 | } 45 | } 46 | } 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /AppTest/Screens/Session/SessionViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | /* 4 | Combineのテストが対応していないので、Expectationで代用する。 5 | */ 6 | 7 | import PlaygroundTester 8 | import Combine 9 | import Foundation 10 | 11 | // MARK: - Test 12 | @objcMembers 13 | final class SessionViewModelTest: TestCase { 14 | 15 | // MARK: Property 16 | 17 | private let userDefaults: UserDefaults = .init(suiteName: "test_session") ?? .standard 18 | 19 | // MARK: Test 20 | 21 | func testDidTapSession() { 22 | let model = SessionModel(track: .a, title: "") 23 | let viewModel = SessionViewModel( 24 | output: .init(scheduleType: .day0), 25 | binding: .init(scheduleType: .day0, userDefaults: userDefaults) 26 | ) 27 | 28 | AssertNil(viewModel.binding.modalModel) 29 | 30 | viewModel.input.didTapSession.send(model) 31 | 32 | AssertEqual(viewModel.binding.modalModel, other: model) 33 | } 34 | 35 | func testDidCloseModal() { 36 | let model = SessionModel(track: .a, title: "") 37 | let viewModel = SessionViewModel( 38 | output: .init(scheduleType: .day0), 39 | binding: .init(scheduleType: .day0, userDefaults: userDefaults) 40 | ) 41 | viewModel.binding.modalModel = model 42 | 43 | AssertNotNil(viewModel.binding.modalModel) 44 | 45 | viewModel.input.didCloseModal.send(()) 46 | 47 | AssertNil(viewModel.binding.modalModel) 48 | } 49 | } 50 | 51 | #endif 52 | -------------------------------------------------------------------------------- /AppTest/Screens/SessionDetail/SessionDetailViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | /* 4 | Combineのテストが対応していないので、Expectationで代用する。 5 | */ 6 | 7 | import PlaygroundTester 8 | import Combine 9 | import Foundation 10 | 11 | // MARK: - Test 12 | @objcMembers 13 | final class SessionDetailViewModelTest: TestCase { 14 | 15 | func testDidTapSns() { 16 | var cancellables: Set = [] 17 | let expectation = Expectation(name: "Wait for didTapSns") 18 | let user = SessionUser(icon: nil, name: "", twAccount: "hcrane14") 19 | let model = SessionModel(track: .a, title: "", user: user) 20 | let viewModel = SessionDetailViewModel(output: .init(model: model)) 21 | 22 | viewModel.output.openSns 23 | .sink { url in 24 | AssertEqual(url.absoluteString, other: "https://twitter.com/hcrane14") 25 | expectation.fulfill() 26 | } 27 | .store(in: &cancellables) 28 | 29 | viewModel.input.didTapSns.send(()) 30 | 31 | AssertExpectations([expectation], timeout: 1) 32 | } 33 | 34 | func testDidTapYoutube() { 35 | var cancellables: Set = [] 36 | let expectation = Expectation(name: "Wait for didTapYoutube") 37 | let user = SessionUser(icon: nil, name: "", twAccount: "hcrane14") 38 | let model = SessionModel(track: .a, title: "", user: user, archiveParameter: "6nWnQVRVcs0") 39 | let viewModel = SessionDetailViewModel(output: .init(model: model)) 40 | 41 | viewModel.output.openSns 42 | .sink { url in 43 | AssertEqual(url.absoluteString, other: "https://www.youtube.com/watch?v=6nWnQVRVcs0") 44 | expectation.fulfill() 45 | } 46 | .store(in: &cancellables) 47 | 48 | viewModel.input.didTapYoutube.send(()) 49 | 50 | AssertExpectations([expectation], timeout: 1) 51 | } 52 | 53 | func testDidTapClose() { 54 | var cancellables: Set = [] 55 | let expectation = Expectation(name: "Wait for didTapSns") 56 | let user = SessionUser(icon: nil, name: "", twAccount: "hcrane14") 57 | let model = SessionModel(track: .a, title: "", user: user) 58 | let viewModel = SessionDetailViewModel(output: .init(model: model)) 59 | 60 | viewModel.output.dismissView 61 | .sink { 62 | expectation.fulfill() 63 | } 64 | .store(in: &cancellables) 65 | 66 | viewModel.input.didTapClose.send(()) 67 | 68 | AssertExpectations([expectation], timeout: 1) 69 | } 70 | } 71 | 72 | #endif 73 | -------------------------------------------------------------------------------- /AppTest/Screens/SessionList/Models/SessionModelTest+SessionList.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | import PlaygroundTester 4 | 5 | // MARK: - Test 6 | extension SessionModelTest { 7 | 8 | /* 9 | 共通化しているので、大小文字のテストは共通関数のみで実施 10 | */ 11 | func testAttributedText() { 12 | let model = SessionModel(track: .a, title: "") 13 | 14 | // contains text 15 | do { 16 | // text: lower, highlightText: lower 17 | do { 18 | let result = model.attributedText(with: "test_text", and: "test") 19 | AssertFalse(result.ranges(of: "test").isEmpty) 20 | Assert(result.ranges(of: "TEST").isEmpty) 21 | } 22 | // text: lower, highlightText: upper 23 | do { 24 | let result = model.attributedText(with: "test_text", and: "TEST") 25 | AssertFalse(result.ranges(of: "test").isEmpty) 26 | Assert(result.ranges(of: "TEST").isEmpty) 27 | } 28 | // text: upper, highlightText: lower 29 | do { 30 | let result = model.attributedText(with: "TEST_TEXT", and: "test") 31 | Assert(result.ranges(of: "test").isEmpty) 32 | AssertFalse(result.ranges(of: "TEST").isEmpty) 33 | } 34 | // text: upper, highlightText: upper 35 | do { 36 | let result = model.attributedText(with: "TEST_TEXT", and: "TEST") 37 | Assert(result.ranges(of: "test").isEmpty) 38 | AssertFalse(result.ranges(of: "TEST").isEmpty) 39 | } 40 | } 41 | 42 | // non contains text 43 | do { 44 | let result = model.attributedText(with: "test_text", and: "xxxx") 45 | Assert(result.ranges(of: "xxxx").isEmpty) 46 | } 47 | } 48 | 49 | func testAttributedTitleText() { 50 | let model = SessionModel(track: .a, title: "test_title") 51 | 52 | // contains text 53 | let result1 = model.attributedTitleText(with: "test") 54 | AssertFalse(result1.ranges(of: "test").isEmpty) 55 | 56 | // non contains text 57 | let result2 = model.attributedTitleText(with: "xxxx") 58 | Assert(result2.ranges(of: "yyyy").isEmpty) 59 | } 60 | 61 | func testAttributedBodyText() { 62 | // description is nil 63 | do { 64 | let model = SessionModel(track: .a, title: "", description: nil) 65 | let result1 = model.attributedBodyText(with: "test") 66 | AssertNil(result1) 67 | } 68 | 69 | // description is not nil 70 | do { 71 | let model = SessionModel(track: .a, title: "", description: "test_description") 72 | 73 | // highlight text 74 | let result1 = model.attributedBodyText(with: "test") 75 | let value = try AssertUnwrap(result1) 76 | AssertFalse(value.ranges(of: "test").isEmpty) 77 | 78 | // non highlight text 79 | let result2 = model.attributedBodyText(with: "xxxx") 80 | AssertNil(result2) 81 | } catch { 82 | assertionFailure("fail to unwrap") 83 | } 84 | } 85 | } 86 | 87 | #endif 88 | -------------------------------------------------------------------------------- /AppTest/Screens/SessionList/SessionListViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | /* 4 | Combineのテストが対応していないので、Expectationで代用する。 5 | */ 6 | 7 | import PlaygroundTester 8 | import Combine 9 | import Foundation 10 | 11 | // MARK: - Test 12 | @objcMembers 13 | final class SessionListViewModelTest: TestCase { 14 | 15 | func testDidTapSession() { 16 | let viewModel = SessionListViewModel() 17 | let model = SessionModel(track: .a, title: "") 18 | 19 | AssertNil(viewModel.output.modalModel) 20 | AssertFalse(viewModel.binding.isShownModal) 21 | 22 | viewModel.input.didTapSession.send(model) 23 | 24 | AssertEqual(viewModel.output.modalModel, other: model) 25 | Assert(viewModel.binding.isShownModal) 26 | } 27 | 28 | func testDidCloseModal() { 29 | let viewModel = SessionListViewModel() 30 | let model = SessionModel(track: .a, title: "") 31 | viewModel.output.modalModel = model 32 | viewModel.binding.isShownModal = true 33 | 34 | AssertNotNil(viewModel.output.modalModel) 35 | Assert(viewModel.binding.isShownModal) 36 | 37 | viewModel.input.didCloseModal.send(()) 38 | 39 | AssertNil(viewModel.output.modalModel) 40 | AssertFalse(viewModel.binding.isShownModal) 41 | } 42 | 43 | func testDidTapClose() { 44 | var cancellables: Set = [] 45 | let expectation = Expectation(name: "Wait for didTapClose") 46 | let viewModel = SessionListViewModel() 47 | 48 | viewModel.output.dismissView 49 | .sink { 50 | expectation.fulfill() 51 | } 52 | .store(in: &cancellables) 53 | 54 | viewModel.input.didTapClose.send(()) 55 | 56 | AssertExpectations([expectation], timeout: 1) 57 | } 58 | 59 | func testSearchText() { 60 | var cancellables: Set = [] 61 | 62 | // text is empty 63 | do { 64 | let expectation = Expectation(name: "Wait for SearchText, text is empty") 65 | let viewModel = SessionListViewModel() 66 | 67 | viewModel.binding.$models 68 | .dropFirst() 69 | .sink { models in 70 | AssertEqual(models.count, other: SessionListViewModel.models.count) 71 | expectation.fulfill() 72 | } 73 | .store(in: &cancellables) 74 | 75 | viewModel.binding.searchText.send("") 76 | 77 | AssertExpectations([expectation], timeout: 1) 78 | } 79 | 80 | // text is not empty 81 | do { 82 | let expectation = Expectation(name: "Wait for SearchText, text is not empty") 83 | let viewModel = SessionListViewModel() 84 | 85 | viewModel.binding.$models 86 | .dropFirst() 87 | .sink { models in 88 | AssertEqual(models.count, other: 12) 89 | expectation.fulfill() 90 | } 91 | .store(in: &cancellables) 92 | 93 | viewModel.binding.searchText.send("swiftui") 94 | 95 | AssertExpectations([expectation], timeout: 1) 96 | } 97 | } 98 | } 99 | 100 | #endif 101 | -------------------------------------------------------------------------------- /AppTest/Screens/UserList/UserListViewModelTest.swift: -------------------------------------------------------------------------------- 1 | #if TESTING_ENABLED 2 | 3 | /* 4 | Combineのテストが対応していないので、Expectationで代用する。 5 | */ 6 | 7 | import PlaygroundTester 8 | import Combine 9 | import Foundation 10 | 11 | // MARK: - Test 12 | @objcMembers 13 | final class UserListViewModelTest: TestCase { 14 | 15 | func testDidTapSns() { 16 | var cancellables: Set = [] 17 | let expectation = Expectation(name: "Wait for didTapSns") 18 | let user = StaffUser(icon: nil, name: "", twAccount: "hcrane14") 19 | let viewModel = UserListViewModel(output: .init(models: [user])) 20 | 21 | viewModel.output.openSns 22 | .sink { url in 23 | AssertEqual(url.absoluteString, other: "https://twitter.com/hcrane14") 24 | expectation.fulfill() 25 | } 26 | .store(in: &cancellables) 27 | 28 | viewModel.input.didTapSns.send(user) 29 | 30 | AssertExpectations([expectation], timeout: 1) 31 | } 32 | } 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /Assets.xcassets/AppIcon.appiconset/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/AppIcon.appiconset/AppIcon.png -------------------------------------------------------------------------------- /Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon.png", 5 | "idiom" : "universal", 6 | "platform" : "ios", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/Logo/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/Logo/logo_twitter.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo_twitter.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/Logo/logo_twitter.imageset/logo_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/Logo/logo_twitter.imageset/logo_twitter.png -------------------------------------------------------------------------------- /Assets.xcassets/Logo/logo_youtube.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo_youtube.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/Logo/logo_youtube.imageset/logo_youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/Logo/logo_youtube.imageset/logo_youtube.png -------------------------------------------------------------------------------- /Assets.xcassets/Map/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/Map/map_floor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "map_floor.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/Map/map_floor.imageset/map_floor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/Map/map_floor.imageset/map_floor.png -------------------------------------------------------------------------------- /Assets.xcassets/Map/map_university.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "map_university.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/Map/map_university.imageset/map_university.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/Map/map_university.imageset/map_university.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user501.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user501.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user501.imageset/user501.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user501.imageset/user501.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user502.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user502.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user502.imageset/user502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user502.imageset/user502.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user503.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user503.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user503.imageset/user503.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user503.imageset/user503.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user504.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user504.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user504.imageset/user504.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user504.imageset/user504.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user505.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user505.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user505.imageset/user505.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user505.imageset/user505.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user506.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user506.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user506.imageset/user506.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user506.imageset/user506.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user507.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user507.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user507.imageset/user507.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user507.imageset/user507.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user508.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user508.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user508.imageset/user508.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user508.imageset/user508.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user509.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user509.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user509.imageset/user509.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user509.imageset/user509.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user510.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user510.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user510.imageset/user510.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user510.imageset/user510.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user511.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user511.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user511.imageset/user511.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user511.imageset/user511.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user512.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user512.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user512.imageset/user512.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user512.imageset/user512.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user513.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user513.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user513.imageset/user513.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user513.imageset/user513.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user514.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user514.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user514.imageset/user514.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user514.imageset/user514.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user515.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user515.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user515.imageset/user515.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user515.imageset/user515.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user516.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user516.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user516.imageset/user516.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user516.imageset/user516.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user517.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user517.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user517.imageset/user517.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user517.imageset/user517.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user518.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user518.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user518.imageset/user518.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user518.imageset/user518.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user519.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user519.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user519.imageset/user519.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user519.imageset/user519.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user520.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user520.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user520.imageset/user520.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user520.imageset/user520.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user521.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user521.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user521.imageset/user521.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user521.imageset/user521.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user522.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user522.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Core/user522.imageset/user522.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Core/user522.imageset/user522.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user701.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user701.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user701.imageset/user701.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Network/user701.imageset/user701.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user702.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user702.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user702.imageset/user702.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Network/user702.imageset/user702.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user703.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user703.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user703.imageset/user703.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Network/user703.imageset/user703.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user704.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user704.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user704.imageset/user704.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Network/user704.imageset/user704.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user705.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user705.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Network/user705.imageset/user705.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Network/user705.imageset/user705.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user1.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user1.imageset/user1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user1.imageset/user1.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user10.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user10.imageset/user10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user10.imageset/user10.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user11.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user11.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user11.imageset/user11.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user11.imageset/user11.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user12.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user12.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user12.imageset/user12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user12.imageset/user12.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user13.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user13.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user13.imageset/user13.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user13.imageset/user13.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user14.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user14.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user14.imageset/user14.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user14.imageset/user14.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user15.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user15.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user15.imageset/user15.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user15.imageset/user15.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user16.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user16.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user16.imageset/user16.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user16.imageset/user16.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user17.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user17.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user17.imageset/user17.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user17.imageset/user17.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user18.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user18.imageset/user18.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user18.imageset/user18.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user19.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user19.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user19.imageset/user19.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user19.imageset/user19.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user2.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user2.imageset/user2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user2.imageset/user2.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user20.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user20.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user20.imageset/user20.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user20.imageset/user20.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user21.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user21.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user21.imageset/user21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user21.imageset/user21.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user22.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user22.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user22.imageset/user22.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user22.imageset/user22.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user23.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user23.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user23.imageset/user23.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user23.imageset/user23.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user24.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user24.imageset/user24.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user24.imageset/user24.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user25.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user25.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user25.imageset/user25.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user25.imageset/user25.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user26.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user26.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user26.imageset/user26.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user26.imageset/user26.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user27.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user27.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user27.imageset/user27.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user27.imageset/user27.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user28.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user28.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user28.imageset/user28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user28.imageset/user28.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user29.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user29.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user29.imageset/user29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user29.imageset/user29.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user3.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user3.imageset/user3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user3.imageset/user3.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user30.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user30.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user30.imageset/user30.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user30.imageset/user30.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user31.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user31.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user31.imageset/user31.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user31.imageset/user31.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user32.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user32.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user32.imageset/user32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user32.imageset/user32.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user33.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user33.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user33.imageset/user33.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user33.imageset/user33.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user34.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user34.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user34.imageset/user34.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user34.imageset/user34.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user35.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user35.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user35.imageset/user35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user35.imageset/user35.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user36.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user36.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user36.imageset/user36.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user36.imageset/user36.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user37.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user37.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user37.imageset/user37.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user37.imageset/user37.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user38.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user38.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user38.imageset/user38.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user38.imageset/user38.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user39.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user39.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user39.imageset/user39.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user39.imageset/user39.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user4.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user4.imageset/user4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user4.imageset/user4.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user40.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user40.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user40.imageset/user40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user40.imageset/user40.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user41.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user41.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user41.imageset/user41.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user41.imageset/user41.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user42.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user42.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user42.imageset/user42.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user42.imageset/user42.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user43.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user43.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user43.imageset/user43.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user43.imageset/user43.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user44.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user44.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user44.imageset/user44.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user44.imageset/user44.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user45.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user45.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user45.imageset/user45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user45.imageset/user45.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user46.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user46.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user46.imageset/user46.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user46.imageset/user46.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user47.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user47.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user47.imageset/user47.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user47.imageset/user47.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user48.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user48.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user48.imageset/user48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user48.imageset/user48.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user49.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user49.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user49.imageset/user49.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user49.imageset/user49.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user5.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user5.imageset/user5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user5.imageset/user5.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user50.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user50.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user50.imageset/user50.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user50.imageset/user50.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user51.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user51.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user51.imageset/user51.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user51.imageset/user51.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user52.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user52.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user52.imageset/user52.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user52.imageset/user52.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user56.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user56.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user56.imageset/user56.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user56.imageset/user56.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user58.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user58.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user58.imageset/user58.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user58.imageset/user58.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user59.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user59.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user59.imageset/user59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user59.imageset/user59.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user6.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user6.imageset/user6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user6.imageset/user6.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user60.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user60.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user60.imageset/user60.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user60.imageset/user60.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user61.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user61.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user61.imageset/user61.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user61.imageset/user61.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user62.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user62.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user62.imageset/user62.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user62.imageset/user62.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user63.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user63.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user63.imageset/user63.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user63.imageset/user63.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user64.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user64.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user64.imageset/user64.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user64.imageset/user64.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user65.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user65.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user65.imageset/user65.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user65.imageset/user65.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user66.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user66.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user66.imageset/user66.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user66.imageset/user66.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user67.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user67.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user67.imageset/user67.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user67.imageset/user67.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user68.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user68.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user68.imageset/user68.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user68.imageset/user68.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user69.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user69.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user69.imageset/user69.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user69.imageset/user69.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user7.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user7.imageset/user7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user7.imageset/user7.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user71.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user71.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user71.imageset/user71.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user71.imageset/user71.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user72.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user72.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user72.imageset/user72.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user72.imageset/user72.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user73.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user73.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user73.imageset/user73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user73.imageset/user73.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user74.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user74.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user74.imageset/user74.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user74.imageset/user74.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user75.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user75.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user75.imageset/user75.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user75.imageset/user75.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user76.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user76.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user76.imageset/user76.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user76.imageset/user76.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user77.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user77.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user77.imageset/user77.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user77.imageset/user77.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user78.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user78.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user78.imageset/user78.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user78.imageset/user78.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user79.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user79.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user79.imageset/user79.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user79.imageset/user79.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user8.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user8.imageset/user8.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user8.imageset/user8.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user80.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user80.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user80.imageset/user80.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user80.imageset/user80.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user81.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user81.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user81.imageset/user81.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user81.imageset/user81.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user82.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user82.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user82.imageset/user82.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user82.imageset/user82.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user83.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user83.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user83.imageset/user83.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user83.imageset/user83.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user84.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user84.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user84.imageset/user84.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user84.imageset/user84.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user85.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user85.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user85.imageset/user85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user85.imageset/user85.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user86.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user86.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user86.imageset/user86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user86.imageset/user86.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user87.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user87.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user87.imageset/user87.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user87.imageset/user87.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user88.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user88.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user88.imageset/user88.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user88.imageset/user88.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user89.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user89.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user89.imageset/user89.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user89.imageset/user89.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user9.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user9.imageset/user9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user9.imageset/user9.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user90.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user90.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user90.imageset/user90.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user90.imageset/user90.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user91.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user91.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user91.imageset/user91.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user91.imageset/user91.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user92.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user92.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user92.imageset/user92.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user92.imageset/user92.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user93.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user93.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user93.imageset/user93.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user93.imageset/user93.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user94.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user94.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user94.imageset/user94.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user94.imageset/user94.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user95.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user95.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user95.imageset/user95.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user95.imageset/user95.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user96.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user96.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Session/user96.imageset/user96.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Session/user96.imageset/user96.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user601.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user601.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user601.imageset/user601.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user601.imageset/user601.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user602.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user602.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user602.imageset/user602.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user602.imageset/user602.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user603.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user603.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user603.imageset/user603.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user603.imageset/user603.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user604.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user604.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user604.imageset/user604.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user604.imageset/user604.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user605.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user605.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user605.imageset/user605.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user605.imageset/user605.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user606.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user606.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user606.imageset/user606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user606.imageset/user606.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user607.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user607.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user607.imageset/user607.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user607.imageset/user607.png -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user608.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user608.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user608.imageset/user608.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user608.imageset/user608.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user609.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user609.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user609.imageset/user609.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user609.imageset/user609.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user610.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user610.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user610.imageset/user610.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user610.imageset/user610.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user611.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user611.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user611.imageset/user611.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user611.imageset/user611.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user612.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user612.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user612.imageset/user612.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user612.imageset/user612.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user613.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user613.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user613.imageset/user613.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user613.imageset/user613.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user614.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user614.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user614.imageset/user614.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user614.imageset/user614.jpeg -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user615.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user615.jpeg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Assets.xcassets/StaffUser/Temporary/user615.imageset/user615.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crane-hiromu/PadOSDC_Japan_App/e5c463cdd9540a7b3c2bf183e2843077e68daddb/Assets.xcassets/StaffUser/Temporary/user615.imageset/user615.jpeg -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | help: 2 | @echo "Please use 'make ' where is one of" 3 | @echo " install to install all dependencies" 4 | @echo " install_licence_plist to install LicensePlist" 5 | @echo " license to generate license plist file" 6 | @echo " install_swiftgen to install SwiftGen" 7 | @echo " asset to generate Asset swift file" 8 | @echo " git_rm to reset gitignore cache when updating file" 9 | 10 | # Installation 11 | 12 | install: install_licence_plist install_swiftgen 13 | 14 | # LicensePlist 15 | 16 | install_licence_plist: 17 | brew install mono0926/license-plist/license-plist 18 | 19 | license: 20 | license-plist --output-path ./Resources/License 21 | 22 | # SwiftGen 23 | 24 | install_swiftgen: 25 | brew install swiftgen 26 | 27 | asset: 28 | swiftgen 29 | 30 | # Git 31 | git_rm: 32 | git rm -r --cached . 33 | -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "combinestorable", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/crane-hiromu/CombineStorable.git", 7 | "state" : { 8 | "revision" : "4b0c651c6ebefd2a4dcfcebee89df7cba68de8a4", 9 | "version" : "1.1.0" 10 | } 11 | }, 12 | { 13 | "identity" : "difference", 14 | "kind" : "remoteSourceControl", 15 | "location" : "https://github.com/krzysztofzablocki/Difference", 16 | "state" : { 17 | "revision" : "02fe1111edc8318c4f8a0da96336fcbcc201f38b", 18 | "version" : "1.0.1" 19 | } 20 | }, 21 | { 22 | "identity" : "playgroundtester", 23 | "kind" : "remoteSourceControl", 24 | "location" : "https://github.com/Losiowaty/PlaygroundTester.git", 25 | "state" : { 26 | "revision" : "1444c7e0d2f15be1e4c75bdaa6ecc3139d3c3a83", 27 | "version" : "0.3.1" 28 | } 29 | }, 30 | { 31 | "identity" : "swiftuiworkaround", 32 | "kind" : "remoteSourceControl", 33 | "location" : "https://github.com/noppefoxwolf/SwiftUIWorkaround", 34 | "state" : { 35 | "revision" : "3a1f3d38310fb284baf39d841f29686aeaf55a87", 36 | "version" : "0.0.5" 37 | } 38 | } 39 | ], 40 | "version" : 2 41 | } 42 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.6 2 | 3 | // WARNING: 4 | // This file is automatically generated. 5 | // Do not edit it by hand because the contents will be replaced. 6 | 7 | import PackageDescription 8 | import AppleProductTypes 9 | 10 | let package = Package( 11 | name: "PadOSDC", 12 | defaultLocalization: "en", 13 | platforms: [ 14 | .iOS("15.2") 15 | ], 16 | products: [ 17 | .iOSApplication( 18 | name: "PadOSDC", 19 | targets: ["AppModule"], 20 | bundleIdentifier: "hcrane.padosdc.japan.2022", 21 | teamIdentifier: "R82WJ5W3TV", 22 | displayVersion: "1.7", 23 | bundleVersion: "10", 24 | appIcon: .asset("AppIcon"), 25 | accentColor: .presetColor(.blue), 26 | supportedDeviceFamilies: [ 27 | .pad, 28 | .phone 29 | ], 30 | supportedInterfaceOrientations: [ 31 | .portrait, 32 | .landscapeRight, 33 | .landscapeLeft, 34 | .portraitUpsideDown(.when(deviceFamilies: [.pad])) 35 | ], 36 | appCategory: .reference, 37 | additionalInfoPlistContentFilePath: "Resources/Plist/App.plist" 38 | ) 39 | ], 40 | dependencies: [ 41 | .package(url: "https://github.com/crane-hiromu/CombineStorable.git", "1.1.0"..<"1.2.0"), 42 | .package(url: "https://github.com/noppefoxwolf/SwiftUIWorkaround", "0.0.5"..<"1.0.0"), 43 | .package(url: "https://github.com/Losiowaty/PlaygroundTester.git", "0.3.1"..<"1.0.0") 44 | ], 45 | targets: [ 46 | .executableTarget( 47 | name: "AppModule", 48 | dependencies: [ 49 | .product(name: "CombineStorable", package: "combinestorable"), 50 | .product(name: "SwiftUIWorkaround", package: "swiftuiworkaround"), 51 | .product(name: "PlaygroundTester", package: "playgroundtester") 52 | ], 53 | path: ".", 54 | exclude: ["swiftgen.yml", "README.md", "Makefile", "Resources/Stencil"], 55 | resources: [ 56 | .process("Resources") 57 | ], 58 | swiftSettings: [ 59 | .unsafeFlags(["-Xfrontend", "-warn-long-function-bodies=100"], .when(configuration: .debug)), 60 | .unsafeFlags(["-Xfrontend", "-warn-long-expression-type-checking=100"], .when(configuration: .debug)), 61 | .define("TESTING_ENABLED", .when(configuration: .debug)) 62 | ] 63 | ) 64 | ] 65 | ) 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PadOSDC 2 | 3 | DarkMode 4 | 5 | |![padosdc_phone_1](https://user-images.githubusercontent.com/24838521/184555545-160d93de-aaf5-4cdc-ae51-02071a0cba8a.png)|![padosdc_phone_2](https://user-images.githubusercontent.com/24838521/184555547-75fa3a84-b040-4aa2-bee3-2155caa5d1ff.png)|![padosdc_phone_3](https://user-images.githubusercontent.com/24838521/184555548-bd6a0121-522f-4747-9157-5acf1b9f418a.png)|![padosdc_phone_4](https://user-images.githubusercontent.com/24838521/184555549-af3c82b4-9de1-46f1-9174-7cc5274173c2.png)|![padosdc_phone_7](https://user-images.githubusercontent.com/24838521/184555557-bafa23ec-fdeb-42d9-96ac-0d6fcbf94ede.png)| 6 | |:---:|:---:|:---:|:---:|:---:| 7 | 8 | 9 | LightMode 10 | 11 | | | | | | | 12 | |:---:|:---:|:---:|:---:|:---:| 13 | 14 | 15 | Install from [here](https://apps.apple.com/us/app/padosdc/id1637969392) on App Store. 16 | 17 | 18 |
19 | 20 | # Description 21 | 22 | This is an unofficial application for conference of [iOSDC Japan 2022](https://iosdc.jp/2022/). 23 | 24 | You can check and search the timetable of the conference. 25 | 26 | It's built with *SwiftUI only*, using [Swift Playgrounds](https://www.apple.com/jp/swift/playgrounds/) instead of Xcode. 27 | 28 |
29 | 30 | # Architecture 31 | 32 | 33 | 34 | The architecture is based on `MVVM`. 35 | 36 | Screen transitions are made via `Environment`. 37 | 38 |
39 | 40 | # Installation 41 | 42 | ## 1. Clone 43 | 44 | Install [Swift Playgrounds](https://www.apple.com/jp/swift/playgrounds/) and open `PadOSDC.swiftpm` that cloned following step. 45 | 46 | ```bash 47 | $ git clone https://github.com/crane-hiromu/PadOSDC_Japan_App PadOSDC.swiftpm 48 | ``` 49 | 50 | Don't forget `.swiftpm` at the end! 51 | 52 | ## 2. Setup 53 | 54 | Navigate to the project directory. 55 | 56 | ```bash 57 | $ cd PadOSDC.swiftpm 58 | ``` 59 | 60 | 61 | Install [Homebrew](https://brew.sh/) if needed. 62 | 63 | ```bash 64 | $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 65 | ``` 66 | 67 | Install [LicensePlist](https://github.com/mono0926/LicensePlist) and [SwiftGen](https://github.com/SwiftGen/SwiftGen) with [Homebrew](https://brew.sh/). 68 | 69 | ```bash 70 | $ brew install mono0926/license-plist/license-plist 71 | $ brew install swiftgen 72 | ``` 73 | 74 | or 75 | 76 | ```bash 77 | $ make install 78 | ``` 79 | 80 | If you can't install licenseplist, please try `brew install licenseplist`. 81 | 82 | ## 3. Generate 83 | 84 | Generate [LicensePlist](https://github.com/mono0926/LicensePlist) file. 85 | 86 | ```bash 87 | $ make license 88 | ``` 89 | 90 | Generate [SwiftGen](https://github.com/SwiftGen/SwiftGen) file. 91 | 92 | ```bash 93 | $ make asset 94 | ``` 95 | 96 | 97 | 98 |
99 | 100 | # Test 101 | 102 | Testing is performed using a library called [PlaygroundTester](https://github.com/Losiowaty/PlaygroundTester). 103 | 104 | -------------------------------------------------------------------------------- /Resources/Plist/App.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITSAppUsesNonExemptEncryption 6 | 7 | com.apple.security.get-task-allow 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /swiftgen.yml: -------------------------------------------------------------------------------- 1 | ## https://github.com/SwiftGen/SwiftGen/tree/6.6.0/Documentation/ 2 | 3 | xcassets: 4 | inputs: Assets.xcassets 5 | outputs: 6 | templatePath: Resources/Stencil/xcassets-swift5-revision.stencil 7 | output: App/Resources/SwiftGen/Assets.swift 8 | strings: 9 | inputs: App/Resources/Localizebles/en.lproj 10 | outputs: 11 | templatePath: Resources/Stencil/strings-structured-swift5-revision.stencil 12 | output: App/Resources/SwiftGen/LocalizedStrings.swift 13 | plist: 14 | inputs: Resources 15 | outputs: 16 | templatePath: Resources/Stencil/plist-runtime-swift5-revision.stencil 17 | output: App/Resources/SwiftGen/Plist.swift 18 | --------------------------------------------------------------------------------