├── .github ├── ISSUE_TEMPLATE │ └── feature-template.md └── pull_request_template.md ├── .gitignore ├── .swiftlint.yml ├── README.md ├── TOASTER-iOS.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved ├── xcshareddata │ └── xcschemes │ │ └── TOASTER-iOS.xcscheme └── xcuserdata │ └── yeahh.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── TOASTER-iOS ├── Application │ ├── AppDelegate.swift │ ├── Coordinator │ │ ├── Coordinator.swift │ │ ├── CoordinatorFinishOutput.swift │ │ ├── Coordinators │ │ │ ├── AddLinkCoordinator.swift │ │ │ ├── AppCoordinator.swift │ │ │ ├── ClipCoordinator.swift │ │ │ ├── HomeCoordinator.swift │ │ │ ├── LoginCoordinator.swift │ │ │ ├── SearchCoordinator.swift │ │ │ ├── TabBarCoordinator.swift │ │ │ └── TimerCoordinator.swift │ │ ├── Factory │ │ │ ├── CoordinatorFactory.swift │ │ │ └── ViewControllerFactory.swift │ │ └── Router.swift │ └── SceneDelegate.swift ├── Global │ ├── Components │ │ ├── .gitkeep │ │ ├── ToasterBottomSheet │ │ │ ├── BottomType.swift │ │ │ └── ToasterBottomSheetViewController.swift │ │ ├── ToasterLoadingView │ │ │ └── ToasterLoadingView.swift │ │ ├── ToasterNavigationController │ │ │ ├── ToasterNavigationController.swift │ │ │ └── ToasterNavigationType.swift │ │ ├── ToasterPopup │ │ │ └── ToasterPopupViewController.swift │ │ ├── ToasterTipView │ │ │ ├── TipPathView.swift │ │ │ ├── TipUserDefaults.swift │ │ │ └── ToasterTipView.swift │ │ └── ToasterToastMessage │ │ │ ├── ToastStatus.swift │ │ │ └── ToasterToastMessageView.swift │ ├── Consts │ │ ├── FontLiterals.swift │ │ ├── Notification.swift │ │ └── StringLiterals.swift │ ├── Extensions │ │ ├── Combine+ │ │ │ ├── CancelBag.swift │ │ │ ├── Publisher+Driver.swift │ │ │ ├── Publisher+Operator.swift │ │ │ ├── Publisher+UIBarButtonItem.swift │ │ │ ├── Publisher+UIButton.swift │ │ │ ├── Publisher+UIControl.swift │ │ │ └── Publisher+UIGesture.swift │ │ ├── Foundation+ │ │ │ └── NSObject+.swift │ │ └── UIKit+ │ │ │ ├── UIButton+.swift │ │ │ ├── UIColor+.swift │ │ │ ├── UILabel+.swift │ │ │ ├── UIStackView+.swift │ │ │ ├── UITextField+.swift │ │ │ ├── UIView+.swift │ │ │ └── UIViewController+.swift │ ├── Protocols │ │ ├── .gitkeep │ │ ├── AuthenticationAdapterProtocol.swift │ │ └── ViewModelType.swift │ ├── Resources │ │ ├── Assets │ │ │ ├── Assets.xcassets │ │ │ │ ├── AccentColor.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ ├── 100.png │ │ │ │ │ ├── 1024.png │ │ │ │ │ ├── 114.png │ │ │ │ │ ├── 120.png │ │ │ │ │ ├── 128.png │ │ │ │ │ ├── 144.png │ │ │ │ │ ├── 152.png │ │ │ │ │ ├── 16.png │ │ │ │ │ ├── 167.png │ │ │ │ │ ├── 172.png │ │ │ │ │ ├── 180.png │ │ │ │ │ ├── 196.png │ │ │ │ │ ├── 20.png │ │ │ │ │ ├── 216.png │ │ │ │ │ ├── 256.png │ │ │ │ │ ├── 29.png │ │ │ │ │ ├── 32.png │ │ │ │ │ ├── 40.png │ │ │ │ │ ├── 48.png │ │ │ │ │ ├── 50.png │ │ │ │ │ ├── 512.png │ │ │ │ │ ├── 55.png │ │ │ │ │ ├── 57.png │ │ │ │ │ ├── 58.png │ │ │ │ │ ├── 60.png │ │ │ │ │ ├── 64.png │ │ │ │ │ ├── 66.png │ │ │ │ │ ├── 72.png │ │ │ │ │ ├── 76.png │ │ │ │ │ ├── 80.png │ │ │ │ │ ├── 87.png │ │ │ │ │ ├── 88.png │ │ │ │ │ ├── 92.png │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── EmptyView │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── clip_empty.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_clip.png │ │ │ │ │ │ ├── img_clip@2x.png │ │ │ │ │ │ └── img_clip@3x.png │ │ │ │ │ ├── detail_clip_empty.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_link.png │ │ │ │ │ │ ├── img_link@2x.png │ │ │ │ │ │ └── img_link@3x.png │ │ │ │ │ ├── img_alarm.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_alarm.png │ │ │ │ │ │ ├── img_alarm@2x.png │ │ │ │ │ │ └── img_alarm@3x.png │ │ │ │ │ ├── img_alarm_ios.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_alarm_ios.png │ │ │ │ │ │ ├── img_alarm_ios@2x.png │ │ │ │ │ │ └── img_alarm_ios@3x.png │ │ │ │ │ ├── img_search.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_search.png │ │ │ │ │ │ ├── img_search@2x.png │ │ │ │ │ │ └── img_search@3x.png │ │ │ │ │ └── img_timer.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_timer.png │ │ │ │ │ │ ├── img_timer@2x.png │ │ │ │ │ │ └── img_timer@3x.png │ │ │ │ ├── Icons_18 │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── ic_alert_18_dark.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_alert_18_dark.svg │ │ │ │ │ ├── ic_alert_18_white.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── ic_alert_18_white.png │ │ │ │ │ │ ├── ic_alert_18_white@2x.png │ │ │ │ │ │ └── ic_alert_18_white@3x.png │ │ │ │ │ ├── ic_arrow_18.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_arrow_18.svg │ │ │ │ │ ├── ic_check_18.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_check_18.svg │ │ │ │ │ ├── ic_check_18_white.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── ic_check_18_white.png │ │ │ │ │ │ ├── ic_check_18_white@2x.png │ │ │ │ │ │ └── ic_check_18_white@3x.png │ │ │ │ │ ├── ic_plus_18_orange.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_plus_18_orange.svg │ │ │ │ │ └── ic_search_cancle.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_search_cancle.svg │ │ │ │ ├── Icons_20 │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── alarm_disabled_20.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── alarm_disabled_20.svg │ │ │ │ │ ├── ic_arrow_20.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_arrow_20.svg │ │ │ │ │ └── ic_search_20.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_search_20.svg │ │ │ │ ├── Icons_24 │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── ic_alarm_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_alarm_24.svg │ │ │ │ │ ├── ic_all_clip_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_all_clip_24.svg │ │ │ │ │ ├── ic_apple_login_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_apple_login_24.svg │ │ │ │ │ ├── ic_arrow2_back_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_arrow2_24.svg │ │ │ │ │ ├── ic_arrow2_forward_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_arrow2_24.svg │ │ │ │ │ ├── ic_arrow_left_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_arrow_left_24.svg │ │ │ │ │ ├── ic_cancle_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_cancle_24.svg │ │ │ │ │ ├── ic_clip_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_clip_24.svg │ │ │ │ │ ├── ic_clip_24_black.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_clip_24_black.svg │ │ │ │ │ ├── ic_clip_full_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_clip_full_24.svg │ │ │ │ │ ├── ic_close_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_close_24.svg │ │ │ │ │ ├── ic_edit_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_edit_24.svg │ │ │ │ │ ├── ic_home_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_home_24.svg │ │ │ │ │ ├── ic_kakao_login_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_kakao_login_24.svg │ │ │ │ │ ├── ic_more_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_more_24.svg │ │ │ │ │ ├── ic_my_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_my_24.svg │ │ │ │ │ ├── ic_pin_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_pin_24.svg │ │ │ │ │ ├── ic_plus_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_plus_24.svg │ │ │ │ │ ├── ic_read.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_read.svg │ │ │ │ │ ├── ic_reload_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_reload_24.svg │ │ │ │ │ ├── ic_safari_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_safari_24.svg │ │ │ │ │ ├── ic_search_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_search_24.svg │ │ │ │ │ ├── ic_settings_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_settings_24.svg │ │ │ │ │ ├── ic_share.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_share.svg │ │ │ │ │ └── ic_timer_24.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_timer_24.svg │ │ │ │ ├── Icons_plus │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── btn_plus.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── btn_plus.svg │ │ │ │ │ ├── fab_plus.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── fab_plus.svg │ │ │ │ │ └── ic_delete_28.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ └── ic_delete_28.svg │ │ │ │ └── Image │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_bmsite.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_bmsite.png │ │ │ │ │ ├── img_bmsite@2x.png │ │ │ │ │ └── img_bmsite@3x.png │ │ │ │ │ ├── img_indicator.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── img_indicator.svg │ │ │ │ │ ├── img_indicator_selected.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── img_indicator_selected.svg │ │ │ │ │ ├── img_login.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_login.png │ │ │ │ │ ├── img_login@2x.png │ │ │ │ │ └── img_login@3x.png │ │ │ │ │ ├── img_onboarding.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_onboarding.png │ │ │ │ │ ├── img_onboarding@2x.png │ │ │ │ │ └── img_onboarding@3x.png │ │ │ │ │ ├── img_onboarding2.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_onboarding2.png │ │ │ │ │ ├── img_onboarding2@2x.png │ │ │ │ │ └── img_onboarding2@3x.png │ │ │ │ │ ├── img_onboarding3.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_onboarding3.png │ │ │ │ │ ├── img_onboarding3@2x.png │ │ │ │ │ └── img_onboarding3@3x.png │ │ │ │ │ ├── img_thumbnail.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_thumbnail.png │ │ │ │ │ ├── img_thumbnail@2x.png │ │ │ │ │ └── img_thumbnail@3x.png │ │ │ │ │ ├── loginTitle.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── loginTitle.png │ │ │ │ │ ├── loginTitle@2x.png │ │ │ │ │ └── loginTitle@3x.png │ │ │ │ │ ├── profile.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── profile.png │ │ │ │ │ ├── profile@2x.png │ │ │ │ │ └── profile@3x.png │ │ │ │ │ ├── symbol.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── symbol.png │ │ │ │ │ ├── symbol@2x.png │ │ │ │ │ └── symbol@3x.png │ │ │ │ │ └── wordmark.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── wordmark.png │ │ │ │ │ ├── wordmark@2x.png │ │ │ │ │ └── wordmark@3x.png │ │ │ └── Colors.xcassets │ │ │ │ ├── Contents.json │ │ │ │ ├── black850.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── black900.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray100.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray150.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray200.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray300.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray400.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray50.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray500.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray600.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray700.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── gray800.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── loginKakao.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster100.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster200.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster300.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster400.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster50.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toaster800.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterBackground.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterBlack.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterError.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterPrimary.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterSuccess.colorset │ │ │ │ └── Contents.json │ │ │ │ ├── toasterWarning.colorset │ │ │ │ └── Contents.json │ │ │ │ └── toasterWhite.colorset │ │ │ │ └── Contents.json │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ ├── Config.swift │ │ └── Fonts │ │ │ ├── .gitkeep │ │ │ ├── SUIT-Bold.otf │ │ │ ├── SUIT-ExtraBold.otf │ │ │ ├── SUIT-Medium.otf │ │ │ ├── SUIT-Regular.otf │ │ │ └── SUIT-SemiBold.otf │ └── Supporting Files │ │ └── Info.plist ├── Network │ ├── .gitkeep │ ├── Auth │ │ ├── AuthAPIService.swift │ │ ├── AuthTargetType.swift │ │ └── DTO │ │ │ ├── Request │ │ │ └── PostSocialLoginRequestDTO.swift │ │ │ └── Response │ │ │ ├── PostRefreshTokenResponseDTO.swift │ │ │ ├── PostSocialLoginResponseDTO.swift │ │ │ └── PostTokenHealthResponseDTO.swift │ ├── Base │ │ ├── APIInterceptor.swift │ │ ├── BaseAPIService.swift │ │ ├── BaseTargetType.swift │ │ ├── KeyChainService.swift │ │ ├── MoyaPlugin.swift │ │ ├── NetworkResult.swift │ │ ├── NetworkService.swift │ │ └── NoneDataResponseDTO.swift │ ├── Clip │ │ ├── ClipAPIService.swift │ │ ├── ClipTargetType.swift │ │ └── DTO │ │ │ ├── Request │ │ │ ├── PatchEditNameCategoryRequestDTO.swift │ │ │ ├── PatchEditPriorityCategoryRequestDTO.swift │ │ │ └── PostAddCategoryRequestDTO.swift │ │ │ └── Response │ │ │ ├── GetAllCategoryResponseDTO.swift │ │ │ ├── GetCheckCategoryResponseDTO.swift │ │ │ └── GetDetailCategoryResponseDTO.swift │ ├── Popup │ │ ├── DTO │ │ │ ├── GetPopupInfoResponseDTO.swift │ │ │ ├── PatchPopupHiddenRequestDTO.swift │ │ │ └── PatchPopupHiddenResponseDTO.swift │ │ ├── PopupAPIService.swift │ │ └── PopupTargetType.swift │ ├── Search │ │ ├── DTO │ │ │ ├── GetMainPageSearchResponseDTO.swift │ │ │ └── GetRecommendSiteResponseDTO.swift │ │ ├── SearchAPIService.swift │ │ └── SearchTargetType.swift │ ├── Timer │ │ ├── DTO │ │ │ ├── Request │ │ │ │ ├── PatchEditTimerRequestDTO.swift │ │ │ │ ├── PatchEditTimerTitleRequestDTO.swift │ │ │ │ └── PostCreateTimerRequestDTO.swift │ │ │ └── Response │ │ │ │ ├── GetDetailTimerResponseDTO.swift │ │ │ │ └── GetTimerMainpageResponseDTO.swift │ │ ├── TimerAPIService.swift │ │ └── TimerTargetType.swift │ ├── Toaster │ │ ├── DTO │ │ │ ├── Request │ │ │ │ ├── PatchChangeCategoryRequestDTO.swift │ │ │ │ ├── PatchEditLinkTitleRequestDTO.swift │ │ │ │ ├── PatchOpenLinkRequestDTO.swift │ │ │ │ └── PostSaveLinkRequestDTO.swift │ │ │ └── Response │ │ │ │ ├── GetRecentLinkResponseDTO.swift │ │ │ │ ├── GetWeeksLinkResponseDTO.swift │ │ │ │ ├── PatchChangeCategoryResponseDTO.swift │ │ │ │ ├── PatchEditLinkTitleResponseDTO.swift │ │ │ │ └── PatchOpenLinkResponseDTO.swift │ │ ├── ToasterAPIService.swift │ │ └── ToasterTargetType.swift │ └── User │ │ ├── DTO │ │ ├── Request │ │ │ └── PatchPushAlarmRequestDTO.swift │ │ └── Response │ │ │ ├── GetMainPageResponseDTO.swift │ │ │ ├── GetMyPageResponseDTO.swift │ │ │ ├── GetSettingPageResponseDTO.swift │ │ │ └── PatchPushAlarmResponseDTO.swift │ │ ├── UserAPIService.swift │ │ └── UserTargetType.swift ├── Present │ ├── AddLink │ │ ├── LinkEmbed │ │ │ ├── Model │ │ │ │ └── SaveLinkModel.swift │ │ │ ├── View │ │ │ │ ├── AddLinkView.swift │ │ │ │ └── AddLinkViewController.swift │ │ │ └── ViewModel │ │ │ │ └── AddLinkViewModel.swift │ │ └── SelectClip │ │ │ ├── Model │ │ │ └── SelectClipModel.swift │ │ │ ├── View │ │ │ ├── SelectClipHeaderView.swift │ │ │ └── SelectClipViewController.swift │ │ │ └── ViewModel │ │ │ └── SelectClipViewModel.swift │ ├── Clip │ │ ├── Model │ │ │ └── ClipModel.swift │ │ ├── View │ │ │ ├── Cell │ │ │ │ └── ClipListCollectionViewCell.swift │ │ │ ├── ClipViewController.swift │ │ │ └── Component │ │ │ │ ├── AddClipBottomSheetView.swift │ │ │ │ ├── ClipCollectionHeaderView.swift │ │ │ │ └── ClipEmptyView.swift │ │ └── ViewModel │ │ │ └── ClipViewModel.swift │ ├── DetailClip │ │ ├── Model │ │ │ └── DetailClipModel.swift │ │ ├── View │ │ │ ├── Cell │ │ │ │ └── DetailClipListCollectionViewCell.swift │ │ │ ├── Component │ │ │ │ ├── ChangeClipBottomSheetView.swift │ │ │ │ ├── DetailClipEmptyView.swift │ │ │ │ ├── DetailClipSegmentedControlView.swift │ │ │ │ ├── DetailEditLinkBottomSheet.swift │ │ │ │ ├── EditLinkBottomSheetView.swift │ │ │ │ └── LinkOptionBottomSheetView.swift │ │ │ └── DetailClipViewController.swift │ │ └── ViewModel │ │ │ ├── DetailClipPropertyType.swift │ │ │ └── DetailClipViewModel.swift │ ├── EditClip │ │ ├── Model │ │ │ └── ClipPriorityEditModel.swift │ │ ├── View │ │ │ ├── EditClipCollectionViewCell.swift │ │ │ ├── EditClipNoticeView.swift │ │ │ └── EditClipViewController.swift │ │ └── ViewModel │ │ │ └── EditClipViewModel.swift │ ├── Home │ │ ├── HomeViewController.swift │ │ ├── Model │ │ │ ├── MainInfoModel.swift │ │ │ ├── PopupInfoModel.swift │ │ │ ├── RecentLinkModel.swift │ │ │ ├── RecommendSiteModel.swift │ │ │ └── WeeklyLinkModel.swift │ │ ├── View │ │ │ ├── Cell │ │ │ │ ├── HomeFooterCollectionView.swift │ │ │ │ ├── HomeHeaderCollectionView.swift │ │ │ │ ├── MainCollectionViewCell.swift │ │ │ │ ├── UserClipCollectionViewCell.swift │ │ │ │ ├── UserClipEmptyCollectionViewCell.swift │ │ │ │ ├── WeeklyLinkCollectionViewCell.swift │ │ │ │ └── WeeklyRecommendCollectionViewCell.swift │ │ │ ├── Component │ │ │ │ └── CompositioinalFactory.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ └── ViewModel │ │ │ └── HomeViewModel.swift │ ├── LinkWeb │ │ ├── Model │ │ │ └── LinkReadEditModel.swift │ │ ├── View │ │ │ ├── LinkWebNavigationView.swift │ │ │ └── LinkWebToolBarView.swift │ │ ├── ViewController │ │ │ └── LinkWebViewController.swift │ │ └── ViewModel │ │ │ └── LinkWebViewModel.swift │ ├── Login │ │ ├── Adapter │ │ │ ├── AppleAuthenticateAdapter.swift │ │ │ └── KakaoAuthenticateAdapter.swift │ │ ├── LoginError.swift │ │ ├── LoginViewController.swift │ │ ├── Model │ │ │ └── SocialLoginTokenModel.swift │ │ ├── OnboardingType.swift │ │ ├── OnboardingViewController.swift │ │ ├── SocialLoginType.swift │ │ ├── UseCase │ │ │ ├── LoginUseCase.swift │ │ │ └── LogoutUseCase.swift │ │ └── View │ │ │ ├── CustomPageIndicatorView.swift │ │ │ └── SocialLoginButtonView.swift │ ├── Remind │ │ ├── Model │ │ │ └── RemindModel.swift │ │ ├── View │ │ │ ├── Cell │ │ │ │ ├── CompleteTimerCollectionViewCell.swift │ │ │ │ ├── CompleteTimerEmptyCollectionViewCell.swift │ │ │ │ ├── RemindCollectionFooterView.swift │ │ │ │ ├── RemindCollectionHeaderView.swift │ │ │ │ └── WaitTimerCollectionViewCell.swift │ │ │ ├── Component │ │ │ │ ├── AlarmOffStateButton.swift │ │ │ │ ├── RemindAlarmOffBottomSheetView.swift │ │ │ │ ├── RemindAlarmOffView.swift │ │ │ │ ├── RemindAlarmOffViewType.swift │ │ │ │ ├── RemindTimerEditBottomSheetView.swift │ │ │ │ └── RemindTimerEmptyView.swift │ │ │ └── RemindViewController.swift │ │ └── ViewModel │ │ │ └── RemindViewModel.swift │ ├── RemindAdd │ │ ├── ClipAdd │ │ │ ├── Model │ │ │ │ └── RemindClipModel.swift │ │ │ ├── View │ │ │ │ ├── Cell │ │ │ │ │ └── RemindSelectClipCollectionViewCell.swift │ │ │ │ └── RemindSelectClipViewController.swift │ │ │ └── ViewModel │ │ │ │ └── RemindSelectClipViewModel.swift │ │ └── TimerAdd │ │ │ ├── Model │ │ │ └── RemindTimerAddModel.swift │ │ │ ├── RemindTimerAddViewController.swift │ │ │ ├── TimerRepeatDate.swift │ │ │ ├── View │ │ │ ├── Cell │ │ │ │ └── TimerRepeatCollectionViewCell.swift │ │ │ └── TimerRepeatBottomSheetView.swift │ │ │ └── ViewModel │ │ │ └── RemindTimerAddViewModel.swift │ ├── Search │ │ ├── Model │ │ │ └── SearchResultModel.swift │ │ ├── View │ │ │ ├── SearchEmptyResultView.swift │ │ │ └── SearchViewController.swift │ │ └── ViewModel │ │ │ └── SearchViewModel.swift │ ├── Setting │ │ ├── Model │ │ │ └── MypageUserModel.swift │ │ └── View │ │ │ ├── Cell │ │ │ └── SettingTableViewCell.swift │ │ │ ├── MypageHeaderView.swift │ │ │ ├── SettingView.swift │ │ │ └── SettingViewController.swift │ ├── TabBar │ │ ├── CustomTabBar.swift │ │ ├── TabBarController.swift │ │ └── TabBarItem.swift │ ├── UpdateAlert │ │ ├── UpdateAlertManager.swift │ │ └── UpdateAlertType.swift │ └── ViewController.swift └── TOASTER-iOS.entitlements └── ToasterShareExtension ├── Info.plist ├── MoyaPlugin.swift ├── ShareViewController.swift ├── ShareViewModel.swift └── ToasterShareExtension.entitlements /.github/ISSUE_TEMPLATE/feature-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Template 3 | about: "기능 이슈 템플릿입니다 \U0001F4AA\U0001F3FB" 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## 👀 이슈 (issue) 11 | 12 | 13 | ## 🚀 to-do 14 | 15 | - [ ] 할 것 16 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## ✨ 해결한 이슈 2 | 3 | - Resolved: #이슈번호 4 | 5 | ## 🛠️ 작업내용 6 | 7 | 8 | | 구현 내용 | SE | 13 mini | 15 pro | 9 | | :-------------: | :----------: | :----------: | :----------: | 10 | | GIF | | | | 11 | 12 | ## 🖥️ 주요 코드 설명 13 | 14 | `HomeView` 15 | - 쏼라쏼라 16 | ```swift 17 | // 코드는 이 사이에 작성하면 됩니다. 18 | ``` 19 | 20 | ## 📂 참고한 내용 21 | 22 | 23 | ## ✅ Checklist 24 | - [ ] 필요없는 주석, 프린트문 제거했는지 확인 25 | - [ ] 컨벤션 지켰는지 확인 26 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | # 실행에서 제외할 룰 식별자 2 | disabled_rules: 3 | - line_length 4 | - trailing_whitespace 5 | - function_parameter_count 6 | - file_length 7 | - identifier_name 8 | - function_body_length 9 | - nesting 10 | - cyclomatic_complexity 11 | # 린트 과정에서 무시할 파일 경로 12 | excluded: 13 | - TOASTER-iOS/Application/AppDelegate.swift 14 | - TOASTER-iOS/Application/SceneDelegate.swift 15 | - TOASTER-iOS/Present/ViewController.swift 16 | -------------------------------------------------------------------------------- /TOASTER-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TOASTER-iOS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /TOASTER-iOS/Application/Coordinator/Coordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Coordinator.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/7/25. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol Coordinator: AnyObject { 11 | var childCoordinators: [Coordinator] { get set } 12 | func start() 13 | } 14 | 15 | class BaseCoordinator: Coordinator { 16 | var childCoordinators = [Coordinator]() 17 | 18 | func addDependency(_ coordinator: Coordinator) { 19 | guard !childCoordinators.contains(where: { $0 === coordinator }) else { return } 20 | childCoordinators.append(coordinator) 21 | } 22 | 23 | func removeDependency(_ coordinator: Coordinator?) { 24 | guard let index = childCoordinators.firstIndex(where: { $0 === coordinator }) else { return } 25 | childCoordinators.remove(at: index) 26 | } 27 | 28 | func start() {} 29 | } 30 | -------------------------------------------------------------------------------- /TOASTER-iOS/Application/Coordinator/CoordinatorFinishOutput.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoordinatorFinishOutput.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/10/25. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol CoordinatorFinishOutput { 11 | var onFinish: (() -> Void)? { get set } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Application/Coordinator/Coordinators/AddLinkCoordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AddLinkCoordinator.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/15/25. 6 | // 7 | 8 | import Foundation 9 | 10 | final class AddLinkCoordinator: BaseCoordinator, CoordinatorFinishOutput { 11 | 12 | var onFinish: (() -> Void)? 13 | 14 | private let router: RouterProtocol 15 | private let viewControllerFactory: ViewControllerFactoryProtocol 16 | private let coordinatorFactory: CoordinatorFactoryProtocol 17 | private let isNavigationBarHidden: Bool 18 | 19 | init( 20 | router: RouterProtocol, 21 | viewControllerFactory: ViewControllerFactoryProtocol, 22 | coordinatorFactory: CoordinatorFactoryProtocol, 23 | isNavigationBarHidden: Bool 24 | ) { 25 | self.router = router 26 | self.viewControllerFactory = viewControllerFactory 27 | self.coordinatorFactory = coordinatorFactory 28 | self.isNavigationBarHidden = isNavigationBarHidden 29 | } 30 | 31 | override func start() { 32 | showAddLinkVC() 33 | } 34 | } 35 | 36 | private extension AddLinkCoordinator { 37 | func showAddLinkVC() { 38 | let vc = viewControllerFactory.makeAddLinkVC(isNavigationBarHidden: isNavigationBarHidden) 39 | vc.onLinkInputCompleted = { [weak self] linkURL in 40 | self?.showSelectClipVC(linkURL: linkURL) 41 | } 42 | vc.onPopToRoot = { [weak self] in 43 | self?.router.dismiss(animated: false, completion: { 44 | self?.onFinish?() 45 | }) 46 | } 47 | router.setRoot(vc, animated: true, hideBottomBarWhenPushed: true) 48 | } 49 | 50 | func showSelectClipVC(linkURL: String) { 51 | let vc = ViewControllerFactory.shared.makeSelectClipVC(isNavigationBarHidden: isNavigationBarHidden) 52 | vc.linkURL = linkURL 53 | vc.onPopToRoot = { [weak self] in 54 | self?.router.dismiss(animated: false, completion: { 55 | self?.onFinish?() 56 | }) 57 | } 58 | router.push(vc, animated: true) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /TOASTER-iOS/Application/Coordinator/Coordinators/LoginCoordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginCoordinator.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/10/25. 6 | // 7 | 8 | import UIKit 9 | 10 | final class LoginCoordinator: BaseCoordinator, CoordinatorFinishOutput { 11 | 12 | var onFinish: (() -> Void)? 13 | 14 | private let router: RouterProtocol 15 | private let viewControllerFactory: ViewControllerFactoryProtocol 16 | private let coordinatorFactory: CoordinatorFactoryProtocol 17 | 18 | init( 19 | router: RouterProtocol, 20 | viewControllerFactory: ViewControllerFactoryProtocol, 21 | coordinatorFactory: CoordinatorFactoryProtocol 22 | ) { 23 | self.router = router 24 | self.viewControllerFactory = viewControllerFactory 25 | self.coordinatorFactory = coordinatorFactory 26 | } 27 | 28 | override func start() { 29 | showLoginVC() 30 | } 31 | } 32 | 33 | private extension LoginCoordinator { 34 | func showLoginVC() { 35 | let vc = viewControllerFactory.makeLoginVC() 36 | vc.onLoginCompleted = { [weak self] in 37 | self?.onFinish?() 38 | } 39 | router.setRoot(vc, animated: false) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /TOASTER-iOS/Application/Coordinator/Coordinators/SearchCoordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchCoordinator.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/8/25. 6 | // 7 | 8 | import Foundation 9 | 10 | final class SearchCoordinator: BaseCoordinator, CoordinatorFinishOutput { 11 | 12 | var onFinish: (() -> Void)? 13 | 14 | private let router: RouterProtocol 15 | private let viewControllerFactory: ViewControllerFactoryProtocol 16 | private let coordinatorFactory: CoordinatorFactoryProtocol 17 | 18 | init( 19 | router: RouterProtocol, 20 | viewControllerFactory: ViewControllerFactoryProtocol, 21 | coordinatorFactory: CoordinatorFactoryProtocol 22 | ) { 23 | self.router = router 24 | self.viewControllerFactory = viewControllerFactory 25 | self.coordinatorFactory = coordinatorFactory 26 | } 27 | 28 | override func start() { 29 | showSearchVC() 30 | } 31 | } 32 | 33 | private extension SearchCoordinator { 34 | func showSearchVC() { 35 | let vc = viewControllerFactory.makeSearchVC() 36 | vc.onLinkItemSelected = { [weak self] linkURL, isRead, id in 37 | self?.showLinkWebVC(linkURL: linkURL, isRead: isRead, id: id) 38 | } 39 | vc.onClipItemSelected = { [weak self] id, name in 40 | self?.showDetailClipVC(id: id, name: name) 41 | } 42 | router.setRoot(vc, animated: false) 43 | } 44 | 45 | func showDetailClipVC(id: Int, name: String) { 46 | let vc = viewControllerFactory.makeDetailClipVC() 47 | vc.setupCategory(id: id, name: name) 48 | vc.onLinkSelected = { [weak self] linkURL, isRead, id in 49 | self?.showLinkWebVC(linkURL: linkURL, isRead: isRead, id: id) 50 | } 51 | router.push(vc, animated: true, hideBottomBarWhenPushed: true) 52 | } 53 | 54 | func showLinkWebVC(linkURL: String, isRead: Bool, id: Int) { 55 | let vc = viewControllerFactory.makeLinkWebVC() 56 | vc.setupDataBind(linkURL: linkURL, isRead: isRead, id: id) 57 | vc.onBack = { [weak self] in 58 | self?.router.pop(animated: true) 59 | } 60 | router.push(vc, animated: true, hideBottomBarWhenPushed: true) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Components/.gitkeep -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/ToasterBottomSheet/BottomType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BottomType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/3/24. 6 | // 7 | 8 | import UIKit 9 | 10 | enum BottomType { 11 | case white, gray 12 | 13 | var color: UIColor { 14 | switch self { 15 | case .white: 16 | return .toasterWhite 17 | case .gray: 18 | return .gray50 19 | } 20 | } 21 | 22 | var alignment: NSTextAlignment { 23 | return .left 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/ToasterNavigationController/ToasterNavigationType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToasterNavigationType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/6/24. 6 | // 7 | 8 | import UIKit 9 | 10 | struct ToasterNavigationType { 11 | var hasBackButton: Bool // backButton 존재 여부 12 | var hasRightButton: Bool // rightButton 존재 여부 13 | 14 | var mainTitle: StringOrImageType // mainTitle 15 | var rightButton: StringOrImageType // rightButton 16 | var rightButtonAction: () -> Void // rightButton의 액션 17 | } 18 | 19 | enum StringOrImageType { 20 | case string(String) 21 | case image(UIImage) 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/ToasterTipView/TipUserDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TipUserDefaults.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 10/29/24. 6 | // 7 | 8 | import Foundation 9 | 10 | enum TipUserDefaults { 11 | static let isShowHomeViewToolTip = "homeViewToolTip" 12 | static let isShowDetailClipViewToolTip = "detailClipViewToolTip" 13 | static let isShowLinkWebViewToolTip = "linkWebViewToolTip" 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/ToasterToastMessage/ToastStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToasterToastMessage.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/2/24. 6 | // 7 | 8 | import UIKit 9 | 10 | enum ToastStatus { 11 | case check, warning 12 | 13 | var icon: UIImage { 14 | switch self { 15 | case .check: 16 | return .icCheck18White 17 | case .warning: 18 | return .icAlert18White 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Components/ToasterToastMessage/ToasterToastMessageView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToasterToastMessageView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/3/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class ToasterToastMessageView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let toastImage = UIImageView().then { 18 | $0.tintColor = .toasterWhite 19 | } 20 | 21 | private let toastLabel = UILabel().then { 22 | $0.textColor = .toasterWhite 23 | $0.font = .suitBold(size: 14) 24 | } 25 | 26 | // MARK: - Life Cycles 27 | 28 | override init(frame: CGRect) { 29 | super.init(frame: frame) 30 | 31 | setupStyle() 32 | setupHierarchy() 33 | setupLayout() 34 | } 35 | 36 | @available(*, unavailable) 37 | required init?(coder: NSCoder) { 38 | fatalError("init(coder:) has not been implemented") 39 | } 40 | } 41 | 42 | // MARK: - Extensions 43 | 44 | extension ToasterToastMessageView { 45 | func setupDataBind(message: String, status: ToastStatus) { 46 | toastImage.image = status.icon 47 | toastLabel.text = message 48 | } 49 | } 50 | 51 | // MARK: - Private Extensions 52 | 53 | private extension ToasterToastMessageView { 54 | func setupStyle() { 55 | self.backgroundColor = .gray800 56 | self.makeRounded(radius: 22) 57 | } 58 | 59 | func setupHierarchy() { 60 | addSubviews(toastImage, toastLabel) 61 | } 62 | 63 | func setupLayout() { 64 | toastImage.snp.makeConstraints { 65 | $0.leading.equalToSuperview().inset(22) 66 | $0.centerY.equalToSuperview() 67 | $0.size.equalTo(18) 68 | } 69 | toastLabel.snp.makeConstraints { 70 | $0.leading.equalTo(toastImage.snp.trailing).offset(10) 71 | $0.centerY.equalToSuperview() 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Consts/FontLiterals.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FontLiterals.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 12/31/23. 6 | // 7 | 8 | import UIKit 9 | 10 | enum FontName: String { 11 | case suitExtraBold = "SUIT-ExtraBold" 12 | case suitBold = "SUIT-Bold" 13 | case suitSemiBold = "SUIT-SemiBold" 14 | case suitMedium = "SUIT-Medium" 15 | case suitRegular = "SUIT-Regular" 16 | } 17 | 18 | extension UIFont { 19 | @nonobjc class func suitExtraBold(size: CGFloat) -> UIFont { 20 | return UIFont(name: FontName.suitExtraBold.rawValue, size: size)! 21 | } 22 | 23 | @nonobjc class func suitBold(size: CGFloat) -> UIFont { 24 | return UIFont(name: FontName.suitBold.rawValue, size: size)! 25 | } 26 | 27 | @nonobjc class func suitSemiBold(size: CGFloat) -> UIFont { 28 | return UIFont(name: FontName.suitSemiBold.rawValue, size: size)! 29 | } 30 | 31 | @nonobjc class func suitMedium(size: CGFloat) -> UIFont { 32 | return UIFont(name: FontName.suitMedium.rawValue, size: size)! 33 | } 34 | 35 | @nonobjc class func suitRegular(size: CGFloat) -> UIFont { 36 | return UIFont(name: FontName.suitRegular.rawValue, size: size)! 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Consts/Notification.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Notification.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by mini on 6/4/25. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Notification.Name { 11 | static let refreshTokenExpired = Notification.Name("refreshTokenExpired") 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Consts/StringLiterals.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringLiterals.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/01. 6 | // 7 | 8 | import Foundation 9 | 10 | enum StringLiterals { 11 | enum Login { 12 | static let onboarding1 = "복사한 링크를\n손쉽게 저장하고" 13 | static let onboarding2 = "타이머를 설정하고\n링크를 리마인드 받아요" 14 | static let onboarding3 = "나의 링크 열람 현황까지\n한 눈에!" 15 | static let subTitle = "더 이상 링크를 태우지 마세요\n토스트 먹듯이 간편하게," 16 | static let appleButton = "Apple 계정으로 시작하기" 17 | static let kakaoButton = "카카오 계정으로 시작하기" 18 | } 19 | 20 | enum Tabbar { 21 | static let home = "HOME" 22 | static let clip = "CLIP" 23 | static let timer = "TIMER" 24 | static let search = "SEARCH" 25 | } 26 | 27 | enum Button { 28 | static let okay = "확인" 29 | static let complete = "완료" 30 | static let delete = "삭제" 31 | static let close = "닫기" 32 | static let cancel = "취소" 33 | static let next = "다음" 34 | static let editTitle = "제목 편집" 35 | } 36 | 37 | enum Placeholder { 38 | static let search = "검색어를 입력해주세요" 39 | static let copyLink = "복사한 링크를 붙여 넣어 주세요" 40 | static let addClip = "새로운 클립의 이름을 입력해주세요" 41 | } 42 | 43 | enum ToastMessage { 44 | static let noticeMaxClip = "클립 추가는 15개까지 가능해요" 45 | static let completeAddClip = "클립 생성 완료!" 46 | static let completeEditClip = "클립 수정 완료!" 47 | static let completeDeleteClip = "클립 삭제 완료" 48 | static let completeDeleteLink = "링크 삭제 완료" 49 | static let completeReadLink = "링크 열람 완료" 50 | static let cancelReadLink = "링크 열람 취소" 51 | static let completeSetTimer = "타이머 설정 완료!" 52 | static let completeEditTimer = "타이머 수정 완료!" 53 | static let completeDeleteTimer = "타이머 삭제 완료" 54 | static let completeEditTitle = "제목 편집 완료" 55 | static let noticeSetTimer = "한 클립당 하나의 타이머만 설정 가능해요" 56 | static let noticeMaxTimer = "타이머는 최대 다섯 개까지 설정 가능해요" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/CancelBag.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CancelBag.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/29/24. 6 | // 7 | 8 | import Combine 9 | 10 | class CancelBag { 11 | var cancellables = Set() 12 | 13 | deinit { 14 | cancellables.forEach { $0.cancel() } 15 | cancellables.removeAll() 16 | } 17 | } 18 | 19 | extension AnyCancellable { 20 | func store(in cancelBag: CancelBag) { 21 | cancelBag.cancellables.insert(self) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/Publisher+Driver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Publisher+Driver.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/30/24. 6 | // 7 | 8 | import Combine 9 | import Foundation 10 | 11 | public typealias Driver = AnyPublisher 12 | 13 | public extension Publisher { 14 | func asDriver() -> Driver { 15 | return self.catch { _ in Empty() } 16 | .receive(on: RunLoop.main) 17 | .eraseToAnyPublisher() 18 | } 19 | 20 | static func just(_ output: Output) -> Driver { 21 | return Just(output).eraseToAnyPublisher() 22 | } 23 | 24 | static func empty() -> Driver { 25 | return Empty().eraseToAnyPublisher() 26 | } 27 | 28 | func mapVoid() -> AnyPublisher { 29 | return self.map { _ in () } 30 | .eraseToAnyPublisher() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/Publisher+Operator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Publisher+Operator.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 12/3/24. 6 | // 7 | 8 | import Combine 9 | import Foundation 10 | 11 | public extension Publisher { 12 | 13 | /** 14 | `networkFlatMap`은 네트워크 함수 호출 시 15 | `flatMap` 연산을 수행하면서, 메모리 누수 방지와 에러 처리를 위한 반복 코드 사용을 줄이기 위한 커스텀 Operator입니다. 16 | */ 17 | func networkFlatMap( 18 | _ weakSelf: SelfPublisher?, 19 | _ firstTransform: @escaping (SelfPublisher, Output) -> NewPublisher, 20 | onError: ((Error) -> Void)? = nil, 21 | _ secondTransform: @escaping (Error) -> AnyPublisher = { _ in 22 | Empty().eraseToAnyPublisher() 23 | } 24 | ) -> AnyPublisher { 25 | 26 | self.flatMap { [weak weakSelf] output -> AnyPublisher in 27 | guard let weakSelf else { return Empty().eraseToAnyPublisher() } 28 | return firstTransform(weakSelf, output) 29 | .catch { 30 | onError?($0) 31 | return secondTransform($0) 32 | } 33 | .eraseToAnyPublisher() 34 | } 35 | .eraseToAnyPublisher() 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/Publisher+UIBarButtonItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Publisher+UIBarButtonItem.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/29/24. 6 | // 7 | 8 | import Combine 9 | import UIKit 10 | 11 | extension UIBarButtonItem { 12 | func publisher() -> UIBarButtonItemPublisher { 13 | UIBarButtonItemPublisher(item: self) 14 | } 15 | } 16 | 17 | final class UIBarButtonItemSubscription: Subscription where S.Input == Item { 18 | private var subscriber: S? 19 | private let item: Item 20 | 21 | init(subscriber: S, item: Item) { 22 | self.subscriber = subscriber 23 | self.item = item 24 | item.target = self 25 | item.action = #selector(eventHandler) 26 | } 27 | 28 | func request(_ demand: Subscribers.Demand) {} 29 | 30 | func cancel() { 31 | subscriber = nil 32 | } 33 | 34 | @objc 35 | private func eventHandler() { 36 | _ = subscriber?.receive(item) 37 | } 38 | } 39 | 40 | public struct UIBarButtonItemPublisher: Publisher { 41 | public typealias Output = Item 42 | public typealias Failure = Never 43 | 44 | private let item: Item 45 | 46 | init(item: Item) { 47 | self.item = item 48 | } 49 | 50 | public func receive(subscriber: S) where S: Subscriber, 51 | S.Failure == Self.Failure, 52 | S.Input == Self.Output { 53 | let subscription = UIBarButtonItemSubscription( 54 | subscriber: subscriber, 55 | item: item) 56 | subscriber.receive(subscription: subscription) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/Publisher+UIButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Publisher+UIButton.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 10/3/24. 6 | // 7 | 8 | import Combine 9 | import UIKit 10 | 11 | extension UIButton { 12 | func tapPublisher() -> AnyPublisher { 13 | publisher(for: .touchUpInside) 14 | .map { _ in () } 15 | .eraseToAnyPublisher() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Combine+/Publisher+UIControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Publisher+UIControl.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/29/24. 6 | // 7 | 8 | import Combine 9 | import UIKit 10 | 11 | extension UIControl { 12 | func publisher(for events: UIControl.Event) -> UIControlPublisher { 13 | UIControlPublisher(control: self, events: events) 14 | } 15 | } 16 | 17 | final class UIControlSubscription: Subscription where S.Input == Control { 18 | private var subscriber: S? 19 | private let control: Control 20 | 21 | init(subscriber: S, control: Control, event: UIControl.Event) { 22 | self.subscriber = subscriber 23 | self.control = control 24 | control.addTarget(self, action: #selector(eventHandler), for: event) 25 | } 26 | 27 | func request(_ demand: Subscribers.Demand) {} 28 | 29 | func cancel() { 30 | subscriber = nil 31 | } 32 | 33 | @objc 34 | private func eventHandler() { 35 | _ = subscriber?.receive(control) 36 | } 37 | } 38 | 39 | public struct UIControlPublisher: Publisher { 40 | public typealias Output = Control 41 | public typealias Failure = Never 42 | 43 | private let control: Control 44 | private let controlEvents: UIControl.Event 45 | 46 | init(control: Control, events: UIControl.Event) { 47 | self.control = control 48 | self.controlEvents = events 49 | } 50 | 51 | public func receive(subscriber: S) where S: Subscriber, 52 | S.Failure == UIControlPublisher.Failure, 53 | S.Input == UIControlPublisher.Output { 54 | let subscription = UIControlSubscription( 55 | subscriber: subscriber, 56 | control: control, 57 | event: controlEvents 58 | ) 59 | subscriber.receive(subscription: subscription) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/Foundation+/NSObject+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSObject+.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/6/24. 6 | // 7 | 8 | import Foundation 9 | 10 | extension NSObject { 11 | static var className: String { 12 | return String(describing: self) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/UIKit+/UIColor+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 12/29/23. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | convenience init(hex: String, alpha: CGFloat = 1.0) { 12 | var hexFormatted: String = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).uppercased() 13 | 14 | if hexFormatted.hasPrefix("#") { 15 | hexFormatted = String(hexFormatted.dropFirst()) 16 | } 17 | 18 | assert(hexFormatted.count == 6, "Invalid hex code used.") 19 | var rgbValue: UInt64 = 0 20 | Scanner(string: hexFormatted).scanHexInt64(&rgbValue) 21 | 22 | self.init(red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0, 23 | green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0, 24 | blue: CGFloat(rgbValue & 0x0000FF) / 255.0, alpha: alpha) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/UIKit+/UIStackView+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIStackVIew+.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 12/29/23. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIStackView { 11 | 12 | /// 한 번에 여러 개의 UIView 또는 UIView의 하위 클래스 객체들을 상위 UIStackView에 추가 13 | func addArrangedSubviews(_ views: UIView...) { 14 | views.forEach { 15 | self.addArrangedSubview($0) 16 | $0.translatesAutoresizingMaskIntoConstraints = false 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/UIKit+/UITextField+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 12/29/23. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITextField { 11 | 12 | /// 텍스트필드 안쪽에 패딩 추가 13 | /// - Parameter left: 왼쪽에 추가할 패딩 너비 14 | /// - Parameter right: 오른쪽에 추가할 패딩 너비 15 | func addPadding(left: CGFloat? = nil, right: CGFloat? = nil) { 16 | if let left { 17 | leftView = UIView(frame: CGRect(x: 0, y: 0, width: left, height: 0)) 18 | leftViewMode = .always 19 | } 20 | if let right { 21 | rightView = UIView(frame: CGRect(x: 0, y: 0, width: right, height: 0)) 22 | rightViewMode = .always 23 | } 24 | } 25 | 26 | /// Placeholder의 색상을 바꿔주는 메서드 27 | func changePlaceholderColor(forPlaceHolder: String, forColor: UIColor) { 28 | self.attributedPlaceholder = NSAttributedString(string: forPlaceHolder, attributes: [NSAttributedString.Key.foregroundColor: forColor]) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Extensions/UIKit+/UIView+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 12/29/23. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIView { 11 | 12 | /// 한 번에 여러 개의 UIView 또는 UIView의 하위 클래스 객체들을 상위 UIView에 추가 13 | func addSubviews(_ views: UIView...) { 14 | views.forEach { 15 | self.addSubview($0) 16 | $0.translatesAutoresizingMaskIntoConstraints = false 17 | } 18 | } 19 | 20 | /// UIView 의 모서리가 둥근 정도를 설정 21 | /// - Parameter radius: radius 값 22 | /// - Parameter maskedCorners: radius를 적용할 코너 지정 23 | func makeRounded(radius: CGFloat) { 24 | self.clipsToBounds = true 25 | self.layer.cornerRadius = radius 26 | } 27 | } 28 | 29 | extension UIView { 30 | 31 | // MARK: - 기기 대응 32 | 33 | func getDeviceWidth() -> CGFloat { 34 | return UIScreen.main.bounds.width 35 | } 36 | 37 | func getDeviceHeight() -> CGFloat { 38 | return UIScreen.main.bounds.height 39 | } 40 | 41 | /// 아이폰 13 미니(width 375)를 기준으로 레이아웃을 잡고, 기기의 width 사이즈를 곱해 대응 값을 구할 때 사용 42 | func convertByWidthRatio(_ convert: CGFloat) -> CGFloat { 43 | return convert * (getDeviceWidth() / 375) 44 | } 45 | 46 | /// 아이폰 13 미니(height 812)를 기준으로 레이아웃을 잡고, 기기의 height 사이즈를 곱해 대응 값을 구할 때 사용 47 | func convertByHeightRatio(_ convert: CGFloat) -> CGFloat { 48 | return convert * (getDeviceHeight() / 812) 49 | } 50 | 51 | /// 아이폰 13 미니(width 375)를 기준으로 레이아웃을 잡고, 기기의 width 사이즈를 곱해 대응 값을 구할 때 사용 52 | func convertByReverseWidthRatio(_ convert: CGFloat) -> CGFloat { 53 | return convert * (375 / getDeviceWidth()) 54 | } 55 | 56 | /// 아이폰 13 미니(height 812)를 기준으로 레이아웃을 잡고, 기기의 height 사이즈를 곱해 대응 값을 구할 때 사용 57 | func convertByReverseHeightRatio(_ convert: CGFloat) -> CGFloat { 58 | return convert * (812 / getDeviceHeight()) 59 | } 60 | 61 | /// 노치가 있는지 없는지 Bool 값 반환 62 | var hasNotch: Bool { 63 | return !( (UIScreen.main.bounds.width / UIScreen.main.bounds.height) > 0.5 ) 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Protocols/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Protocols/.gitkeep -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Protocols/AuthenticationAdapterProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthenticationAdapterProtocol.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/4/24. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol AuthenticationAdapterProtocol { 11 | var adapterType: String { get } 12 | 13 | func login() async throws -> SocialLoginTokenModel 14 | 15 | func logout() async throws -> Bool 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Protocols/ViewModelType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewModelType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 9/27/24. 6 | // 7 | 8 | import Combine 9 | import Foundation 10 | 11 | protocol ViewModelType { 12 | associatedtype Input 13 | associatedtype Output 14 | 15 | func transform(_ input: Input, cancelBag: CancelBag) -> Output 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/172.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/196.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/216.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/48.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/55.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/66.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/88.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/AppIcon.appiconset/92.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_clip.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_clip@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_clip@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/clip_empty.imageset/img_clip@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_link.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_link@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_link@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/detail_clip_empty.imageset/img_link@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_alarm.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_alarm@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_alarm@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm.imageset/img_alarm@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_alarm_ios.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_alarm_ios@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_alarm_ios@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_alarm_ios.imageset/img_alarm_ios@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_search.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_search@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_search@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_search.imageset/img_search@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_timer.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_timer@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_timer@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/EmptyView/img_timer.imageset/img_timer@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_dark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_alert_18_dark.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_dark.imageset/ic_alert_18_dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_alert_18_white.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "ic_alert_18_white@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "ic_alert_18_white@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_alert_18_white.imageset/ic_alert_18_white@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_arrow_18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_arrow_18.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_arrow_18.imageset/ic_arrow_18.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_check_18.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18.imageset/ic_check_18.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_check_18_white.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "ic_check_18_white@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "ic_check_18_white@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_check_18_white.imageset/ic_check_18_white@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_plus_18_orange.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_plus_18_orange.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_plus_18_orange.imageset/ic_plus_18_orange.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_search_cancle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_search_cancle.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_18/ic_search_cancle.imageset/ic_search_cancle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/alarm_disabled_20.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "alarm_disabled_20.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/alarm_disabled_20.imageset/alarm_disabled_20.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/ic_arrow_20.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_arrow_20.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/ic_arrow_20.imageset/ic_arrow_20.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/ic_search_20.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_search_20.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_20/ic_search_20.imageset/ic_search_20.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_alarm_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_alarm_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_alarm_24.imageset/ic_alarm_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_all_clip_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_all_clip_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_all_clip_24.imageset/ic_all_clip_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_apple_login_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_apple_login_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_apple_login_24.imageset/ic_apple_login_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow2_back_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_arrow2_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow2_back_24.imageset/ic_arrow2_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow2_forward_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_arrow2_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow2_forward_24.imageset/ic_arrow2_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow_left_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_arrow_left_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_arrow_left_24.imageset/ic_arrow_left_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_cancle_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_cancle_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_cancle_24.imageset/ic_cancle_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_clip_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_24.imageset/ic_clip_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_24_black.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_clip_24_black.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_24_black.imageset/ic_clip_24_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_full_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_clip_full_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_clip_full_24.imageset/ic_clip_full_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_close_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_close_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_close_24.imageset/ic_close_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_edit_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_edit_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_edit_24.imageset/ic_edit_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_home_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_home_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_home_24.imageset/ic_home_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_kakao_login_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_kakao_login_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_more_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_more_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_more_24.imageset/ic_more_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_my_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_my_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_my_24.imageset/ic_my_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_pin_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_pin_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_pin_24.imageset/ic_pin_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_plus_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_plus_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_plus_24.imageset/ic_plus_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_read.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_read.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_read.imageset/ic_read.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_reload_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_reload_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_reload_24.imageset/ic_reload_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_safari_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_safari_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_safari_24.imageset/ic_safari_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_search_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_search_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_search_24.imageset/ic_search_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_settings_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_settings_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_settings_24.imageset/ic_settings_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_share.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_share.imageset/ic_share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_timer_24.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_timer_24.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_24/ic_timer_24.imageset/ic_timer_24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/btn_plus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "btn_plus.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/btn_plus.imageset/btn_plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/fab_plus.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fab_plus.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/fab_plus.imageset/fab_plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/ic_delete_28.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_delete_28.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Icons_plus/ic_delete_28.imageset/ic_delete_28.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_bmsite.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_bmsite@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_bmsite@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_bmsite.imageset/img_bmsite@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_indicator.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_indicator.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_indicator.imageset/img_indicator.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_indicator_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_indicator_selected.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_indicator_selected.imageset/img_indicator_selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_login.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_login@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_login@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_login.imageset/img_login@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_onboarding.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_onboarding@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_onboarding@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding.imageset/img_onboarding@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_onboarding2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_onboarding2@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_onboarding2@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding2.imageset/img_onboarding2@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_onboarding3.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_onboarding3@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_onboarding3@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_onboarding3.imageset/img_onboarding3@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_thumbnail.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "img_thumbnail@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "img_thumbnail@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/img_thumbnail.imageset/img_thumbnail@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "loginTitle.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "loginTitle@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "loginTitle@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/loginTitle.imageset/loginTitle@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "profile.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "profile@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "profile@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/profile.imageset/profile@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "symbol.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "symbol@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "symbol@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/symbol.imageset/symbol@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "wordmark.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "wordmark@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "wordmark@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark@2x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Assets/Assets.xcassets/Image/wordmark.imageset/wordmark@3x.png -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/black850.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x26", 9 | "green" : "0x26", 10 | "red" : "0x26" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/black900.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x19", 9 | "green" : "0x19", 10 | "red" : "0x19" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray100.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE5", 9 | "green" : "0xE5", 10 | "red" : "0xE5" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray150.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xD9", 9 | "green" : "0xD9", 10 | "red" : "0xD9" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray200.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xCC", 9 | "green" : "0xCC", 10 | "red" : "0xCC" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray300.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xB2", 9 | "green" : "0xB2", 10 | "red" : "0xB2" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray400.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x99", 9 | "green" : "0x99", 10 | "red" : "0x99" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray50.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF2", 9 | "green" : "0xF2", 10 | "red" : "0xF2" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray500.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x7F", 9 | "green" : "0x7F", 10 | "red" : "0x7F" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray600.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x66", 9 | "green" : "0x66", 10 | "red" : "0x66" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray700.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x4C", 9 | "green" : "0x4C", 10 | "red" : "0x4C" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/gray800.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x33", 9 | "green" : "0x33", 10 | "red" : "0x33" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/loginKakao.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0xE5", 10 | "red" : "0xFE" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster100.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xD7", 9 | "green" : "0xDE", 10 | "red" : "0xFC" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster200.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xC4", 9 | "green" : "0xCE", 10 | "red" : "0xFB" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster300.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xB0", 9 | "green" : "0xBD", 10 | "red" : "0xF9" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster400.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x9C", 9 | "green" : "0xAD", 10 | "red" : "0xF8" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster50.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF1", 9 | "green" : "0xF4", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toaster800.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x4D", 9 | "green" : "0x6B", 10 | "red" : "0xF2" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF8", 9 | "green" : "0xF8", 10 | "red" : "0xF8" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterBlack.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0x00", 10 | "red" : "0x00" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterError.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x30", 9 | "green" : "0x3B", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterPrimary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x39", 9 | "green" : "0x5A", 10 | "red" : "0xF0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterSuccess.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x45", 9 | "green" : "0x83", 10 | "red" : "0x0E" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterWarning.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x2F", 9 | "green" : "0xBC", 10 | "red" : "0xF6" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Assets/Colors.xcassets/toasterWhite.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0xFF", 10 | "red" : "0xFE" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/.gitkeep -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/SUIT-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/SUIT-Bold.otf -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/SUIT-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/SUIT-ExtraBold.otf -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/SUIT-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/SUIT-Medium.otf -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/SUIT-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/SUIT-Regular.otf -------------------------------------------------------------------------------- /TOASTER-iOS/Global/Resources/Fonts/SUIT-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Global/Resources/Fonts/SUIT-SemiBold.otf -------------------------------------------------------------------------------- /TOASTER-iOS/Network/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Link-MIND/TOASTER-iOS/784eacf9d0648469e0c42879b78f73e36cc5792d/TOASTER-iOS/Network/.gitkeep -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Auth/AuthTargetType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthAPI.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | import Moya 11 | 12 | enum AuthTargetType { 13 | case postSocialLogin(socialToken: String, 14 | requestBody: PostSocialLoginRequestDTO) 15 | case postRefreshToken 16 | case postLogout 17 | case deleteWithdraw 18 | case postTokenHealth(tokenType: TokenHealthType) 19 | } 20 | 21 | extension AuthTargetType: BaseTargetType { 22 | 23 | var headerType: HeaderType { 24 | switch self { 25 | case .postSocialLogin(let socialToken, _): return .socialTokenHeader(socialToken: socialToken) 26 | case .postRefreshToken: return .refreshTokenHeader 27 | case .postTokenHealth(let tokenType): return .tokenHealthHeader(tokenHealthType: tokenType) 28 | default: return .accessTokenHeader 29 | } 30 | } 31 | 32 | var utilPath: UtilPath { return .auth } 33 | var pathParameter: String? { return .none } 34 | var queryParameter: [String: Any]? { return .none } 35 | 36 | var requestBodyParameter: Codable? { 37 | switch self { 38 | case .postSocialLogin(_, let requestBody): return requestBody 39 | default: return .none 40 | } 41 | } 42 | 43 | var path: String { 44 | switch self { 45 | case .postSocialLogin: return utilPath.rawValue 46 | case .postRefreshToken: return utilPath.rawValue + "/token" 47 | case .postLogout: return utilPath.rawValue + "/sign-out" 48 | case .deleteWithdraw: return utilPath.rawValue + "/withdraw" 49 | case .postTokenHealth: return utilPath.rawValue + "/token/health" 50 | } 51 | } 52 | 53 | var method: Moya.Method { 54 | switch self { 55 | case .postSocialLogin: return .post 56 | case .postRefreshToken: return .post 57 | case .postLogout: return .post 58 | case .deleteWithdraw: return .delete 59 | case .postTokenHealth: return .post 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Auth/DTO/Request/PostSocialLoginRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostSocialLoginRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostSocialLoginRequestDTO: Codable { 11 | let socialType: String 12 | let fcmToken: String 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Auth/DTO/Response/PostRefreshTokenResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostRefreshTokenResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostRefreshTokenResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PostRefreshTokenResponseData 14 | } 15 | 16 | struct PostRefreshTokenResponseData: Codable { 17 | let accessToken: String 18 | let refreshToken: String 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Auth/DTO/Response/PostSocialLoginResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostSocialLoginResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostSocialLoginResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PostSocialLoginResponseData 14 | } 15 | 16 | struct PostSocialLoginResponseData: Codable { 17 | let userId: Int 18 | let accessToken, refreshToken: String 19 | let fcmToken: String? 20 | let isRegistered, fcmIsAllowed: Bool 21 | let profile: String 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Auth/DTO/Response/PostTokenHealthResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostTokenHealthResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 4/3/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostTokenHealthResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PostTokenHealthResponseData 14 | } 15 | 16 | struct PostTokenHealthResponseData: Codable { 17 | let tokenHealth: Bool 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Base/BaseAPIService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseAPIService.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | class BaseAPIService { 11 | 12 | /// 200 받았을 때 decoding 할 데이터가 있는 경우 (대부분의 GET) 13 | func fetchNetworkResult(statusCode: Int, data: Data) -> NetworkResult { 14 | switch statusCode { 15 | case 200, 201, 204: 16 | if let decodedData = fetchDecodeData(data: data, responseType: T.self) { 17 | return .success(decodedData) 18 | } else { return .decodeErr } 19 | case 400: return .badRequest 20 | case 401: return .unAuthorized 21 | case 404: return .notFound 22 | case 422: return .unProcessable 23 | case 500: return .serverErr 24 | default: return .networkFail 25 | } 26 | } 27 | 28 | /// 200 받았을 때 decoding 할 데이터가 없는 경우 (대부분의 PATCH, PUT, DELETE) 29 | func fetchNetworkResult(statusCode: Int, data: Data) -> NetworkResult { 30 | switch statusCode { 31 | case 200, 201, 204: return .success(nil) 32 | case 400: return .badRequest 33 | case 401: return .unAuthorized 34 | case 404: return .notFound 35 | case 422: return .unProcessable 36 | case 500: return .serverErr 37 | default: return .networkFail 38 | } 39 | } 40 | 41 | /// API를 통해 받아온 Data를 T Type 형태로 Decode하는 함수 42 | func fetchDecodeData(data: Data, responseType: T.Type) -> T? { 43 | let decoder = JSONDecoder() 44 | 45 | if let decodedData = try? decoder.decode(responseType, from: data) { 46 | return decodedData 47 | } else { return nil } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Base/NetworkResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkResult.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | enum NetworkResult: Error { 11 | 12 | case success(T?) 13 | 14 | case networkFail // 네트워크 연결 실패했을 때 15 | case decodeErr // 데이터는 받아왔으나 DTO 형식으로 decode가 되지 않을 때 16 | 17 | case badRequest // BAD REQUEST EXCEPTION (400) 18 | case unAuthorized // UNAUTHORIZED EXCEPTION (401) 19 | case notFound // NOT FOUND (404) 20 | case unProcessable // UNPROCESSABLE_ENTITY (422) 21 | case serverErr // INTERNAL_SERVER_ERROR (500번대) 22 | 23 | var stateDescription: String { 24 | switch self { 25 | case .success: return "🍞🔥 SUCCESS 🔥🍞" 26 | 27 | case .networkFail: return "🍞🔥 NETWORK FAIL 🔥🍞" 28 | case .decodeErr: return "🍞🔥 DECODED_ERROR 🔥🍞" 29 | 30 | case .badRequest: return "🍞🔥 BAD REQUEST EXCEPTION 🔥🍞" 31 | case .unAuthorized: return "🍞🔥 UNAUTHORIZED EXCEPTION 🔥🍞" 32 | case .notFound: return "🍞🔥 NOT FOUND 🔥🍞" 33 | case .unProcessable: return "🍞🔥 UNPROCESSABLE ENTITY 🔥🍞" 34 | case .serverErr: return "🍞🔥 INTERNAL SERVER_ERROR 🔥🍞" 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Base/NetworkService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkService.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | final class NetworkService { 11 | 12 | static let shared = NetworkService() 13 | 14 | private init() {} 15 | 16 | let authService: AuthAPIServiceProtocol = AuthAPIService() 17 | let userService: UserAPIServiceProtocol = UserAPIService() 18 | let toastService: ToasterAPIServiceProtocol = ToasterAPIService() 19 | let clipService: ClipAPIServiceProtocol = ClipAPIService() 20 | let searchService: SearchAPIServiceProtocol = SearchAPIService() 21 | let timerService: TimerAPIServiceProtocol = TimerAPIService() 22 | let popupService: PopupAPIServiceProtocol = PopupAPIService() 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Base/NoneDataResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostAddCategoryResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct NoneDataResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: String? 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Request/PatchEditNameCategoryRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditNameCategoryRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/16/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditNameCategoryRequestDTO: Codable { 11 | let categoryId: Int 12 | let newTitle: String 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Request/PatchEditPriorityCategoryRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditPriorityCategoryRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/16/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditPriorityCategoryRequestDTO: Codable { 11 | let categoryId, newPriority: Int 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Request/PostAddCategoryRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostAddCategoryRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostAddCategoryRequestDTO: Codable { 11 | let categoryTitle: String 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Response/GetAllCategoryResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetAllCategoryResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetAllCategoryResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetAllCategoryResponseData 14 | } 15 | 16 | struct GetAllCategoryResponseData: Codable { 17 | let toastNumberInEntire: Int 18 | let categories: [GetAllCategoryData] 19 | } 20 | 21 | struct GetAllCategoryData: Codable { 22 | let categoryId: Int 23 | let categoryTitle: String 24 | let toastNum: Int 25 | } 26 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Response/GetCheckCategoryResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetCheckCategoryResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetCheckCategoryResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetCheckCategoryResponseData 14 | } 15 | 16 | struct GetCheckCategoryResponseData: Codable { 17 | let isDupicated: Bool 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Clip/DTO/Response/GetDetailCategoryResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetDetailCategoryResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetDetailCategoryResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetDetailCategoryResponseData 14 | } 15 | 16 | struct GetDetailCategoryResponseData: Codable { 17 | let allToastNum: Int 18 | let toastListDto: [ToastListDto] 19 | } 20 | 21 | // MARK: - ToastListDto 22 | struct ToastListDto: Codable { 23 | let toastId: Int 24 | let toastTitle: String 25 | let linkUrl: String 26 | let isRead: Bool 27 | let categoryTitle: String? 28 | let thumbnailUrl: String? 29 | } 30 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Popup/DTO/GetPopupInfoResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetPopupInfoResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/23/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetPopupInfoResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetPopupInfoResponseData 14 | } 15 | 16 | struct GetPopupInfoResponseData: Codable { 17 | let popupList: [PopupList] 18 | } 19 | 20 | struct PopupList: Codable { 21 | let id: Int 22 | let image, activeStartDate, activeEndDate, linkUrl: String 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Popup/DTO/PatchPopupHiddenRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchPopupHiddenRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/23/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchPopupHiddenRequestDTO: Codable { 11 | let popupId, hideDate: Int 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Popup/DTO/PatchPopupHiddenResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchPopupHiddenResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/23/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchPopupHiddenResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PatchPopupHiddenResponseData 14 | } 15 | 16 | struct PatchPopupHiddenResponseData: Codable { 17 | let popupID: Int 18 | let hideUntil: String 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Popup/PopupTargetType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PopupTargetType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/23/24. 6 | // 7 | 8 | import Foundation 9 | 10 | import Moya 11 | 12 | enum PopupTargetType { 13 | case getPopupInfo 14 | case patchEditPopupHidden(requestBody: PatchPopupHiddenRequestDTO) 15 | } 16 | 17 | extension PopupTargetType: BaseTargetType { 18 | var headerType: HeaderType { return .accessTokenHeader } 19 | var utilPath: UtilPath { return .popup } 20 | var pathParameter: String? { return .none } 21 | var queryParameter: [String: Any]? { return .none } 22 | 23 | var requestBodyParameter: Codable? { 24 | switch self { 25 | case .patchEditPopupHidden(let body): return body 26 | default: return .none 27 | } 28 | } 29 | 30 | var path: String { return utilPath.rawValue } 31 | 32 | var method: Moya.Method { 33 | switch self { 34 | case .getPopupInfo: return .get 35 | case .patchEditPopupHidden: return .patch 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Search/DTO/GetMainPageSearchResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetMainPageSearchResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetMainPageSearchResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetMainPageSearchResponseData? 14 | } 15 | 16 | struct GetMainPageSearchResponseData: Codable { 17 | let keyword: String 18 | let toasts: [Toast] 19 | var categories: [Category] 20 | } 21 | 22 | struct Category: Codable { 23 | let categoryId: Int 24 | let title: String 25 | let toastNum: Int 26 | } 27 | 28 | struct Toast: Codable { 29 | let toastId: Int 30 | let toastTitle, linkUrl: String 31 | let isRead: Bool 32 | let categoryTitle, thumbnailUrl: String? 33 | } 34 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Search/DTO/GetRecommendSiteResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecommendSiteResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetRecommendSiteResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: [GetRecommendSiteResponseData] 14 | } 15 | 16 | struct GetRecommendSiteResponseData: Codable { 17 | let siteId: Int 18 | let siteTitle: String? 19 | let siteUrl: String? 20 | let siteImg: String? 21 | let siteSub: String? 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Search/SearchTargetType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchTargetType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | import Moya 11 | 12 | enum SearchTargetType { 13 | case getMainPageSearch(searchText: String) 14 | case getRecommendSite 15 | } 16 | 17 | extension SearchTargetType: BaseTargetType { 18 | var headerType: HeaderType { return .accessTokenHeader } 19 | var utilPath: UtilPath { return .search } 20 | 21 | var pathParameter: String? { return .none } 22 | 23 | var queryParameter: [String: Any]? { 24 | switch self { 25 | case .getMainPageSearch(let searchText): 26 | return ["query": searchText] 27 | default: return .none 28 | } 29 | } 30 | 31 | var requestBodyParameter: Codable? { return .none } 32 | 33 | var path: String { 34 | switch self { 35 | case .getMainPageSearch: return utilPath.rawValue + "main/search" 36 | case .getRecommendSite: return utilPath.rawValue + "sites" 37 | } 38 | } 39 | 40 | var method: Moya.Method { return .get } 41 | } 42 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Timer/DTO/Request/PatchEditTimerRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditTimerRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditTimerRequestDTO: Codable { 11 | let remindTime: String 12 | let remindDates: [Int] 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Timer/DTO/Request/PatchEditTimerTitleRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditTimerTitleRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditTimerTitleRequestDTO: Codable { 11 | let newComment: String 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Timer/DTO/Request/PostCreateTimerRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostCreateTimerRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostCreateTimerRequestDTO: Codable { 11 | let categoryId: Int 12 | let remindTime: String 13 | let remindDates: [Int] 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Timer/DTO/Response/GetDetailTimerResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetDetailTimerResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetDetailTimerResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetDetailTimerResponseData 14 | } 15 | 16 | struct GetDetailTimerResponseData: Codable { 17 | let categoryName, remindTime: String 18 | let remindDates: [Int] 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Timer/DTO/Response/GetTimerMainpageResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetTimerMainpageResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetTimerMainpageResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetTimerMainpageResponseData 14 | } 15 | 16 | struct GetTimerMainpageResponseData: Codable { 17 | let completedTimerList: [CompletedTimerList] 18 | let waitingTimerList: [WaitingTimerList] 19 | } 20 | 21 | struct CompletedTimerList: Codable { 22 | let timerId: Int 23 | let categoryId: Int 24 | let remindTime: String 25 | let remindDate: String 26 | let comment: String 27 | } 28 | 29 | struct WaitingTimerList: Codable { 30 | let timerId: Int 31 | let remindTime: String 32 | let remindDates: String 33 | let isAlarm: Bool 34 | let updateAt: String 35 | let comment: String 36 | let categoryId: Int 37 | } 38 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Request/PatchChangeCategoryRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchChangeCategoryRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 10/8/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchChangeCategoryRequestDTO: Codable { 11 | let toastId: Int 12 | let categoryId: Int 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Request/PatchEditLinkTitleRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditLinkTitleRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/04/12. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditLinkTitleRequestDTO: Codable { 11 | let toastId: Int 12 | let title: String 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Request/PatchOpenLinkRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchOpenLinkRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/17/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchOpenLinkRequestDTO: Codable { 11 | let toastId: Int 12 | let isRead: Bool 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Request/PostSaveLinkRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostSaveLinkRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PostSaveLinkRequestDTO: Codable { 11 | let linkUrl: String 12 | let categoryId: Int? 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Response/GetRecentLinkResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecentLinkResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 10/17/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetRecentLinkResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: [GetRecentLinkResponseData] 14 | } 15 | 16 | struct GetRecentLinkResponseData: Codable { 17 | let toastId: Int 18 | let toastTitle: String 19 | let linkUrl: String 20 | let isRead: Bool 21 | let categoryTitle: String? 22 | let thumbnailUrl: String? 23 | } 24 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Response/GetWeeksLinkResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetWeeksLinkResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetWeeksLinkResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: [GetWeeksLinkResponseData] 14 | } 15 | 16 | struct GetWeeksLinkResponseData: Codable { 17 | let linkId: Int 18 | let linkTitle: String 19 | let linkImg: String? 20 | let linkUrl: String 21 | } 22 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Response/PatchChangeCategoryResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchChangeCategoryResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 10/8/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchChangeCategoryResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PatchChangeCategoryResponseData 14 | } 15 | 16 | struct PatchChangeCategoryResponseData: Codable { 17 | let categoryId: Int 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Response/PatchEditLinkTitleResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchEditLinkTitleResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/05/05. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchEditLinkTitleResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PatchEditLinkTitleResponseData 14 | } 15 | 16 | struct PatchEditLinkTitleResponseData: Codable { 17 | let updatedTitle: String 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/Toaster/DTO/Response/PatchOpenLinkResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchOpenLinkResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/15/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchOpenLinkResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PatchOpenLinkResponseData 14 | } 15 | 16 | struct PatchOpenLinkResponseData: Codable { 17 | let isRead: Bool 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/DTO/Request/PatchPushAlarmRequestDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchPushAlarmRequestDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchPushAlarmRequestDTO: Codable { 11 | let allowedPush: Bool 12 | } 13 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/DTO/Response/GetMainPageResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetMainPageResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetMainPageResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetMainPageResponseData 14 | } 15 | 16 | struct GetMainPageResponseData: Codable { 17 | let nickname: String 18 | let readToastNum, allToastNum: Int 19 | let mainCategoryListDto: [MainCategoryListDto] 20 | } 21 | 22 | struct MainCategoryListDto: Codable { 23 | let categoryId: Int 24 | let categoryTitle: String 25 | let toastNum: Int 26 | } 27 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/DTO/Response/GetMyPageResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetMyPageResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetMyPageResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetMyPageResponseData 14 | } 15 | 16 | struct GetMyPageResponseData: Codable { 17 | let nickname: String 18 | let profile: String 19 | let allReadToast: Int 20 | let thisWeekendRead: Int 21 | let thisWeekendSaved: Int 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/DTO/Response/GetSettingPageResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetSettingPageResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetSettingPageResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: GetSettingPageResponseData 14 | } 15 | 16 | struct GetSettingPageResponseData: Codable { 17 | let nickname: String 18 | let fcmIsAllowed: Bool 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/DTO/Response/PatchPushAlarmResponseDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PatchPushAlarmResponseDTO.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PatchPushAlarmResponseDTO: Codable { 11 | let code: Int 12 | let message: String 13 | let data: PatchPushAlarmResponseData? 14 | } 15 | 16 | struct PatchPushAlarmResponseData: Codable { 17 | let isAllowed: Bool 18 | } 19 | -------------------------------------------------------------------------------- /TOASTER-iOS/Network/User/UserTargetType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserTargetType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/12/24. 6 | // 7 | 8 | import Foundation 9 | 10 | import Moya 11 | 12 | enum UserTargetType { 13 | case getSettingPage 14 | case getMyPage 15 | case patchPushAlarm(requestBody: PatchPushAlarmRequestDTO) 16 | case getMainPage 17 | } 18 | 19 | extension UserTargetType: BaseTargetType { 20 | 21 | var headerType: HeaderType { return .accessTokenHeader } 22 | var utilPath: UtilPath { return .user } 23 | var pathParameter: String? { return .none } 24 | var queryParameter: [String: Any]? { return .none } 25 | 26 | var requestBodyParameter: Codable? { 27 | switch self { 28 | case .patchPushAlarm(let requestBody): return requestBody 29 | default: return .none 30 | } 31 | } 32 | 33 | var path: String { 34 | switch self { 35 | case .getSettingPage: return utilPath.rawValue + "/settings" 36 | case .getMyPage: return utilPath.rawValue + "/my-page" 37 | case .patchPushAlarm: return utilPath.rawValue + "/notification" 38 | case .getMainPage: return utilPath.rawValue + "/main" 39 | } 40 | } 41 | 42 | var method: Moya.Method { 43 | switch self { 44 | case .getSettingPage: return .get 45 | case .getMyPage: return .get 46 | case .patchPushAlarm: return .patch 47 | case .getMainPage: return .get 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/AddLink/LinkEmbed/Model/SaveLinkModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SaveLinkModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/17. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SaveLinkModel { 11 | var linkUrl: String 12 | let categoryId: Int? 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/AddLink/SelectClip/Model/SelectClipModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SelectClipModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/15. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SelectClipModel { 11 | let id: Int 12 | let title: String 13 | let clipCount: Int 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Clip/Model/ClipModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClipModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/25/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ClipModel { 11 | let allClipToastCount: Int 12 | var clips: [AllClipModel] 13 | } 14 | 15 | struct AllClipModel { 16 | let id: Int 17 | let title: String 18 | let toastCount: Int 19 | } 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Clip/View/Component/ClipEmptyView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClipEmptyView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/5/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class ClipEmptyView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let emptyImage = UIImageView() 18 | private let emptyLabel = UILabel() 19 | 20 | // MARK: - Life Cycles 21 | 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | 25 | setupStyle() 26 | setupHierarchy() 27 | setupLayout() 28 | } 29 | 30 | @available(*, unavailable) 31 | required init?(coder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | } 35 | 36 | // MARK: - Private Extensions 37 | 38 | private extension ClipEmptyView { 39 | func setupStyle() { 40 | backgroundColor = .toasterBackground 41 | 42 | emptyImage.do { 43 | $0.image = .clipEmpty 44 | } 45 | 46 | emptyLabel.do { 47 | $0.text = "클립을 추가해\n링크를 정리해보세요!" 48 | $0.numberOfLines = 2 49 | $0.textColor = .gray500 50 | $0.font = .suitRegular(size: 16) 51 | $0.textAlignment = .center 52 | } 53 | } 54 | 55 | func setupHierarchy() { 56 | addSubviews(emptyImage, emptyLabel) 57 | } 58 | 59 | func setupLayout() { 60 | emptyImage.snp.makeConstraints { 61 | $0.top.leading.trailing.equalToSuperview() 62 | $0.size.equalTo(convertByWidthRatio(200)) 63 | } 64 | 65 | emptyLabel.snp.makeConstraints { 66 | $0.leading.trailing.bottom.equalToSuperview() 67 | $0.top.equalTo(emptyImage.snp.bottom) 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/DetailClip/Model/DetailClipModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailClipModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/25/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct DetailClipModel { 11 | let allToastCount: Int 12 | let toastList: [ToastListModel] 13 | } 14 | 15 | struct ToastListModel { 16 | let id: Int 17 | let title: String 18 | let url: String 19 | let isRead: Bool 20 | let clipTitle: String? 21 | let imageURL: String? 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/DetailClip/View/Component/DetailClipEmptyView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailClipEmptyView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/7/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class DetailClipEmptyView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let emptyImage = UIImageView() 18 | private let emptyLabel = UILabel() 19 | 20 | // MARK: - Life Cycles 21 | 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | 25 | setupStyle() 26 | setupHierarchy() 27 | setupLayout() 28 | } 29 | 30 | @available(*, unavailable) 31 | required init?(coder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | } 35 | 36 | // MARK: - Private Extensions 37 | 38 | private extension DetailClipEmptyView { 39 | func setupStyle() { 40 | backgroundColor = .toasterBackground 41 | 42 | emptyImage.do { 43 | $0.image = .detailClipEmpty 44 | } 45 | 46 | emptyLabel.do { 47 | $0.text = "아직 클립에 저장된 링크가 없어요\n아래 + 버튼을 통해 링크를 저장해보세요!" 48 | $0.numberOfLines = 2 49 | $0.textColor = .gray500 50 | $0.font = .suitRegular(size: 16) 51 | $0.textAlignment = .center 52 | } 53 | } 54 | 55 | func setupHierarchy() { 56 | addSubviews(emptyImage, emptyLabel) 57 | } 58 | 59 | func setupLayout() { 60 | emptyImage.snp.makeConstraints { 61 | $0.top.leading.trailing.equalToSuperview() 62 | $0.size.equalTo(200) 63 | } 64 | 65 | emptyLabel.snp.makeConstraints { 66 | $0.centerX.equalToSuperview() 67 | $0.bottom.equalToSuperview() 68 | $0.top.equalTo(emptyImage.snp.bottom) 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/DetailClip/View/Component/DetailClipSegmentedControlView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailClipSegmentedControlView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/7/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class DetailClipSegmentedControlView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let readSegmentedControl = UISegmentedControl() 18 | lazy var readSegmentedControlValueChanged = readSegmentedControl 19 | .publisher(for: .valueChanged) 20 | .map { _ in self.readSegmentedControl.selectedSegmentIndex } 21 | 22 | // MARK: - Life Cycles 23 | 24 | override init(frame: CGRect) { 25 | super.init(frame: frame) 26 | setupStyle() 27 | setupHierarchy() 28 | setupLayout() 29 | } 30 | 31 | @available(*, unavailable) 32 | required init?(coder: NSCoder) { 33 | fatalError("init(coder:) has not been implemented") 34 | } 35 | } 36 | 37 | // MARK: - Private Extensions 38 | 39 | private extension DetailClipSegmentedControlView { 40 | func setupStyle() { 41 | backgroundColor = .toasterBackground 42 | 43 | readSegmentedControl.do { 44 | $0.insertSegment(withTitle: "전체", at: 0, animated: true) 45 | $0.insertSegment(withTitle: "열람", at: 1, animated: true) 46 | $0.insertSegment(withTitle: "미열람", at: 2, animated: true) 47 | $0.selectedSegmentIndex = 0 48 | $0.setTitleTextAttributes([ 49 | NSAttributedString.Key.foregroundColor: UIColor.black850, 50 | NSAttributedString.Key.font: UIFont.suitBold(size: 14) 51 | ], for: .selected) 52 | $0.setTitleTextAttributes([ 53 | NSAttributedString.Key.foregroundColor: UIColor.gray400, 54 | NSAttributedString.Key.font: UIFont.suitSemiBold(size: 14) 55 | ], for: .normal) 56 | } 57 | } 58 | 59 | func setupHierarchy() { 60 | addSubviews(readSegmentedControl) 61 | } 62 | 63 | func setupLayout() { 64 | readSegmentedControl.snp.makeConstraints { 65 | $0.top.equalToSuperview() 66 | $0.height.equalTo(38) 67 | $0.leading.trailing.equalToSuperview().inset(20) 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/DetailClip/ViewModel/DetailClipPropertyType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailClipPropertyType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 2/8/24. 6 | // 7 | 8 | import Foundation 9 | 10 | enum DetailClipPropertyType { 11 | case toastId 12 | case categoryId 13 | case categoryName 14 | case segmentIndex 15 | case linkTitle 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/EditClip/Model/ClipPriorityEditModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClipPriorityEditModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/25/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ClipPriorityEditModel { 11 | let id, priority: Int 12 | } 13 | 14 | struct ClipNameEditModel { 15 | let id: Int 16 | let title: String 17 | } 18 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/EditClip/View/EditClipNoticeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditClipNoticeView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/11/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class EditClipNoticeView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let backgroundView = UIView() 18 | private let noticeLabel = UILabel() 19 | 20 | // MARK: - Life Cycles 21 | 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | 25 | setupStyle() 26 | setupHierarchy() 27 | setupLayout() 28 | } 29 | 30 | @available(*, unavailable) 31 | required init?(coder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | } 35 | 36 | // MARK: - Private Extensions 37 | 38 | private extension EditClipNoticeView { 39 | func setupStyle() { 40 | backgroundColor = .toasterBackground 41 | 42 | backgroundView.do { 43 | $0.backgroundColor = .gray50 44 | $0.makeRounded(radius: 12) 45 | } 46 | 47 | noticeLabel.do { 48 | $0.text = "클립을 누른 뒤 위아래로 드래그하여 순서를 수정할 수 있어요!" 49 | $0.font = .suitSemiBold(size: 12) 50 | $0.textColor = .gray400 51 | $0.textAlignment = .center 52 | } 53 | } 54 | 55 | func setupHierarchy() { 56 | addSubview(backgroundView) 57 | backgroundView.addSubview(noticeLabel) 58 | } 59 | 60 | func setupLayout() { 61 | backgroundView.snp.makeConstraints { 62 | $0.center.equalToSuperview() 63 | $0.top.equalToSuperview().inset(12) 64 | $0.leading.equalToSuperview().inset(20) 65 | } 66 | 67 | noticeLabel.snp.makeConstraints { 68 | $0.center.equalToSuperview() 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/Model/MainInfoModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainInfoModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/09. 6 | // 7 | 8 | import Foundation 9 | 10 | struct MainInfoModel { 11 | let nickname: String 12 | let readToastNum: Int 13 | let allToastNum: Int 14 | let mainCategoryListDto: [CategoryList] 15 | 16 | } 17 | 18 | struct CategoryList { 19 | let categoryId: Int 20 | let categroyTitle: String 21 | let toastNum: Int 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/Model/PopupInfoModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PopupInfoModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/24/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct PopupInfoModel { 11 | let id: Int 12 | let image: String 13 | let activeStartDate: String 14 | let activeEndDate: String 15 | let linkURL: String 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/Model/RecentLinkModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecentLinkModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 10/17/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RecentLinkModel { 11 | let toastId: Int 12 | let toastTitle: String 13 | let linkUrl: String 14 | let isRead: Bool 15 | let categoryTitle: String? 16 | let thumbnailUrl: String? 17 | } 18 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/Model/RecommendSiteModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecommendSiteModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/16. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RecommendSiteModel { 11 | let siteId: Int 12 | let siteTitle: String? 13 | let siteUrl: String? 14 | let siteImg: String? 15 | let siteSub: String? 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/Model/WeeklyLinkModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WeeklyLinkModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/16. 6 | // 7 | 8 | import Foundation 9 | 10 | struct WeeklyLinkModel { 11 | let toastId: Int 12 | let toastTitle: String 13 | let toastImg: String 14 | let toastLink: String 15 | } 16 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/View/Cell/HomeFooterCollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainFooterCollectionReusableView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/09. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | // MARK: - Home footer 14 | 15 | final class HomeFooterCollectionView: UICollectionReusableView { 16 | 17 | // MARK: - Properties 18 | 19 | private let divideView = UIView() 20 | 21 | // MARK: - Life Cycle 22 | 23 | override init(frame: CGRect) { 24 | super.init(frame: frame) 25 | 26 | self.backgroundColor = .clear 27 | setView() 28 | } 29 | 30 | required init?(coder: NSCoder) { 31 | super.init(coder: coder) 32 | } 33 | 34 | func setView() { 35 | setupStyle() 36 | setupHierarchy() 37 | setupLayout() 38 | } 39 | 40 | // MARK: - set up Style 41 | 42 | private func setupStyle() { 43 | divideView.do { 44 | $0.backgroundColor = .gray50 45 | } 46 | } 47 | 48 | // MARK: - set up Hierarchy 49 | 50 | private func setupHierarchy() { 51 | addSubview(divideView) 52 | } 53 | 54 | // MARK: - set up Layout 55 | 56 | private func setupLayout() { 57 | divideView.snp.makeConstraints { 58 | $0.bottom.centerX.equalToSuperview() 59 | $0.width.equalTo(UIScreen.main.bounds.width) 60 | $0.height.equalTo(4) 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Home/View/HomeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/09. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class HomeView: UIView { 14 | 15 | // MARK: - Properties 16 | 17 | private let collectionViewLayout = CompositionalFactory.create() 18 | private(set) lazy var collectionView = UICollectionView(frame: .zero, 19 | collectionViewLayout: collectionViewLayout) 20 | 21 | // MARK: - Life Cycle 22 | 23 | override init(frame: CGRect) { 24 | super.init(frame: frame) 25 | setupHierarchy() 26 | setupLayout() 27 | } 28 | 29 | @available(*, unavailable) 30 | required init?(coder: NSCoder) { 31 | fatalError("init(coder:) has not been implemented") 32 | } 33 | 34 | // MARK: - set Hierarchy 35 | 36 | private func setupHierarchy() { 37 | self.addSubview(collectionView) 38 | } 39 | 40 | // MARK: - set Layout 41 | 42 | private func setupLayout() { 43 | collectionView.snp.makeConstraints { 44 | $0.edges.equalToSuperview() 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/LinkWeb/Model/LinkReadEditModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LinkReadEditModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/25/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LinkReadEditModel { 11 | let toastId: Int 12 | let isRead: Bool 13 | } 14 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/LinkWeb/ViewModel/LinkWebViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LinkWebViewModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 9/2/24. 6 | // 7 | 8 | import Combine 9 | import UIKit 10 | 11 | final class LinkWebViewModel: ViewModelType { 12 | 13 | private var cancelBag = CancelBag() 14 | 15 | // MARK: - Input State 16 | 17 | struct Input { 18 | let readLinkButtonTapped: Driver 19 | } 20 | 21 | // MARK: - Output State 22 | 23 | struct Output { 24 | let isRead = PassthroughSubject() 25 | let navigateToLogin = PassthroughSubject() 26 | } 27 | 28 | // MARK: - Method 29 | 30 | func transform(_ input: Input, cancelBag: CancelBag) -> Output { 31 | let output = Output() 32 | 33 | input.readLinkButtonTapped 34 | .networkFlatMap(self, { context, model in 35 | context.patchOpenLinkAPI(requestBody: model) 36 | }, onError: { _ in 37 | output.navigateToLogin.send() 38 | }) 39 | .sink { isRead in 40 | output.isRead.send(!isRead) 41 | }.store(in: cancelBag) 42 | 43 | return output 44 | } 45 | } 46 | 47 | // MARK: - Network 48 | 49 | private extension LinkWebViewModel { 50 | func patchOpenLinkAPI(requestBody: LinkReadEditModel) -> AnyPublisher { 51 | return Future { promise in 52 | NetworkService.shared.toastService.patchOpenLink( 53 | requestBody: PatchOpenLinkRequestDTO( 54 | toastId: requestBody.toastId, 55 | isRead: requestBody.isRead 56 | ) 57 | ) { result in 58 | switch result { 59 | case .success: 60 | promise(.success(!requestBody.isRead)) 61 | case .unAuthorized, .networkFail, .notFound: 62 | promise(.failure(NetworkResult.unAuthorized)) 63 | default: 64 | break 65 | } 66 | } 67 | }.eraseToAnyPublisher() 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/LoginError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginError.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/6/24. 6 | // 7 | 8 | import Foundation 9 | 10 | enum LoginError: Error { 11 | case notSettingUsecase 12 | case failedReceiveToken 13 | 14 | var description: String { 15 | switch self { 16 | case .notSettingUsecase: 17 | return "🔒 소셜 로그인 설정 불가" 18 | case .failedReceiveToken: 19 | return "🔑 토큰을 받지 못했습니다." 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/Model/SocialLoginTokenModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SocialLoginTokenModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/7/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SocialLoginTokenModel { 11 | let accessToken: String? 12 | let refreshToken: String? 13 | let identityToken: String? 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/OnboardingType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OnboardingType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 2/23/24. 6 | // 7 | 8 | import UIKit 9 | 10 | enum OnboardingType: CaseIterable { 11 | case first, second, third, fourth 12 | 13 | var title: String { 14 | switch self { 15 | case .first: 16 | return StringLiterals.Login.onboarding1 17 | case .second: 18 | return StringLiterals.Login.onboarding2 19 | case .third: 20 | return StringLiterals.Login.onboarding3 21 | case .fourth: 22 | return StringLiterals.Login.subTitle 23 | } 24 | } 25 | 26 | var image: UIImage { 27 | switch self { 28 | case .first: 29 | return UIImage(resource: .imgOnboarding) 30 | case .second: 31 | return UIImage(resource: .imgOnboarding2) 32 | case .third: 33 | return UIImage(resource: .imgOnboarding3) 34 | case .fourth: 35 | return UIImage(resource: .imgLogin) 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/SocialLoginType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SocialLoginType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 12/30/23. 6 | // 7 | 8 | import UIKit 9 | 10 | enum SocialLoginType { 11 | case kakao, apple 12 | 13 | var title: String { 14 | switch self { 15 | case .kakao: 16 | return StringLiterals.Login.kakaoButton 17 | case .apple: 18 | return StringLiterals.Login.appleButton 19 | } 20 | } 21 | 22 | var titleColor: UIColor { 23 | switch self { 24 | case .kakao: 25 | return .black900 26 | case .apple: 27 | return .toasterWhite 28 | } 29 | } 30 | 31 | var backgroundColor: UIColor { 32 | switch self { 33 | case .kakao: 34 | return .loginKakao 35 | case .apple: 36 | return .black850 37 | } 38 | } 39 | 40 | var logoImage: UIImage { 41 | switch self { 42 | case .kakao: 43 | return .icKakaoLogin24 44 | case .apple: 45 | return .icAppleLogin24 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/UseCase/LoginUseCase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginUseCase.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/6/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LoginUseCase { 11 | let adapter: AuthenticationAdapterProtocol 12 | 13 | var adapterType: String { 14 | return adapter.adapterType 15 | } 16 | 17 | init(adapter: AuthenticationAdapterProtocol) { 18 | self.adapter = adapter 19 | } 20 | 21 | func login() async throws -> SocialLoginTokenModel { 22 | return try await adapter.login() 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/UseCase/LogoutUseCase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogoutUseCase.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/7/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LogoutUseCase { 11 | let adapter: AuthenticationAdapterProtocol 12 | 13 | var adapterType: String { 14 | return adapter.adapterType 15 | } 16 | 17 | init(adapter: AuthenticationAdapterProtocol) { 18 | self.adapter = adapter 19 | } 20 | 21 | func logout() async throws -> Bool { 22 | return try await adapter.logout() 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Login/View/SocialLoginButtonView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SocialLoginButtonView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 12/30/23. 6 | // 7 | 8 | import UIKit 9 | 10 | final class SocialLoginButtonView: UIButton { 11 | 12 | // MARK: - Properties 13 | 14 | var loginType: SocialLoginType 15 | 16 | // MARK: - Life Cycle 17 | 18 | init(type: SocialLoginType) { 19 | self.loginType = type 20 | super.init(frame: .zero) 21 | setupSocialButton(type: loginType) 22 | } 23 | 24 | required init?(coder: NSCoder) { 25 | fatalError("init(coder:) has not been implemented") 26 | } 27 | } 28 | 29 | // MARK: - Private Extensions 30 | 31 | private extension SocialLoginButtonView { 32 | func setupSocialButton(type: SocialLoginType) { 33 | var configuration = UIButton.Configuration.filled() 34 | 35 | var titleAttr = AttributedString.init("\(type.title)") 36 | titleAttr.font = .suitBold(size: 16) 37 | configuration.attributedTitle = titleAttr 38 | 39 | configuration.image = type.logoImage 40 | configuration.imagePadding = 4 41 | 42 | configuration.background.cornerRadius = 12 43 | configuration.baseForegroundColor = type.titleColor 44 | configuration.baseBackgroundColor = type.backgroundColor 45 | 46 | self.configuration = configuration 47 | clipsToBounds = true 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Remind/Model/RemindModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemindModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/11/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RemindModel { 11 | let completeTimerModelList: [CompleteTimerModel] 12 | let waitTimerModelList: [WaitTimerModel] 13 | } 14 | 15 | struct CompleteTimerModel { 16 | let id: Int 17 | let remindDay: String 18 | let remindTime: String 19 | let clipID: Int 20 | let clipName: String 21 | } 22 | 23 | struct WaitTimerModel { 24 | let id: Int 25 | let clipID: Int 26 | let clipName: String 27 | let remindDay: String 28 | let remindTime: String 29 | let isEnable: Bool 30 | } 31 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Remind/View/Cell/CompleteTimerEmptyCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CompleteTimerEmptyCollectionViewCell.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/11/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class CompleteTimerEmptyCollectionViewCell: UICollectionViewCell { 14 | 15 | // MARK: - UI Properties 16 | 17 | private let explainLabel: UILabel = UILabel() 18 | 19 | // MARK: - Life Cycle 20 | 21 | override init(frame: CGRect) { 22 | super.init(frame: frame) 23 | 24 | setupStyle() 25 | setupHierarchy() 26 | setupLayout() 27 | } 28 | 29 | required init?(coder: NSCoder) { 30 | fatalError("init(coder:) has not been implemented") 31 | } 32 | } 33 | 34 | // MARK: - Private Extension 35 | 36 | private extension CompleteTimerEmptyCollectionViewCell { 37 | func setupStyle() { 38 | backgroundColor = .gray50 39 | makeRounded(radius: 12) 40 | 41 | explainLabel.do { 42 | $0.textColor = .gray400 43 | $0.font = .suitRegular(size: 16) 44 | $0.text = "타이머가 완료되면 리마인드 드릴게요" 45 | } 46 | } 47 | 48 | func setupHierarchy() { 49 | addSubview(explainLabel) 50 | } 51 | 52 | func setupLayout() { 53 | explainLabel.snp.makeConstraints { 54 | $0.center.equalToSuperview() 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Remind/View/Cell/RemindCollectionFooterView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemindCollectionFooterView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/10/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class RemindCollectionFooterView: UICollectionReusableView { 14 | 15 | // MARK: - UI Properties 16 | 17 | private let dividingView: UIView = UIView() 18 | 19 | // MARK: - Life Cycle 20 | 21 | override init(frame: CGRect) { 22 | super.init(frame: frame) 23 | 24 | setupStyle() 25 | setupHierarchy() 26 | setupLayout() 27 | } 28 | 29 | required init?(coder: NSCoder) { 30 | fatalError("init(coder:) has not been implemented") 31 | } 32 | } 33 | 34 | // MARK: - Private Extension 35 | 36 | private extension RemindCollectionFooterView { 37 | func setupStyle() { 38 | backgroundColor = .toasterBackground 39 | 40 | dividingView.do { 41 | $0.backgroundColor = .gray50 42 | } 43 | } 44 | 45 | func setupHierarchy() { 46 | addSubview(dividingView) 47 | } 48 | 49 | func setupLayout() { 50 | dividingView.snp.makeConstraints { 51 | $0.height.equalTo(4) 52 | $0.top.horizontalEdges.equalToSuperview() 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Remind/View/Component/RemindAlarmOffViewType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemindAlarmOffViewType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/10/24. 6 | // 7 | 8 | import UIKit 9 | 10 | enum RemindAlarmOffViewType { 11 | case normal, bottomSheet 12 | 13 | var textAlignment: NSTextAlignment { 14 | switch self { 15 | case .normal: return .center 16 | case .bottomSheet: return .left 17 | } 18 | } 19 | 20 | var bottomLabelText: String { 21 | switch self { 22 | case .normal: return "기존에 설정한 타이머들은 알림을 키면\n다시 복구돼요" 23 | case .bottomSheet: return "언제든지 기기 설정 > 알림에서 변경이 가능해요" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/RemindAdd/ClipAdd/Model/RemindClipModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemindClipModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/11/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RemindClipModel { 11 | let id: Int? 12 | let title: String 13 | let clipCount: Int 14 | } 15 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/RemindAdd/TimerAdd/Model/RemindTimerAddModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemindTimerAddModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/16/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RemindTimerAddModel { 11 | let clipTitle: String 12 | let remindTime: String 13 | let remindDates: [Int] 14 | } 15 | 16 | struct RemindTimerEditModel { 17 | let remindID: Int 18 | let remindTime: String 19 | let remindDates: [Int] 20 | } 21 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Search/Model/SearchResultModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/9/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SearchResultModel { 11 | let detailClipList: [SearchResultDetailClipModel] 12 | let clipList: [SearchResultClipModel] 13 | } 14 | 15 | struct SearchResultDetailClipModel { 16 | let iD: Int 17 | let title: String 18 | let link: String 19 | let imageURL: String? 20 | let clipTitle: String? 21 | let isRead: Bool 22 | } 23 | 24 | struct SearchResultClipModel { 25 | let iD: Int 26 | let title: String 27 | let numberOfDetailClip: Int 28 | } 29 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Search/View/SearchEmptyResultView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchEmptyResultView.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 1/9/24. 6 | // 7 | 8 | import UIKit 9 | 10 | import SnapKit 11 | import Then 12 | 13 | final class SearchEmptyResultView: UIView { 14 | 15 | // MARK: - UI Components 16 | 17 | private let emptyImageView = UIImageView() 18 | private let emptyLabel = UILabel() 19 | 20 | // MARK: - Life Cycles 21 | 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | 25 | setupStyle() 26 | setupHierarchy() 27 | setupLayout() 28 | } 29 | 30 | required init?(coder: NSCoder) { 31 | fatalError("init(coder:) has not been implemented") 32 | } 33 | } 34 | 35 | private extension SearchEmptyResultView { 36 | func setupStyle() { 37 | backgroundColor = .clear 38 | 39 | emptyImageView.do { 40 | $0.image = .imgSearch 41 | } 42 | 43 | emptyLabel.do { 44 | $0.numberOfLines = 0 45 | $0.textColor = .gray500 46 | $0.textAlignment = .center 47 | $0.font = .suitRegular(size: 16) 48 | $0.text = "검색 결과가 없어요\n다른 검색어로 찾아보실래요?" 49 | } 50 | } 51 | 52 | func setupHierarchy() { 53 | addSubviews(emptyImageView, emptyLabel) 54 | } 55 | 56 | func setupLayout() { 57 | emptyImageView.snp.makeConstraints { 58 | $0.width.height.equalTo(convertByWidthRatio(200)) 59 | $0.top.horizontalEdges.equalToSuperview() 60 | } 61 | 62 | emptyLabel.snp.makeConstraints { 63 | $0.top.equalTo(emptyImageView.snp.bottom) 64 | $0.bottom.horizontalEdges.equalToSuperview() 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/Setting/Model/MypageUserModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MypageUserModel.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by ParkJunHyuk on 1/10/24. 6 | // 7 | 8 | import Foundation 9 | 10 | struct MypageUserModel: Codable { 11 | let nickname: String 12 | let profile: String? 13 | let allReadToast: Int 14 | let thisWeekendRead: Int 15 | let thisWeekendSaved: Int 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/TabBar/CustomTabBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomTabBar.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 1/13/25. 6 | // 7 | 8 | import UIKit 9 | 10 | final class CustomTabBar: UITabBar { 11 | override func sizeThatFits(_ size: CGSize) -> CGSize { 12 | var size = super.sizeThatFits(size) 13 | size.height += 11 14 | return size 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/TabBar/TabBarItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TabBarItem.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by Gahyun Kim on 2024/01/01. 6 | // 7 | 8 | import UIKit 9 | 10 | enum TabBarItem: CaseIterable { 11 | 12 | case home, clip, plus, search, timer 13 | 14 | // 선택되지 않은 탭 15 | var normalItem: UIImage? { 16 | switch self { 17 | case .home: 18 | return .icHome24.withTintColor(.gray150) 19 | case .clip: 20 | return .icClipFull24.withTintColor(.gray150) 21 | case .plus: 22 | return .fabPlus 23 | case .search: 24 | return .icSearch24.withTintColor(.gray150) 25 | case .timer: 26 | return .icTimer24.withTintColor(.gray150) 27 | 28 | } 29 | } 30 | 31 | // 선택된 탭 32 | var selectedItem: UIImage? { 33 | switch self { 34 | case .home: 35 | return .icHome24.withTintColor(.black900) 36 | case .clip: 37 | return .icClipFull24.withTintColor(.black900) 38 | case .plus: 39 | return .fabPlus 40 | case .search: 41 | return .icSearch24.withTintColor(.black900) 42 | case .timer: 43 | return .icTimer24.withTintColor(.black900) 44 | } 45 | } 46 | 47 | // 탭 별 제목 48 | var itemTitle: String? { 49 | switch self { 50 | case .home: return StringLiterals.Tabbar.home 51 | case .clip: return StringLiterals.Tabbar.clip 52 | case .plus: return nil 53 | case .search: return StringLiterals.Tabbar.search 54 | case .timer: return StringLiterals.Tabbar.timer 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/UpdateAlert/UpdateAlertType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UpdateAlertType.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 민 on 4/17/24. 6 | // 7 | 8 | import UIKit 9 | 10 | enum UpdateAlertType { 11 | case ForceUpdate // Major Update case -> 강제 업데이트 12 | case NoticeUpdate // Minor 사용성 Update case -> 선택 업데이트 13 | case NoticeFeatUpdate // Minor 기능 Update case -> 선택 업데이트 14 | 15 | var title: String { 16 | switch self { 17 | case .ForceUpdate: 18 | return "신규 기능 업데이트 알림" 19 | case .NoticeUpdate: 20 | return "업데이트 알림" 21 | case .NoticeFeatUpdate: 22 | return "기능 업데이트 알림" 23 | } 24 | } 25 | 26 | var description: String { 27 | switch self { 28 | case .ForceUpdate: 29 | return "토스터의 새로운 기능을 이용하기 위해서는\n업데이트가 필요해요!\n최신 버전으로 업데이트 하시겠어요?" 30 | case .NoticeUpdate: 31 | return "토스터의 사용성이 개선되었어요!\n지금 바로 업데이트해보세요" 32 | case .NoticeFeatUpdate: 33 | return "토스터의 기능이 추가되었어요!\n지금 바로 업데이트해보세요" 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /TOASTER-iOS/Present/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // TOASTER-iOS 4 | // 5 | // Created by 김다예 on 12/30/23. 6 | // 7 | 8 | import UIKit 9 | 10 | class ViewController: UIViewController { 11 | 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | // Do any additional setup after loading the view. 15 | } 16 | 17 | 18 | } 19 | 20 | -------------------------------------------------------------------------------- /TOASTER-iOS/TOASTER-iOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.applesignin 8 | 9 | Default 10 | 11 | com.apple.security.application-groups 12 | 13 | keychain-access-groups 14 | 15 | $(AppIdentifierPrefix)group.TeamLinkMIND.TOASTER-iOS.KeyChain 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /ToasterShareExtension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ACCESS_TOKEN_KEY 6 | $(ACCESS_TOKEN_KEY) 7 | APPLE_LOGIN 8 | $(APPLE_LOGIN) 9 | APPLE_USER_ID 10 | $(APPLE_USER_ID) 11 | BASE_URL 12 | $(BASE_URL) 13 | KAKAO_LOGIN 14 | $(KAKAO_LOGIN) 15 | KAKAO_NATIVE_APP_KEY 16 | $(KAKAO_NATIVE_APP_KEY) 17 | LSApplicationQueriesSchemes 18 | 19 | TOASTER 20 | 21 | NSAppTransportSecurity 22 | 23 | NSAllowsArbitraryLoads 24 | 25 | 26 | NSExtension 27 | 28 | NSExtensionAttributes 29 | 30 | NSExtensionActivationRule 31 | 32 | NSExtensionActivationSupportsWebURLWithMaxCount 33 | 1 34 | NSExtensionActivationSupportsText 35 | 36 | 37 | 38 | NSExtensionPointIdentifier 39 | com.apple.share-services 40 | NSExtensionPrincipalClass 41 | ShareViewController 42 | 43 | REFRESH_TOKEN_KEY 44 | $(REFRESH_TOKEN_KEY) 45 | UIAppFonts 46 | 47 | SUIT-ExtraBold.otf 48 | SUIT-Bold.otf 49 | SUIT-SemiBold.otf 50 | SUIT-Medium.otf 51 | SUIT-Regular.otf 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /ToasterShareExtension/ToasterShareExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.TeamLinkMIND.TOASTER-iOS 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)group.TeamLinkMIND.TOASTER-iOS.KeyChain 12 | 13 | 14 | 15 | --------------------------------------------------------------------------------