├── .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 | ||||||
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 |
--------------------------------------------------------------------------------