├── SampleProjectSwiftUI ├── Packages │ ├── README.md │ ├── Sources │ │ ├── UIComponentsPackages │ │ │ └── UIComponentsPackages.swift │ │ └── SampleProjectSwiftUIPackages │ │ │ └── SampleProjectSwiftUIPackages.swift │ ├── .gitignore │ └── Tests │ │ └── PackagesTests │ │ └── PackagesTests.swift ├── SampleProjectSwiftUI │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── ic_home.imageset │ │ │ ├── ic_home.pdf │ │ │ └── Contents.json │ │ ├── ic_heart.imageset │ │ │ ├── ic_heart.pdf │ │ │ └── Contents.json │ │ ├── fodamy-logo.imageset │ │ │ ├── fodamy-logo.pdf │ │ │ └── Contents.json │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── Router │ │ └── Router.swift │ ├── Info.plist │ ├── Scene │ │ ├── Home │ │ │ └── HomeSceneModel.swift │ │ ├── MainTabScene │ │ │ └── MainTabSceneModel.swift │ │ ├── RecipeDetail │ │ │ ├── RecipeDetailSceneModel.swift │ │ │ └── RecipeDetailScene.swift │ │ ├── Root │ │ │ └── RootSceneModel.swift │ │ ├── Base │ │ │ └── BaseSceneModel.swift │ │ └── Splash │ │ │ └── SplashSceneModel.swift │ ├── Constants │ │ └── DefaultKeys.swift │ ├── App │ │ └── SampleProjectSwiftUIApp.swift │ ├── UIComponents │ │ ├── UserViewModel+Extensions.swift │ │ └── RecipeViewModel+Extensions.swift │ └── DataProvider │ │ └── DataProvider.swift ├── Xcode Templates │ ├── install-templates │ ├── Source │ │ └── SwiftUI Templates │ │ │ ├── SwiftUI Scene.xctemplate │ │ │ ├── Default │ │ │ │ ├── ___FILEBASENAME___SceneModel.swift │ │ │ │ └── ___FILEBASENAME___Scene.swift │ │ │ ├── TemplateIcon.png │ │ │ ├── WithBaseView │ │ │ │ ├── ___FILEBASENAME___SceneModel.swift │ │ │ │ └── ___FILEBASENAME___Scene.swift │ │ │ └── TemplateIcon@2x.png │ │ │ └── SwiftUI View.xctemplate │ │ │ ├── TemplateIcon.png │ │ │ ├── TemplateIcon@2x.png │ │ │ ├── Default │ │ │ ├── ___FILEBASENAME___ViewModel.swift │ │ │ └── ___FILEBASENAME___View.swift │ │ │ └── Identifiable │ │ │ ├── ___FILEBASENAME___ViewModel.swift │ │ │ └── ___FILEBASENAME___View.swift │ └── install-templates.md ├── Core │ ├── Components │ │ ├── Sources │ │ │ └── Components │ │ │ │ ├── Resources │ │ │ │ ├── Assets │ │ │ │ │ ├── Icons.xcassets │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── ic_back.imageset │ │ │ │ │ │ │ ├── ic_back.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_home.imageset │ │ │ │ │ │ │ ├── ic_home.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_mail.imageset │ │ │ │ │ │ │ ├── ic_mail.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_menu.imageset │ │ │ │ │ │ │ ├── ic_menu.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_more.imageset │ │ │ │ │ │ │ ├── ic_more.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_send.imageset │ │ │ │ │ │ │ ├── ic_send.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_user.imageset │ │ │ │ │ │ │ ├── ic_user.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_clock.imageset │ │ │ │ │ │ │ ├── ic_clock.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_close.imageset │ │ │ │ │ │ │ ├── ic_close.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_heart.imageset │ │ │ │ │ │ │ ├── ic_heart.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_share.imageset │ │ │ │ │ │ │ ├── ic_share.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_users.imageset │ │ │ │ │ │ │ ├── ic_users.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_logout.imageset │ │ │ │ │ │ │ ├── ic_logout.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_comment.imageset │ │ │ │ │ │ │ ├── ic_comment.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_password.imageset │ │ │ │ │ │ │ ├── ic_password.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── ic_warning.imageset │ │ │ │ │ │ │ ├── ic_warning.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── ic_restaurant.imageset │ │ │ │ │ │ │ ├── ic_restaurant.pdf │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Colors.xcassets │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── Background │ │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ │ ├── appPrimaryBackground.colorset │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ │ └── appSecondaryBackground.colorset │ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appCinder.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appRaven.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appRed.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appWhite.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appYellow.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appZircon.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appHeather.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── appSeparator.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── appShadow.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Images.xcassets │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── img_logo_fodamy.imageset │ │ │ │ │ │ ├── img_logo_fodamy.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── img_editors_pick.imageset │ │ │ │ │ │ ├── img_editors_pick.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── img_walkthrough_1.imageset │ │ │ │ │ │ ├── img_walkthrough_1.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── img_walkthrough_2.imageset │ │ │ │ │ │ ├── img_walkthrough_2.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ ├── img_walkthrough_3.imageset │ │ │ │ │ │ ├── img_walkthrough_3.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── img_walkthrough_4.imageset │ │ │ │ │ │ ├── img_walkthrough_4.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Fonts │ │ │ │ │ ├── Nunito-Bold.ttf │ │ │ │ │ ├── Nunito-SemiBold.ttf │ │ │ │ │ └── Nunito-ExtraBold.ttf │ │ │ │ └── Strings │ │ │ │ │ ├── Placeholder.strings │ │ │ │ │ ├── Componenets.strings │ │ │ │ │ ├── Error.strings │ │ │ │ │ └── General.strings │ │ │ │ ├── Extensions │ │ │ │ ├── Color+Extensions.swift │ │ │ │ ├── Int+Extensions.swift │ │ │ │ ├── UIEdgeInsets+Extensions.swift │ │ │ │ └── EnvironmentValues+Extensions.swift │ │ │ │ ├── HorizontalRecipesView │ │ │ │ └── HorizontalRecipesViewModel.swift │ │ │ │ ├── User │ │ │ │ └── UserViewModel.swift │ │ │ │ ├── Onboarding │ │ │ │ └── OnboardingViewModel.swift │ │ │ │ ├── Loading │ │ │ │ └── FullScreenLoadingView.swift │ │ │ │ └── HorizontalRecipesHeaderView │ │ │ │ └── HorizontalRecipesHeaderViewModel.swift │ │ ├── .gitignore │ │ └── Tests │ │ │ └── ComponentsTests │ │ │ └── ComponentsTests.swift │ ├── Network │ │ ├── .gitignore │ │ ├── Sources │ │ │ └── Network │ │ │ │ └── Core │ │ │ │ ├── RequestEncoding.swift │ │ │ │ ├── Typealias.swift │ │ │ │ ├── DecodableResponseRequest.swift │ │ │ │ ├── DataProviderProtocol.swift │ │ │ │ ├── RequestProtocol.swift │ │ │ │ └── RequestMethod.swift │ │ ├── Tests │ │ │ └── NetworkTests │ │ │ │ └── NetworkTests.swift │ │ └── Package.swift │ ├── Utilities │ │ ├── .gitignore │ │ ├── Sources │ │ │ └── Utilities │ │ │ │ └── Constants │ │ │ │ └── Closures.swift │ │ └── Tests │ │ │ └── UtilitiesTests │ │ │ └── UtilitiesTests.swift │ └── DataProvider │ │ ├── .gitignore │ │ ├── Sources │ │ └── DataProvider │ │ │ ├── Model │ │ │ ├── Image.swift │ │ │ ├── RecipeTime.swift │ │ │ ├── NumberOfPerson.swift │ │ │ ├── RecipeListType.swift │ │ │ ├── Auth.swift │ │ │ ├── SuccessResponse.swift │ │ │ ├── BaseResponse.swift │ │ │ ├── Pagination.swift │ │ │ ├── MainCategory.swift │ │ │ ├── RecipeComment.swift │ │ │ ├── CategoryDetail.swift │ │ │ └── Recipe.swift │ │ │ └── Requests │ │ │ ├── Auth │ │ │ ├── LogoutRequest.swift │ │ │ ├── ForgotPasswordRequest.swift │ │ │ ├── LoginRequest.swift │ │ │ └── RegisterRequest.swift │ │ │ ├── Recipe │ │ │ ├── Like │ │ │ │ ├── DeleteRecipeLikeRequest.swift │ │ │ │ └── AddRecipeLikeRequest.swift │ │ │ ├── GetRecipeDetailRequest.swift │ │ │ ├── Comment │ │ │ │ ├── DeleteRecipeCommentRequest.swift │ │ │ │ ├── AddRecipeCommentRequest.swift │ │ │ │ ├── GetRecipeCommentsRequest.swift │ │ │ │ └── EditRecipeCommentRequest.swift │ │ │ └── GetCategoriesWithRecipesRequest.swift │ │ │ └── User │ │ │ └── Follow │ │ │ ├── DeleteUserFollowRequest.swift │ │ │ └── AddUserFollowRequest.swift │ │ └── Tests │ │ └── DataProviderTests │ │ └── DataProviderTests.swift ├── SampleProjectSwiftUI.xcodeproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ └── mehmetsalihaslan.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── SampleProjectSwiftUI.xcworkspace │ └── contents.xcworkspacedata ├── Templates ├── install-templates ├── Source │ └── Mobillium Templates │ │ ├── MVVM-R Scene.xctemplate │ │ ├── Default │ │ │ ├── ___FILEBASENAME___Router.swift │ │ │ ├── ___FILEBASENAME___ViewController.swift │ │ │ └── ___FILEBASENAME___ViewModel.swift │ │ ├── TableViewDelegate │ │ │ └── ___FILEBASENAME___Router.swift │ │ ├── CollectionViewDelegate │ │ │ └── ___FILEBASENAME___Router.swift │ │ ├── TemplateIcon.png │ │ └── TemplateIcon@2x.png │ │ ├── Request.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ └── ___FILEBASENAME___Request.swift │ │ ├── CustomView.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ ├── Default │ │ │ └── ___FILEBASENAME___.swift │ │ └── Public │ │ │ └── ___FILEBASENAME___.swift │ │ ├── TableViewCell.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ ├── Default │ │ │ ├── ___FILEBASENAME___CellModel.swift │ │ │ └── ___FILEBASENAME___Cell.swift │ │ └── Public │ │ │ ├── ___FILEBASENAME___CellModel.swift │ │ │ └── ___FILEBASENAME___Cell.swift │ │ ├── CustomView+Model.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ ├── Default │ │ │ ├── ___FILEBASENAME___Model.swift │ │ │ └── ___FILEBASENAME___.swift │ │ └── Public │ │ │ ├── ___FILEBASENAME___Model.swift │ │ │ └── ___FILEBASENAME___.swift │ │ ├── CollectionViewCell.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ ├── Default │ │ │ ├── ___FILEBASENAME___CellModel.swift │ │ │ └── ___FILEBASENAME___Cell.swift │ │ └── Public │ │ │ ├── ___FILEBASENAME___CellModel.swift │ │ │ └── ___FILEBASENAME___Cell.swift │ │ ├── MVVM-R Modal Route.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ └── ___FILEBASENAME___Route.swift │ │ └── MVVM-R Push Route.xctemplate │ │ ├── TemplateIcon.png │ │ ├── TemplateIcon@2x.png │ │ └── ___FILEBASENAME___Route.swift └── install-templates.md ├── SampleProject ├── SampleProject │ ├── Resources │ │ └── Assets.xcassets │ │ │ └── Contents.json │ ├── Routing │ │ ├── Core │ │ │ └── Animator.swift │ │ ├── Transitions │ │ │ ├── Transition.swift │ │ │ └── PlaceOnWindowTransition.swift │ │ └── Routes │ │ │ └── ShareSheetRoute.swift │ ├── Scenes │ │ ├── Comment │ │ │ ├── CommentEdit │ │ │ │ └── CommentEditRouter.swift │ │ │ └── CommentList │ │ │ │ └── CommentListRouter.swift │ │ ├── Auth │ │ │ ├── PasswordReset │ │ │ │ ├── PasswordResetRouter.swift │ │ │ │ └── PasswordResetRoute.swift │ │ │ ├── Register │ │ │ │ ├── RegisterRouter.swift │ │ │ │ └── RegisterRoute.swift │ │ │ └── Login │ │ │ │ └── LoginRouter.swift │ │ ├── LoginWarning │ │ │ └── LoginWarningPopupRouter.swift │ │ ├── Recipes │ │ │ ├── RecipesRouter.swift │ │ │ └── RecipesRoute.swift │ │ ├── Home │ │ │ └── HomeRouter.swift │ │ ├── WalkThrough │ │ │ ├── WalkThroughRouter.swift │ │ │ └── WalkThroughRoute.swift │ │ ├── Favorites │ │ │ └── FavoritesRouter.swift │ │ ├── RecipeDetail │ │ │ ├── RecipeDetailRouter.swift │ │ │ └── RecipeDetailRoute.swift │ │ └── Main │ │ │ └── MainTabBarRoute.swift │ ├── Constants │ │ ├── NotificationNames.swift │ │ ├── DateFormats.swift │ │ └── ScreenSize.swift │ ├── Configurations │ │ └── BridgingHeader │ │ │ └── SampleProject-Bridging-Header.h │ ├── UIComponents │ │ └── CategoryCellModel+Extension.swift │ ├── Delegates │ │ └── PhotoBrowserDelegate.swift │ ├── DataProvider │ │ ├── DataProvider.swift │ │ └── APIRequestInterceptor.swift │ ├── AppDelegate │ │ ├── AppDelegate+SKPhotoBrowser.swift │ │ ├── AppDelegate+IQKeyboardManager.swift │ │ └── AppDelegate.swift │ └── Helper │ │ └── SKPhotoBrowserKingfisherCache.swift ├── DataProvider │ ├── DataProviderTests │ │ ├── MockData │ │ │ └── JsonFiles │ │ │ │ ├── Auth │ │ │ │ ├── LogoutRequest.json │ │ │ │ ├── LoginRequest.json │ │ │ │ └── RegisterRequest.json │ │ │ │ ├── Recipes │ │ │ │ ├── RecipeLikeRequest.json │ │ │ │ └── RecipeUnlikeRequest.json │ │ │ │ └── RecipeComments │ │ │ │ ├── DeleteRecipeCommentRequest.json │ │ │ │ ├── EditRecipeCommentRequest.json │ │ │ │ └── PostRecipeCommentRequest.json │ │ ├── DataProviderTests-Bridging-Header.h │ │ └── Info.plist │ └── DataProvider │ │ ├── Model │ │ ├── Image.swift │ │ ├── RecipeTime.swift │ │ ├── NumberOfPerson.swift │ │ ├── Auth.swift │ │ ├── SuccessResponse.swift │ │ ├── BaseResponse.swift │ │ ├── Pagination.swift │ │ ├── MainCategory.swift │ │ ├── RecipeComment.swift │ │ ├── CategoryDetail.swift │ │ └── Recipe.swift │ │ ├── Core │ │ ├── RequestEncoding.swift │ │ ├── Typealias.swift │ │ ├── DecodableResponseRequest.swift │ │ ├── RequestProtocol.swift │ │ ├── DataProviderProtocol.swift │ │ └── RequestMethod.swift │ │ ├── Requests │ │ ├── Auth │ │ │ ├── LogoutRequest.swift │ │ │ ├── ForgotPasswordRequest.swift │ │ │ ├── LoginRequest.swift │ │ │ └── RegisterRequest.swift │ │ ├── Recipe │ │ │ ├── GetRecipeDetailRequest.swift │ │ │ ├── Comment │ │ │ │ ├── DeleteRecipeCommentRequest.swift │ │ │ │ ├── PostRecipeCommentRequest.swift │ │ │ │ ├── GetRecipeCommentsRequest.swift │ │ │ │ └── EditRecipeCommentRequest.swift │ │ │ └── GetCategoriesWithRecipesRequest.swift │ │ └── User │ │ │ └── UserFollowRequest.swift │ │ ├── DataProvider.h │ │ └── Info.plist ├── UIComponents │ ├── UIComponents │ │ ├── Resources │ │ │ ├── Assets │ │ │ │ ├── Colors.xcassets │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Background │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── appPrimaryBackground.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── appSecondaryBackground.colorset │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appRed.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appYellow.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appCinder.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appHeather.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appRaven.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── appWhite.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── appZircon.colorset │ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icons.xcassets │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── ic_back.imageset │ │ │ │ │ │ ├── ic_back.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_home.imageset │ │ │ │ │ │ ├── ic_home.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_mail.imageset │ │ │ │ │ │ ├── ic_mail.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_menu.imageset │ │ │ │ │ │ ├── ic_menu.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_more.imageset │ │ │ │ │ │ ├── ic_more.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_send.imageset │ │ │ │ │ │ ├── ic_send.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_user.imageset │ │ │ │ │ │ ├── ic_user.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_clock.imageset │ │ │ │ │ │ ├── ic_clock.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_close.imageset │ │ │ │ │ │ ├── ic_close.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_heart.imageset │ │ │ │ │ │ ├── ic_heart.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_logout.imageset │ │ │ │ │ │ ├── ic_logout.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_share.imageset │ │ │ │ │ │ ├── ic_share.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_users.imageset │ │ │ │ │ │ ├── ic_users.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_comment.imageset │ │ │ │ │ │ ├── ic_comment.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_warning.imageset │ │ │ │ │ │ ├── ic_warning.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── ic_password.imageset │ │ │ │ │ │ ├── ic_password.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── ic_restaurant.imageset │ │ │ │ │ │ ├── ic_restaurant.pdf │ │ │ │ │ │ └── Contents.json │ │ │ │ └── Images.xcassets │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── img_editors_pick.imageset │ │ │ │ │ ├── img_editors_pick.pdf │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── img_logo_fodamy.imageset │ │ │ │ │ ├── img_logo_fodamy.pdf │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── img_walkthrough_1.imageset │ │ │ │ │ ├── img_walkthrough_1.pdf │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── img_walkthrough_2.imageset │ │ │ │ │ ├── img_walkthrough_2.pdf │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── img_walkthrough_3.imageset │ │ │ │ │ ├── img_walkthrough_3.pdf │ │ │ │ │ └── Contents.json │ │ │ │ │ └── img_walkthrough_4.imageset │ │ │ │ │ ├── img_walkthrough_4.pdf │ │ │ │ │ └── Contents.json │ │ │ ├── Fonts │ │ │ │ ├── Nunito-Bold.ttf │ │ │ │ ├── Nunito-ExtraBold.ttf │ │ │ │ └── Nunito-SemiBold.ttf │ │ │ └── Strings │ │ │ │ ├── Placeholder.strings │ │ │ │ ├── Componenets.strings │ │ │ │ ├── Error.strings │ │ │ │ └── General.strings │ │ ├── Protocols │ │ │ └── ReusableView.swift │ │ ├── Extensions │ │ │ ├── ReusableView+Extensions.swift │ │ │ └── UIImage+Extensions.swift │ │ ├── Cell │ │ │ ├── EmptyCell │ │ │ │ └── EmptyCellModel.swift │ │ │ └── RecipeHeaderCell │ │ │ │ └── RecipeHeaderCellModel.swift │ │ ├── UICollectionView │ │ │ └── DynamicHeightCollectionView.swift │ │ ├── UIComponents.h │ │ ├── Toast │ │ │ └── ToastPresenter.swift │ │ ├── UIActivityIndicatorView │ │ │ └── ActivityIndicatorView.swift │ │ ├── Loading │ │ │ ├── LoadingProtocol.swift │ │ │ └── ActivityIndicatorFooterView │ │ │ │ └── ActivityIndicatorFooterView.swift │ │ └── UIPageControl │ │ │ └── PageControl.swift │ └── UIComponentsTests │ │ └── Info.plist ├── Utilities │ ├── UtilitiesTests │ │ ├── UtilitiesTests-Bridging-Header.h │ │ ├── ExtensionsTests │ │ │ ├── Int+ExtensionsTests.swift │ │ │ ├── String+ExtensionsTests.swift │ │ │ └── UITextField+ExtensionsTests.swift │ │ └── Info.plist │ └── Utilities │ │ ├── Constants │ │ ├── Keychain+Constants.swift │ │ ├── DefaultsKeys.swift │ │ └── Closures.swift │ │ ├── Extensions │ │ ├── Int+Extensions.swift │ │ ├── UITextField+Extensions.swift │ │ └── String+Extensions.swift │ │ ├── Utilities.h │ │ └── Info.plist ├── SampleProject.xcodeproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── SampleProject.xcworkspace │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── contents.xcworkspacedata ├── SampleProjectTests │ └── Info.plist └── SampleProjectUITests │ └── Info.plist └── README.md /SampleProjectSwiftUI/Packages/README.md: -------------------------------------------------------------------------------- 1 | # Packages 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /Templates/install-templates: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")" 3 | cp -r Source/* "$HOME/Library/Developer/Xcode/Templates/" 4 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/install-templates: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")" 3 | cp -r Source/* "$HOME/Library/Developer/Xcode/Templates/" 4 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/Auth/LogoutRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "auth.logout", 3 | "message": "Çıkış yapıldı." 4 | } 5 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/Recipes/RecipeLikeRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "recipe.like", 3 | "message": "Tarif beğenildi." 4 | } 5 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/Recipes/RecipeUnlikeRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "recipe.unlike", 3 | "message": "Tarif beğenilme kaldırıldı." 4 | } 5 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/Background/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/Default/___FILEBASENAME___Router.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | final class ___VARIABLE_moduleName___Router: Router {} 4 | -------------------------------------------------------------------------------- /SampleProject/Utilities/UtilitiesTests/UtilitiesTests-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/RecipeComments/DeleteRecipeCommentRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "recipe.comment.delete", 3 | "message": "Yorum silindi." 4 | } 5 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/RecipeComments/EditRecipeCommentRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "recipe.comment.update", 3 | "message": "Yorum güncellendi." 4 | } 5 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/TableViewDelegate/___FILEBASENAME___Router.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | final class ___VARIABLE_moduleName___Router: Router {} 4 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-Bold.ttf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/Background/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/CollectionViewDelegate/___FILEBASENAME___Router.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | final class ___VARIABLE_moduleName___Router: Router {} 4 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/Request.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/Request.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-ExtraBold.ttf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Fonts/Nunito-SemiBold.ttf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Router/Router.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Router.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 19.02.2024. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CustomView.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/Request.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/Request.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CustomView.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/TableViewCell.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/TableViewCell.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Packages/Sources/UIComponentsPackages/UIComponentsPackages.swift: -------------------------------------------------------------------------------- 1 | public struct UIComponentsPackages { 2 | public private(set) var text = "Hello, World!" 3 | 4 | public init() { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Modal Route.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Modal Route.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Push Route.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Push Route.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_home.imageset/ic_home.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_home.imageset/ic_home.pdf -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Modal Route.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Modal Route.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Push Route.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/Templates/Source/Mobillium Templates/MVVM-R Push Route.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-Bold.ttf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Utilities/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_heart.imageset/ic_heart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_heart.imageset/ic_heart.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-SemiBold.ttf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /SampleProject/SampleProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Fonts/Nunito-ExtraBold.ttf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Utilities/Sources/Utilities/Constants/Closures.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Closures.swift 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 15.09.2022. 6 | // 7 | 8 | public typealias VoidClosure = (() -> Void) 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/fodamy-logo.imageset/fodamy-logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/fodamy-logo.imageset/fodamy-logo.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Packages/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/config/registries.json 8 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 9 | .netrc 10 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Packages/Sources/SampleProjectSwiftUIPackages/SampleProjectSwiftUIPackages.swift: -------------------------------------------------------------------------------- 1 | public struct SampleProjectSwiftUIPackages { 2 | public private(set) var text = "Hello, World!" 3 | 4 | public init() { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_back.imageset/ic_back.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_back.imageset/ic_back.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_home.imageset/ic_home.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_home.imageset/ic_home.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_mail.imageset/ic_mail.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_mail.imageset/ic_mail.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_menu.imageset/ic_menu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_menu.imageset/ic_menu.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_more.imageset/ic_more.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_more.imageset/ic_more.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_send.imageset/ic_send.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_send.imageset/ic_send.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_user.imageset/ic_user.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_user.imageset/ic_user.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/Default/___FILEBASENAME___SceneModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | 5 | class ___VARIABLE_moduleName___SceneModel: BaseSceneModel { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_clock.imageset/ic_clock.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_clock.imageset/ic_clock.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_close.imageset/ic_close.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_close.imageset/ic_close.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_heart.imageset/ic_heart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_heart.imageset/ic_heart.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_logout.imageset/ic_logout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_logout.imageset/ic_logout.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_share.imageset/ic_share.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_share.imageset/ic_share.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_users.imageset/ic_users.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_users.imageset/ic_users.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/WithBaseView/___FILEBASENAME___SceneModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | 5 | class ___VARIABLE_moduleName___SceneModel: BaseSceneModel { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_comment.imageset/ic_comment.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_comment.imageset/ic_comment.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_warning.imageset/ic_warning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_warning.imageset/ic_warning.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/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 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_password.imageset/ic_password.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_password.imageset/ic_password.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/ic_restaurant.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/ic_restaurant.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_back.imageset/ic_back.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_back.imageset/ic_back.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_home.imageset/ic_home.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_home.imageset/ic_home.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_mail.imageset/ic_mail.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_mail.imageset/ic_mail.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_menu.imageset/ic_menu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_menu.imageset/ic_menu.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_more.imageset/ic_more.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_more.imageset/ic_more.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_send.imageset/ic_send.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_send.imageset/ic_send.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_user.imageset/ic_user.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_user.imageset/ic_user.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_editors_pick.imageset/img_editors_pick.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_editors_pick.imageset/img_editors_pick.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/img_logo_fodamy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/img_logo_fodamy.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_clock.imageset/ic_clock.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_clock.imageset/ic_clock.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_close.imageset/ic_close.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_close.imageset/ic_close.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_heart.imageset/ic_heart.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_heart.imageset/ic_heart.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_share.imageset/ic_share.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_share.imageset/ic_share.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_users.imageset/ic_users.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_users.imageset/ic_users.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/img_walkthrough_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/img_walkthrough_1.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/img_walkthrough_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/img_walkthrough_2.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/img_walkthrough_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/img_walkthrough_3.pdf -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/img_walkthrough_4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/img_walkthrough_4.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_logout.imageset/ic_logout.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_logout.imageset/ic_logout.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_comment.imageset/ic_comment.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_comment.imageset/ic_comment.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_password.imageset/ic_password.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_password.imageset/ic_password.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_warning.imageset/ic_warning.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_warning.imageset/ic_warning.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UILaunchScreen 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/Home/HomeSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 20.10.2022. 6 | // 7 | 8 | import Combine 9 | 10 | class HomeSceneModel: BaseSceneModel { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/Image.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Image.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Image: Decodable { 10 | public let url: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Routing/Core/Animator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Animator.swift 3 | // Routing 4 | // 5 | // Created by Nikita Ermolenko on 28/10/2017. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol Animator: UIViewControllerAnimatedTransitioning { 11 | var isPresenting: Bool { get set } 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Comment/CommentEdit/CommentEditRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommentEditRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 31.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class CommentEditRouter: Router {} 10 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/ic_restaurant.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/ic_restaurant.pdf -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Auth/PasswordReset/PasswordResetRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PasswordResetRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 31.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class PasswordResetRouter: Router {} 10 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/MainTabScene/MainTabSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainTabSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 20.10.2022. 6 | // 7 | 8 | import Combine 9 | 10 | class MainTabSceneModel: BaseSceneModel { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/LoginWarning/LoginWarningPopupRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginWarningPopupRouter.swift 3 | // SampleProject 4 | // 5 | // Created by emirhan Acısu on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class LoginWarningPopupRouter: Router {} 10 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/img_logo_fodamy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/img_logo_fodamy.pdf -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/RecipeTime.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeTime.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct RecipeTime: Decodable { 10 | public let text: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_editors_pick.imageset/img_editors_pick.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_editors_pick.imageset/img_editors_pick.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/img_walkthrough_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/img_walkthrough_1.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/img_walkthrough_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/img_walkthrough_2.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/img_walkthrough_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/img_walkthrough_3.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/img_walkthrough_4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/img_walkthrough_4.pdf -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/Image.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Image.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Image: Decodable { 10 | public let url: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/RecipeDetail/RecipeDetailSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 15.02.2024. 6 | // 7 | 8 | import Combine 9 | 10 | class RecipeDetailSceneModel: BaseSceneModel { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/RequestEncoding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestEncoding.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public enum RequestEncoding { 10 | case url 11 | case json 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/NumberOfPerson.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberOfPerson.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct NumberOfPerson: Decodable { 10 | public let text: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/Auth.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Auth.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Auth: Decodable { 10 | public let token: String 11 | public let user: User 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/RequestEncoding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestEncoding.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public enum RequestEncoding { 10 | case url 11 | case json 12 | } 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/mehmetsalihaslan.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobillium/iOS-Guidelines/HEAD/SampleProjectSwiftUI/SampleProjectSwiftUI.xcodeproj/project.xcworkspace/xcuserdata/mehmetsalihaslan.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/SuccessResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SuccessResponse.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct SuccessResponse: Decodable { 10 | public let message: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/RecipeTime.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeTime.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct RecipeTime: Decodable { 10 | public let text: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Constants/DefaultKeys.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultKeys.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 13.10.2022. 6 | // 7 | 8 | import MobilliumUserDefaults 9 | 10 | extension DefaultsKey { 11 | static let isFirstStart = Key(key: "isFirstStart") 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Strings/Placeholder.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Placeholder.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "username" = "Kullanıcı Adı"; 10 | "email" = "E-mail Adresi"; 11 | "password" = "Şifre"; 12 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/Typealias.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Typealias.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public typealias RequestParameters = [String: Any] 10 | public typealias RequestHeaders = [String: String] 11 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/NumberOfPerson.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberOfPerson.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct NumberOfPerson: Decodable { 10 | public let text: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/RecipeListType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeListType.swift 3 | // 4 | // 5 | // Created by Mehmet Salih Aslan on 2.02.2024. 6 | // 7 | 8 | public enum RecipeListType { 9 | case editorChoiceRecipes 10 | case lastAddedRecipes 11 | case categoryRecipes(categoryId: Int) 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Recipes/RecipesRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipesRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Burak Kaya on 15.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class RecipesRouter: Router, RecipesRouter.Routes { 10 | typealias Routes = RecipeDetailRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Constants/Keychain+Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Keychain+Constants.swift 3 | // Utilities 4 | // 5 | // Created by Murat Celebi on 28.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Keychain { 12 | public static let token = "token" 13 | } 14 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/Auth.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Auth.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Auth: Decodable { 10 | public let token: String 11 | public let user: User 12 | } 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/Typealias.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Typealias.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public typealias RequestParameters = [String: Any] 10 | public typealias RequestHeaders = [String: String] 11 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Auth/Register/RegisterRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegisterRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Alihan Aktay on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class RegisterRouter: Router, RegisterRouter.Routes { 10 | typealias Routes = LoginRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Home/HomeRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | final class HomeRouter: Router, HomeRouter.Routes { 10 | typealias Routes = RecipesRoute & RecipeDetailRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/SuccessResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SuccessResponse.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct SuccessResponse: Decodable { 10 | public let message: String? 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Auth/Login/LoginRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Alihan Aktay on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class LoginRouter: Router, LoginRouter.Routes { 10 | typealias Routes = RegisterRoute & PasswordResetRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Extensions/Color+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 6.10.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public extension Color { 11 | 12 | var uiColor: UIColor { 13 | return UIColor(self) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Extensions/Int+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 1.12.2022. 6 | // 7 | 8 | import Foundation 9 | 10 | public extension Int { 11 | 12 | var toCGFloat: CGFloat { 13 | return CGFloat(self) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Strings/Placeholder.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Placeholder.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "username" = "Kullanıcı Adı"; 10 | "email" = "E-mail Adresi"; 11 | "password" = "Şifre"; 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/Default/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | 5 | public protocol ___VARIABLE_moduleName___ViewProtocol { 6 | 7 | } 8 | 9 | public struct ___VARIABLE_moduleName___ViewModel: ___VARIABLE_moduleName___ViewProtocol { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/BaseResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseResponse.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct BaseResponse: Decodable { 10 | public let data: T 11 | public let pagination: Pagination 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/WalkThrough/WalkThroughRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WalkThroughRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class WalkThroughRouter: Router, WalkThroughRouter.Routes { 10 | typealias Routes = MainTabBarRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Extensions/Int+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+Extensions.swift 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | public extension Int { 10 | 11 | var toString: String { 12 | return String(self) 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/Default/___FILEBASENAME___ViewController.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | final class ___VARIABLE_moduleName___ViewController: BaseViewController<___VARIABLE_moduleName___ViewModel> { 6 | 7 | override func viewDidLoad() { 8 | super.viewDidLoad() 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Favorites/FavoritesRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FavoritesRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Hüseyin Özgür on 20.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class FavoritesRouter: Router, FavoritesRouter.Routes { 10 | typealias Routes = RecipesRoute & RecipeDetailRoute 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_heart.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/ic_home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_home.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Protocols/ReusableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReusableView.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol ReusableView: AnyObject { 12 | static var defaultReuseIdentifier: String { get } 13 | } 14 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Assets.xcassets/fodamy-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "fodamy-logo.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/DecodableResponseRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DecodableResponseRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 12.11.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | public protocol DecodableResponseRequest: RequestProtocol { 10 | associatedtype ResponseType: Decodable 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/DataProviderTests-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #ifndef SampleProject_Bridging_Header_h 6 | #define SampleProject_Bridging_Header_h 7 | 8 | #import 9 | 10 | #endif /* SampleProject_Bridging_Header_h */ 11 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_back.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_clock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_clock.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_close.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_heart.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_home.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_logout.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_logout.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_mail.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_mail.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_menu.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_more.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_send.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_send.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_share.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_user.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_user.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_users.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_users.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/BaseResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseResponse.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct BaseResponse: Decodable { 10 | public let data: T 11 | public let pagination: Pagination 12 | } 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/DecodableResponseRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DecodableResponseRequest.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 12.11.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | public protocol DecodableResponseRequest: RequestProtocol { 10 | associatedtype ResponseType: Decodable 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Constants/NotificationNames.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NotificationNames.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 03.06.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension Notification.Name { 12 | static let reloadDetailView = Notification.Name("reloadDetailView") 13 | } 14 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_comment.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_comment.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_password.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_password.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_warning.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_warning.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_restaurant.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_editors_pick.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_editors_pick.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_logo_fodamy.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_back.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_back.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_clock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_clock.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_close.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_heart.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_heart.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_home.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_home.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_mail.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_mail.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_menu.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_more.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_more.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_send.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_send.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_share.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_user.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_user.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_users.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_users.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Constants/DateFormats.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateFormats.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 5.02.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import MobilliumDateFormatter 10 | 11 | extension Date.Format { 12 | /// dd.MM.yyyy 13 | static let readableDate = Date.Format.custom(rawValue: "dd.MM.yyyy") 14 | } 15 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_1.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_2.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_3.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_4.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Strings/Componenets.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Components.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | // MARK: - Action 10 | "Action.block" = "Block"; 11 | "Action.loginWarning" = "Giriş yapmanız gereklidir."; 12 | "Comment.placeholder" = "Bir şeyler yazın.."; 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_comment.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_comment.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_logout.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_logout.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_password.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_password.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_warning.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_warning.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Icons.xcassets/ic_restaurant.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ic_restaurant.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Extensions/UITextField+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+Extensions.swift 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UITextField { 12 | 13 | var trimmedText: String { 14 | return text!.trim 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_logo_fodamy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_logo_fodamy.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_editors_pick.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_editors_pick.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_1.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_2.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_3.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Images.xcassets/img_walkthrough_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "img_walkthrough_4.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/App/SampleProjectSwiftUIApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProjectSwiftUIApp.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 15.09.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct SampleProjectSwiftUIApp: App { 12 | 13 | var body: some Scene { 14 | WindowGroup { 15 | RootScene() 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/Identifiable/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | 5 | public protocol ___VARIABLE_moduleName___ViewProtocol: Identifiable { 6 | var id: UUID { get } 7 | } 8 | 9 | public struct ___VARIABLE_moduleName___ViewModel: ___VARIABLE_moduleName___ViewProtocol { 10 | public var id = UUID() 11 | } 12 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Strings/Componenets.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Components.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | // MARK: - Action 10 | "Action.block" = "Block"; 11 | "Action.loginWarning" = "Giriş yapmanız gereklidir."; 12 | "Comment.placeholder" = "Bir şeyler yazın.."; 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Routing/Transitions/Transition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Transition.swift 3 | // Routing 4 | // 5 | // Created by Nikita Ermolenko on 29/09/2017. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol Transition: AnyObject { 12 | var viewController: UIViewController? { get set } 13 | 14 | func open(_ viewController: UIViewController) 15 | func close(_ viewController: UIViewController) 16 | } 17 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Extensions/UIEdgeInsets+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIEdgeInsets+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 6.10.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public extension UIEdgeInsets { 11 | 12 | var insets: EdgeInsets { 13 | return EdgeInsets(top: top, leading: left, bottom: bottom, trailing: right) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension String { 12 | 13 | var trim: String { 14 | return self.trimmingCharacters(in: .whitespacesAndNewlines) 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Packages/Tests/PackagesTests/PackagesTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Packages 3 | 4 | final class PackagesTests: XCTestCase { 5 | func testExample() throws { 6 | // This is an example of a functional test case. 7 | // Use XCTAssert and related functions to verify your tests produce the correct 8 | // results. 9 | XCTAssertEqual(Packages().text, "Hello, World!") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Constants/DefaultsKeys.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultsKeys.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 5.02.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import MobilliumUserDefaults 10 | 11 | public extension DefaultsKey { 12 | static let isWalkThroughCompleted = Key(key: "isWalkThroughCompleted") 13 | static let userId = Key(key: "userId") 14 | } 15 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Extensions/ReusableView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReusableView+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension ReusableView where Self: UIView { 12 | static var defaultReuseIdentifier: String { 13 | return String(describing: self) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Tests/NetworkTests/NetworkTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Network 3 | 4 | final class NetworkTests: XCTestCase { 5 | func testExample() throws { 6 | // XCTest Documentation 7 | // https://developer.apple.com/documentation/xctest 8 | 9 | // Defining Test Cases and Test Methods 10 | // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Utilities/Tests/UtilitiesTests/UtilitiesTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Utilities 3 | 4 | final class UtilitiesTests: XCTestCase { 5 | func testExample() throws { 6 | // XCTest Documentation 7 | // https://developer.apple.com/documentation/xctest 8 | 9 | // Defining Test Cases and Test Methods 10 | // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Comment/CommentList/CommentListRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommentListRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 31.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class CommentListRouter: Router, CommentListRouter.Routes { 10 | typealias Routes = LoginWarningPopupRoute & 11 | LoginRoute & 12 | CommentEditDeleteAlertViewRoute & 13 | CommentEditRoute 14 | } 15 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Tests/ComponentsTests/ComponentsTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import Components 3 | 4 | final class ComponentsTests: XCTestCase { 5 | func testExample() throws { 6 | // XCTest Documentation 7 | // https://developer.apple.com/documentation/xctest 8 | 9 | // Defining Test Cases and Test Methods 10 | // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/DataProviderProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataProviderProtocol.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public typealias DecodableResult = Result 10 | 11 | public protocol DataProviderProtocol { 12 | func request(for request: T) async -> DecodableResult 13 | } 14 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Constants/Closures.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Closures.swift 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public typealias VoidClosure = (() -> Void) 10 | public typealias IntClosure = ((Int) -> Void) 11 | public typealias BoolClosure = ((Bool) -> Void) 12 | public typealias StringClosure = ((String) -> Void) 13 | public typealias IndexPathClosure = ((IndexPath) -> Void) 14 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Tests/DataProviderTests/DataProviderTests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | @testable import DataProvider 3 | 4 | final class DataProviderTests: XCTestCase { 5 | func testExample() throws { 6 | // XCTest Documentation 7 | // https://developer.apple.com/documentation/xctest 8 | 9 | // Defining Test Cases and Test Methods 10 | // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Templates/install-templates.md: -------------------------------------------------------------------------------- 1 | # Mobillium Templates 2 | 3 | 4 | ## Installations 5 | 6 | 1. Install `Xcode`. 7 | 1. Create the `Templates` folder if it does not exist. 8 | 2. Clone or download this repo. 9 | 3. Click `install_templates.exec` file in Templates folder. 10 | 11 | ```bash 12 | ~/Library/Developer/Xcode/Templates/ 13 | ``` 14 | 15 | 16 | ## Usage 17 | 18 | How to use template. 19 | 20 | ```bash 21 | XCode -> Project -> New File -> Mobillium Tamplates -> Template Name 22 | ``` 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/Pagination.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Pagination: Decodable { 10 | public let currentPage: Int 11 | public let lastPage: Int 12 | 13 | enum CodingKeys: String, CodingKey { 14 | case currentPage = "current_page" 15 | case lastPage = "last_page" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/RecipeDetail/RecipeDetailRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailRouter.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | final class RecipeDetailRouter: Router, RecipeDetailRouter.Routes { 10 | typealias Routes = LoginWarningPopupRoute & 11 | LoginRoute & 12 | UnfollowAlertViewRoute & 13 | CommentListRoute & 14 | ShareSheetRoute 15 | } 16 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.110", 9 | "green" : "0.220", 10 | "red" : "0.925" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appYellow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0xCE", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/Request.xctemplate/___FILEBASENAME___Request.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | public struct ___VARIABLE_moduleName___Request: RequestProtocol { 4 | 5 | public typealias ResponseType = <#T##Type###> 6 | 7 | public var path: String = <#T##Type###> 8 | public var method: RequestMethod = <#T##Type###> 9 | public var parameters: RequestParameters = [:] 10 | public var headers: RequestHeaders = [:] 11 | 12 | public init() {} 13 | 14 | } 15 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/MainCategory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainCategory.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct MainCategory: Decodable { 10 | public let id: Int 11 | public let name: String? 12 | public let recipes: [Recipe] 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case id 16 | case name 17 | case recipes 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appCinder.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.161", 9 | "green" : "0.145", 10 | "red" : "0.129" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appHeather.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.741", 9 | "green" : "0.710", 10 | "red" : "0.678" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appRaven.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.490", 9 | "green" : "0.459", 10 | "red" : "0.424" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appWhite.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "1.000", 9 | "green" : "1.000", 10 | "red" : "1.000" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/appZircon.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.902", 9 | "green" : "0.886", 10 | "red" : "0.871" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/Pagination.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Pagination: Decodable { 10 | public let currentPage: Int 11 | public let lastPage: Int 12 | 13 | enum CodingKeys: String, CodingKey { 14 | case currentPage = "current_page" 15 | case lastPage = "last_page" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/install-templates.md: -------------------------------------------------------------------------------- 1 | # Mobillium Templates 2 | 3 | 4 | ## Installations 5 | 6 | 1. Install `Xcode`. 7 | 1. Create the `Templates` folder if it does not exist. 8 | 2. Clone or download this repo. 9 | 3. Click `install_templates.exec` file in Templates folder. 10 | 11 | ```bash 12 | ~/Library/Developer/Xcode/Templates/ 13 | ``` 14 | 15 | 16 | ## Usage 17 | 18 | How to use template. 19 | 20 | ```bash 21 | XCode -> Project -> New File -> SwiftUI Tamplates -> Template Name 22 | ``` 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appCinder.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x29", 9 | "green" : "0x24", 10 | "red" : "0x20" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appRaven.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x7C", 9 | "green" : "0x75", 10 | "red" : "0x6C" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x1C", 9 | "green" : "0x38", 10 | "red" : "0xEB" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appWhite.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" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appYellow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0xCE", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appZircon.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE6", 9 | "green" : "0xE1", 10 | "red" : "0xDE" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appHeather.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xBC", 9 | "green" : "0xB5", 10 | "red" : "0xAC" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appSeparator.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE6", 9 | "green" : "0xE2", 10 | "red" : "0xDE" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/appShadow.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.161", 9 | "green" : "0.145", 10 | "red" : "0.129" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Auth/LogoutRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogoutRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct LogoutRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = SuccessResponse 12 | 13 | public var path: String = "auth/logout" 14 | public var method: RequestMethod = .post 15 | 16 | public init() {} 17 | 18 | } 19 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/Background/appPrimaryBackground.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" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Assets/Colors.xcassets/Background/appSecondaryBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF3", 9 | "green" : "0xF1", 10 | "red" : "0xF0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/RequestProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestProtocol.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public protocol RequestProtocol { 10 | var path: String { get } 11 | var method: RequestMethod { get } 12 | var parameters: RequestParameters { get } 13 | var headers: RequestHeaders { get } 14 | var encoding: RequestEncoding { get } 15 | var url: String { get } 16 | } 17 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView.xctemplate/Default/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___VARIABLE_moduleName___: UIView { 6 | 7 | override init(frame: CGRect) { 8 | super.init(frame: frame) 9 | configureContents() 10 | } 11 | 12 | required init?(coder aDecoder: NSCoder) { 13 | super.init(coder: aDecoder) 14 | configureContents() 15 | } 16 | 17 | private func configureContents() { 18 | 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Configurations/BridgingHeader/SampleProject-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProject-Bridging-Header.h 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | #ifndef SampleProject_Bridging_Header_h 10 | #define SampleProject_Bridging_Header_h 11 | 12 | #import 13 | #import 14 | #import 15 | 16 | #endif /* SampleProject_Bridging_Header_h */ 17 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/Background/appPrimaryBackground.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" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Assets/Colors.xcassets/Background/appSecondaryBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF3", 9 | "green" : "0xF1", 10 | "red" : "0xF0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView.xctemplate/Public/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | public class ___VARIABLE_moduleName___: UIView { 6 | 7 | override init(frame: CGRect) { 8 | super.init(frame: frame) 9 | configureContents() 10 | } 11 | 12 | required init?(coder aDecoder: NSCoder) { 13 | super.init(coder: aDecoder) 14 | configureContents() 15 | } 16 | 17 | private func configureContents() { 18 | 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/UIComponents/CategoryCellModel+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryCellViiewModel+Extension.swift 3 | // Fodamy 4 | // 5 | // Created by Catalina on 12.01.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | extension CategoryWithRecipesCellModel { 11 | 12 | convenience init(category: MainCategory) { 13 | let cellItems = category.recipes.map({ RecipeCellModel(recipe: $0) }) 14 | self.init(categoryId: category.id, categoryImageURL: nil, categoryName: category.name, cellItems: cellItems) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Constants/ScreenSize.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScreenSize.swift 3 | // SampleProject 4 | // 5 | // Created by Alperen Ünal on 16.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum ScreenSize { 12 | static let width = UIScreen.main.bounds.size.width 13 | static let height = UIScreen.main.bounds.size.height 14 | static let maxLength = max(ScreenSize.width, ScreenSize.height) 15 | static let minLength = min(ScreenSize.width, ScreenSize.height) 16 | } 17 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/DataProviderProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataProviderProtocol.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public typealias DataProviderResult = ((Result) -> Void) 10 | 11 | public protocol DataProviderProtocol { 12 | 13 | func request(for request: T, 14 | result: DataProviderResult?) 15 | } 16 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/Default/___FILEBASENAME___Model.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | protocol ___VARIABLE_moduleName___DataSource: AnyObject { 6 | 7 | } 8 | 9 | protocol ___VARIABLE_moduleName___EventSource: AnyObject { 10 | 11 | } 12 | 13 | protocol ___VARIABLE_moduleName___Protocol: ___VARIABLE_moduleName___DataSource, ___VARIABLE_moduleName___EventSource { 14 | 15 | } 16 | 17 | final class ___VARIABLE_moduleName___Model: ___VARIABLE_moduleName___Protocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Scene.xctemplate/Default/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | protocol ___VARIABLE_moduleName___ViewDataSource {} 6 | 7 | protocol ___VARIABLE_moduleName___ViewEventSource {} 8 | 9 | protocol ___VARIABLE_moduleName___ViewProtocol: ___VARIABLE_moduleName___ViewDataSource, ___VARIABLE_moduleName___ViewEventSource {} 10 | 11 | final class ___VARIABLE_moduleName___ViewModel: BaseViewModel<___VARIABLE_moduleName___Router>, ___VARIABLE_moduleName___ViewProtocol { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Delegates/PhotoBrowserDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SKPhotoBrowserDelegate.swift 3 | // SampleProject 4 | // 5 | // Created by Alperen Ünal on 7.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import SKPhotoBrowser 10 | 11 | final class PhotoBrowserDelegate: SKPhotoBrowserDelegate { 12 | 13 | var willDismissAtPage: IntClosure? 14 | 15 | func willDismissAtPageIndex(_ index: Int) { 16 | if let didDismiss = willDismissAtPage { 17 | didDismiss(index) 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/DataProvider/DataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataProvider.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 15.11.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | #if DEBUG 10 | let apiDataProvider = APIDataProvider(interceptor: APIRequestInterceptor.shared, 11 | eventMonitors: [APILogger.shared]) 12 | #else 13 | let apiDataProvider = APIDataProvider(interceptor: APIRequestInterceptor.shared, 14 | eventMonitors: []) 15 | #endif 16 | -------------------------------------------------------------------------------- /SampleProject/Utilities/UtilitiesTests/ExtensionsTests/Int+ExtensionsTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+ExtensionsTests.swift 3 | // UtilitiesTests 4 | // 5 | // Created by Mehmet Salih Aslan on 29.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class IntExtensionsTests: XCTestCase { 12 | 13 | func testToString() { 14 | let number = 100 15 | XCTAssertEqual("100", number.toString) 16 | 17 | let number1 = 100_000 18 | XCTAssertEqual("100000", number1.toString) 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Auth/LogoutRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LogoutRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct LogoutRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = SuccessResponse 14 | 15 | public var path: String = "auth/logout" 16 | public var method: RequestMethod = .post 17 | 18 | public init() {} 19 | 20 | } 21 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/Public/___FILEBASENAME___Model.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | public protocol ___VARIABLE_moduleName___DataSource: AnyObject { 6 | 7 | } 8 | 9 | public protocol ___VARIABLE_moduleName___EventSource: AnyObject { 10 | 11 | } 12 | 13 | public protocol ___VARIABLE_moduleName___Protocol: ___VARIABLE_moduleName___DataSource, ___VARIABLE_moduleName___EventSource { 14 | 15 | } 16 | 17 | public final class ___VARIABLE_moduleName___Model: ___VARIABLE_moduleName___Protocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Strings/Error.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Error.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "empty" = "%@ alanı boş olamaz."; 10 | "refreshFromTop" = "Lütfen ekranı yukarıdan aşağıya kaydırarak yenileyiniz."; 11 | "emptyFields" = "Lütfen boş alanları doldurunuz."; 12 | "checkInformations" = "Lütfen bilgilerinizi kontrol ediniz."; 13 | 14 | // MARK: - Keys 15 | "Key.username" = "Username"; 16 | "Key.email" = "E-posta"; 17 | "Key.comment" = "Yorum"; 18 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/MainCategory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainCategory.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct MainCategory: Decodable { 10 | public let id: Int 11 | public let name: String? 12 | public let recipes: [Recipe] 13 | public let image: Image? 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | case name 18 | case recipes 19 | case image 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/Default/___FILEBASENAME___CellModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | protocol ___VARIABLE_moduleName___CellDataSource: AnyObject { 6 | 7 | } 8 | 9 | protocol ___VARIABLE_moduleName___CellEventSource: AnyObject { 10 | 11 | } 12 | 13 | protocol ___VARIABLE_moduleName___CellProtocol: ___VARIABLE_moduleName___CellDataSource, ___VARIABLE_moduleName___CellEventSource { 14 | 15 | } 16 | 17 | final class ___VARIABLE_moduleName___CellModel: ___VARIABLE_moduleName___CellProtocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/Default/___FILEBASENAME___CellModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | protocol ___VARIABLE_moduleName___CellDataSource: AnyObject { 6 | 7 | } 8 | 9 | protocol ___VARIABLE_moduleName___CellEventSource: AnyObject { 10 | 11 | } 12 | 13 | protocol ___VARIABLE_moduleName___CellProtocol: ___VARIABLE_moduleName___CellDataSource, ___VARIABLE_moduleName___CellEventSource { 14 | 15 | } 16 | 17 | final class ___VARIABLE_moduleName___CellModel: ___VARIABLE_moduleName___CellProtocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/RecipeComment.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeComment.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct RecipeComment: Decodable { 10 | public let id: Int 11 | public let text: String? 12 | public let timeDifference: String? 13 | public let user: User 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | case text 18 | case timeDifference = "difference" 19 | case user 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/RequestProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestProtocol.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public protocol RequestProtocol { 10 | var path: String { get } 11 | var method: RequestMethod { get } 12 | var queryParameters: RequestParameters { get } 13 | var bodyParameters: RequestParameters { get } 14 | var headers: RequestHeaders { get } 15 | var encoding: RequestEncoding { get } 16 | var url: String { get } 17 | } 18 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Cell/EmptyCell/EmptyCellModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyCellModel.swift 3 | // UIComponents 4 | // 5 | // Created by Murat Celebi on 4.06.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol EmptyCellDataSource: AnyObject { 12 | 13 | } 14 | 15 | public protocol EmptyCellEventSource: AnyObject { 16 | 17 | } 18 | 19 | public protocol EmptyCellProtocol: EmptyCellDataSource, EmptyCellEventSource { 20 | 21 | } 22 | 23 | public final class EmptyCellModel: EmptyCellProtocol { 24 | 25 | } 26 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Strings/Error.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Error.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "empty" = "%@ alanı boş olamaz."; 10 | "refreshFromTop" = "Lütfen ekranı yukarıdan aşağıya kaydırarak yenileyiniz."; 11 | "emptyFields" = "Lütfen boş alanları doldurunuz."; 12 | "checkInformations" = "Lütfen bilgilerinizi kontrol ediniz."; 13 | 14 | // MARK: - Keys 15 | "Key.username" = "Username"; 16 | "Key.email" = "E-posta"; 17 | "Key.comment" = "Yorum"; 18 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/Public/___FILEBASENAME___CellModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | public protocol ___VARIABLE_moduleName___CellDataSource: AnyObject { 6 | 7 | } 8 | 9 | public protocol ___VARIABLE_moduleName___CellEventSource: AnyObject { 10 | 11 | } 12 | 13 | public protocol ___VARIABLE_moduleName___CellProtocol: ___VARIABLE_moduleName___CellDataSource, ___VARIABLE_moduleName___CellEventSource { 14 | 15 | } 16 | 17 | public final class ___VARIABLE_moduleName___CellModel: ___VARIABLE_moduleName___CellProtocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/CategoryDetail.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryDetail.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct CategoryDetail: Decodable { 10 | public let id: Int 11 | public let name: String? 12 | public let mainCategoryId: Int? 13 | public let imageUrl: Image? 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | case name 18 | case mainCategoryId = "main_category_id" 19 | case imageUrl = "image" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/RecipeComment.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeComment.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct RecipeComment: Decodable { 10 | public let id: Int 11 | public let text: String? 12 | public let timeDifference: String? 13 | public let user: User 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | case text 18 | case timeDifference = "difference" 19 | case user 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Like/DeleteRecipeLikeRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeleteRecipeLikeRequest.swift 3 | // 4 | // 5 | // Created by Mehmet Salih Aslan on 2.02.2024. 6 | // 7 | 8 | import Network 9 | 10 | public struct DeleteRecipeLikeRequest: APIDecodableResponseRequest { 11 | 12 | public typealias ResponseType = SuccessResponse 13 | 14 | public var path: String = "recipe/{recipeId}/like" 15 | public var method: RequestMethod = .delete 16 | 17 | public init(recipeId: Int) { 18 | self.path = "recipe/\(recipeId)/like" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/Public/___FILEBASENAME___CellModel.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | public protocol ___VARIABLE_moduleName___CellDataSource: AnyObject { 6 | 7 | } 8 | 9 | public protocol ___VARIABLE_moduleName___CellEventSource: AnyObject { 10 | 11 | } 12 | 13 | public protocol ___VARIABLE_moduleName___CellProtocol: ___VARIABLE_moduleName___CellDataSource, ___VARIABLE_moduleName___CellEventSource { 14 | 15 | } 16 | 17 | public final class ___VARIABLE_moduleName___CellModel: ___VARIABLE_moduleName___CellProtocol { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/GetRecipeDetailRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecipeDetailRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct GetRecipeDetailRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = RecipeDetail 12 | 13 | public var path: String = "recipe/{recipeId}" 14 | public var method: RequestMethod = .get 15 | 16 | public init(recipeId: Int) { 17 | self.path = "recipe/\(recipeId)" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SampleProject/SampleProject.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Utilities.h: -------------------------------------------------------------------------------- 1 | // 2 | // Utilities.h 3 | // Utilities 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Utilities. 12 | FOUNDATION_EXPORT double UtilitiesVersionNumber; 13 | 14 | //! Project version string for Utilities. 15 | FOUNDATION_EXPORT const unsigned char UtilitiesVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/User/Follow/DeleteUserFollowRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeleteUserFollowRequest.swift 3 | // 4 | // 5 | // Created by Mehmet Salih Aslan on 2.02.2024. 6 | // 7 | 8 | import Network 9 | 10 | public struct DeleteUserFollowRequest: APIDecodableResponseRequest { 11 | 12 | public typealias ResponseType = SuccessResponse 13 | 14 | public var path: String = "user/{followedId}/following" 15 | public var method: RequestMethod = .delete 16 | 17 | public init(followedId: Int) { 18 | self.path = "user/\(followedId)/following" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/UIComponents/UserViewModel+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserViewModel+Extensions.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 8.12.2022. 6 | // 7 | 8 | import DataProvider 9 | import Components 10 | import Foundation 11 | 12 | extension UserViewModel { 13 | 14 | init(recipe: Recipe) { 15 | self.init(imageUrl: recipe.user.image?.url ?? "", 16 | username: recipe.user.username ?? "", 17 | stat: L10n.Modules.Home.userRecipeAndFollowerCount(recipe.user.recipeCount, recipe.user.followingCount)) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/CategoryDetail.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CategoryDetail.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct CategoryDetail: Decodable { 10 | public let id: Int 11 | public let name: String? 12 | public let mainCategoryId: Int? 13 | public let imageUrl: Image? 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | case name 18 | case mainCategoryId = "main_category_id" 19 | case imageUrl = "image" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Resources/Strings/General.strings: -------------------------------------------------------------------------------- 1 | /* 2 | General.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "login" = "Giriş Yap"; 10 | "register" = "Üye Ol"; 11 | "comment" = "Yorum"; 12 | "like" = "Beğeni"; 13 | "follow" = "Takip Et"; 14 | "following" = "Takip Ediliyor"; 15 | "recipeIngredients" = "Malzemeler"; 16 | "recipeSteps" = "Yapılışı"; 17 | "addComment" = "Yorum Ekle"; 18 | "comments" = "Yorumlar"; 19 | "giveUp" = "Vazgeç"; 20 | "login" = "Giriş Yap"; 21 | "recipe" = "Tarif"; 22 | "follower" = "Takipçi"; 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/DataProvider/DataProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataProvider.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 15.11.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Alamofire 10 | import DataProvider 11 | 12 | #if DEBUG 13 | let apiDataProvider = APIDataProvider(interceptor: APIRequestInterceptor.shared, 14 | eventMonitors: [APILogger.shared]) 15 | #else 16 | let apiDataProvider = APIDataProvider(interceptor: APIRequestInterceptor.shared, 17 | eventMonitors: []) 18 | #endif 19 | -------------------------------------------------------------------------------- /SampleProject/Utilities/UtilitiesTests/ExtensionsTests/String+ExtensionsTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+ExtensionsTests.swift 3 | // UtilitiesTests 4 | // 5 | // Created by Mehmet Salih Aslan on 29.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Utilities 11 | 12 | class StringExtensionsTests: XCTestCase { 13 | 14 | func testTrim() { 15 | var string = " Salih " 16 | XCTAssertEqual("Salih", string.trim) 17 | 18 | string = "\n\n Salih " + "Aslan\n\n" 19 | 20 | XCTAssertEqual("Salih Aslan", string.trim) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/DataProvider.h: -------------------------------------------------------------------------------- 1 | // 2 | // DataProvider.h 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for DataProvider. 12 | FOUNDATION_EXPORT double DataProviderVersionNumber; 13 | 14 | //! Project version string for DataProvider. 15 | FOUNDATION_EXPORT const unsigned char DataProviderVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Main/MainTabBarRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainTabBarRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 28.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol MainTabBarRoute { 12 | func placeOnWindowMainTabBar() 13 | } 14 | 15 | extension MainTabBarRoute where Self: RouterProtocol { 16 | 17 | func placeOnWindowMainTabBar() { 18 | let mainTabBarController = MainTabBarController() 19 | let transition = PlaceOnWindowTransition() 20 | 21 | open(mainTabBarController, transition: transition) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iOS 2 | 3 | ### Table of Contents 4 | 5 | 1. [Project Folder Structure](https://github.com/mobillium/iOS-Guidelines/blob/master/project-folder-structure.md) 6 | 2. [Swift Style Guide](https://github.com/mobillium/iOS-Guidelines/blob/master/swift-guideline.md) 7 | 3. [Resources Guideline](https://github.com/mobillium/iOS-Guidelines/blob/master/resources-guideline.md) 8 | 4. [Mobillium Templates](https://github.com/mobillium/iOS-Guidelines/blob/master/Templates/install-templates.md) 9 | 5. [Mobillium Git Guidelines](https://github.com/mobillium/MobilliumGitGuidelines) 10 | 6. [Mobillium CI/CD Guidelines](https://github.com/mobillium/MobilliumCICDGuidelines) 11 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Auth/ForgotPasswordRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ForgotPasswordRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct ForgotPasswordRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = Auth 12 | 13 | public var path: String = "auth/forgot" 14 | public var method: RequestMethod = .post 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(email: String) { 18 | parameters["email"] = email 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Resources/Strings/General.strings: -------------------------------------------------------------------------------- 1 | /* 2 | General.strings 3 | SampleProject 4 | 5 | Created by Mehmet Salih Aslan on 26.02.2021. 6 | Copyright © 2021 SampleProject. All rights reserved. 7 | */ 8 | 9 | "login" = "Giriş Yap"; 10 | "register" = "Üye Ol"; 11 | "comment" = "Yorum"; 12 | "like" = "Beğeni"; 13 | "follow" = "Takip Et"; 14 | "following" = "Takip Ediliyor"; 15 | "recipeIngredients" = "Malzemeler"; 16 | "recipeSteps" = "Yapılışı"; 17 | "addComment" = "Yorum Ekle"; 18 | "comments" = "Yorumlar"; 19 | "giveUp" = "Vazgeç"; 20 | "login" = "Giriş Yap"; 21 | "recipe" = "Tarif"; 22 | "follower" = "Takipçi"; 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/GetRecipeDetailRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecipeDetailRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | import Network 9 | 10 | public struct GetRecipeDetailRequest: APIDecodableResponseRequest { 11 | 12 | public typealias ResponseType = RecipeDetail 13 | 14 | public var path: String = "recipe/{recipeId}" 15 | public var method: RequestMethod = .get 16 | 17 | public init(recipeId: Int) { 18 | self.path = "recipe/\(recipeId)" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Extensions/EnvironmentValues+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EnvironmentValues+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 6.10.2022. 6 | // 7 | 8 | import UIKit 9 | import SwiftUI 10 | 11 | public struct SafeAreaInsetsKey: EnvironmentKey { 12 | public static var defaultValue: EdgeInsets { 13 | return (UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.safeAreaInsets ?? .zero).insets 14 | } 15 | } 16 | 17 | public extension EnvironmentValues { 18 | 19 | var safeAreaInsets: EdgeInsets { 20 | self[SafeAreaInsetsKey.self] 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Like/AddRecipeLikeRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostRecipeLikeRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct AddRecipeLikeRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = SuccessResponse 14 | 15 | public var path: String = "recipe/{recipeId}/like" 16 | public var method: RequestMethod = .post 17 | 18 | public init(recipeId: Int) { 19 | self.path = "recipe/\(recipeId)/like" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/Root/RootSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RootSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 13.10.2022. 6 | // 7 | 8 | import Combine 9 | 10 | class RootSceneModel: BaseSceneModel { 11 | 12 | static let shared = RootSceneModel(dataProvider: apiDataProvider) 13 | 14 | @Published var state: State = .splash(viewModel: SplashSceneModel(dataProvider: apiDataProvider)) 15 | 16 | enum State { 17 | case splash(viewModel: SplashSceneModel) 18 | case onboarding(viewModel: OnboardingSceneModel) 19 | case mainTab(viewModel: MainTabSceneModel) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/User/Follow/AddUserFollowRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AddUserFollowRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct AddUserFollowRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = SuccessResponse 14 | 15 | public var path: String = "user/{followedId}/following" 16 | public var method: RequestMethod = .post 17 | 18 | public init(followedId: Int) { 19 | self.path = "user/\(followedId)/following" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Core/RequestMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestMethod.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public enum RequestMethod { 10 | /// `CONNECT` method. 11 | case connect 12 | /// `DELETE` method. 13 | case delete 14 | /// `GET` method. 15 | case get 16 | /// `HEAD` method. 17 | case head 18 | /// `OPTIONS` method. 19 | case options 20 | /// `PATCH` method. 21 | case patch 22 | /// `POST` method. 23 | case post 24 | /// `PUT` method. 25 | case put 26 | /// `TRACE` method. 27 | case trace 28 | } 29 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Auth/LoginRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct LoginRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = Auth 12 | 13 | public var path: String = "auth/login" 14 | public var method: RequestMethod = .post 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(username: String, password: String) { 18 | parameters["username"] = username 19 | parameters["password"] = password 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/Comment/DeleteRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeleteRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct DeleteRecipeCommentRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = SuccessResponse 12 | 13 | public var path: String = "recipe/{recipeId}/comment/{commentId}" 14 | public var method: RequestMethod = .delete 15 | 16 | public init(recipeId: Int, commentId: Int) { 17 | self.path = "recipe/\(recipeId)/comment/\(commentId)" 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/GetCategoriesWithRecipesRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetCategoriesWithRecipesRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct GetCategoriesWithRecipesRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = BaseResponse<[MainCategory]> 12 | 13 | public var path: String = "category-recipes" 14 | public var method: RequestMethod = .get 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(page: Int) { 18 | parameters["page"] = page 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/UICollectionView/DynamicHeightCollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DynamicHeightCollectionView.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 15.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | public class DynamicHeightCollectionView: UICollectionView { 10 | 11 | public override func layoutSubviews() { 12 | super.layoutSubviews() 13 | if !(__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize)) { 14 | self.invalidateIntrinsicContentSize() 15 | } 16 | } 17 | 18 | public override var intrinsicContentSize: CGSize { 19 | return contentSize 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Auth/ForgotPasswordRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ForgotPasswordRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct ForgotPasswordRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = Auth 14 | 15 | public var path: String = "auth/forgot" 16 | public var method: RequestMethod = .post 17 | public var bodyParameters: RequestParameters = [:] 18 | 19 | public init(email: String) { 20 | bodyParameters["email"] = email 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/Default/___FILEBASENAME___Scene.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | import SwiftUI 5 | 6 | struct ___VARIABLE_moduleName___Scene: View { 7 | 8 | @ObservedObject var viewModel: ViewModel 9 | 10 | var body: some View { 11 | Text("___VARIABLE_moduleName___") 12 | } 13 | } 14 | 15 | struct ___VARIABLE_moduleName___Scene_Previews: PreviewProvider { 16 | static var previews: some View { 17 | let viewModel = ___VARIABLE_moduleName___SceneModel() 18 | return ___VARIABLE_moduleName___Scene(viewModel: viewModel) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/RecipeDetail/RecipeDetailScene.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailScene.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 15.02.2024. 6 | // 7 | 8 | import Combine 9 | import SwiftUI 10 | 11 | struct RecipeDetailScene: View { 12 | 13 | @ObservedObject var viewModel: ViewModel 14 | 15 | var body: some View { 16 | BaseScene(content: { 17 | Text("RecipeDetail") 18 | }, viewModel: viewModel) 19 | } 20 | } 21 | 22 | #Preview { 23 | let viewModel = RecipeDetailSceneModel(dataProvider: apiDataProvider) 24 | return RecipeDetailScene(viewModel: viewModel) 25 | } 26 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Routing/Routes/ShareSheetRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShareSheetRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 04.06.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol ShareSheetRoute { 12 | func presentShareSheet(items: [Any]) 13 | } 14 | 15 | extension ShareSheetRoute where Self: RouterProtocol { 16 | 17 | func presentShareSheet(items: [Any]) { 18 | let shareSheetController = UIActivityViewController(activityItems: items, applicationActivities: nil) 19 | 20 | let transition = ModalTransition() 21 | 22 | open(shareSheetController, transition: transition) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/AppDelegate/AppDelegate+SKPhotoBrowser.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate+SKPhotoBrowser.swift 3 | // SampleProject 4 | // 5 | // Created by Alperen Ünal on 23.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import SKPhotoBrowser 10 | 11 | extension AppDelegate { 12 | 13 | func configureSKPhotoBrowser() { 14 | SKPhotoBrowserOptions.displayAction = false 15 | SKPhotoBrowserOptions.displayHorizontalScrollIndicator = false 16 | SKPhotoBrowserOptions.displayVerticalScrollIndicator = false 17 | SKPhotoBrowserOptions.displayCounterLabel = true 18 | SKCache.sharedCache.imageCache = SKPhotoBrowserKingfisherCache() 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Extensions/UIImage+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Extensions.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 24.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Kingfisher 10 | 11 | public extension UIImage { 12 | 13 | func resize(to size: CGSize, for contentMode: UIView.ContentMode? = nil) -> UIImage { 14 | switch contentMode { 15 | case .scaleAspectFit: 16 | return kf.resize(to: size, for: .aspectFit) 17 | case .scaleToFill: 18 | return kf.resize(to: size, for: .aspectFill) 19 | default: 20 | return kf.resize(to: size) 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProject/Utilities/UtilitiesTests/ExtensionsTests/UITextField+ExtensionsTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+ExtensionsTests.swift 3 | // UtilitiesTests 4 | // 5 | // Created by Mehmet Salih Aslan on 29.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Utilities 11 | 12 | class UITextFieldExtensionsTests: XCTestCase { 13 | 14 | func testTrimmedText() { 15 | let textField = UITextField() 16 | textField.text = " Salih " 17 | XCTAssertEqual("Salih", textField.trimmedText) 18 | 19 | textField.text = "\n\n Salih " + "Aslan\n\n" 20 | 21 | XCTAssertEqual("Salih Aslan", textField.trimmedText) 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/Base/BaseSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 15.09.2022. 6 | // 7 | 8 | import Combine 9 | import Network 10 | 11 | class BaseSceneModel: ObservableObject { 12 | 13 | @Published var showLoading = false 14 | @Published var showFullScreenLoading = false 15 | @Published var showTryAgainButton = false 16 | 17 | // @EnvironmentObject private var router: Router 18 | private var dataProvider: DataProviderProtocol 19 | 20 | init(dataProvider: DataProviderProtocol) { 21 | self.dataProvider = dataProvider 22 | } 23 | 24 | func tryAgainButtonAction() {} 25 | 26 | } 27 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/Scene/Splash/SplashSceneModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SplashSceneModel.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 15.09.2022. 6 | // 7 | 8 | import MobilliumUserDefaults 9 | 10 | class SplashSceneModel: BaseSceneModel { 11 | func checkState() { 12 | if DefaultsKey.isFirstStart.has { 13 | let viewModel = MainTabSceneModel(dataProvider: apiDataProvider) 14 | RootSceneModel.shared.state = .mainTab(viewModel: viewModel) 15 | } else { 16 | let viewModel = OnboardingSceneModel(dataProvider: apiDataProvider) 17 | RootSceneModel.shared.state = .onboarding(viewModel: viewModel) 18 | } 19 | 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/Default/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___VARIABLE_moduleName___: UIView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___Protocol? 8 | 9 | override init(frame: CGRect) { 10 | super.init(frame: frame) 11 | configureContents() 12 | } 13 | 14 | required init?(coder aDecoder: NSCoder) { 15 | super.init(coder: aDecoder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | func set(viewModel: ___VARIABLE_moduleName___Protocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Auth/LoginRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct LoginRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = Auth 14 | 15 | public var path: String = "auth/login" 16 | public var method: RequestMethod = .post 17 | public var bodyParameters: RequestParameters = [:] 18 | 19 | public init(username: String, password: String) { 20 | bodyParameters["username"] = username 21 | bodyParameters["password"] = password 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Comment/DeleteRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeleteRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct DeleteRecipeCommentRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = SuccessResponse 14 | 15 | public var path: String = "recipe/{recipeId}/comment/{commentId}" 16 | public var method: RequestMethod = .delete 17 | 18 | public init(recipeId: Int, commentId: Int) { 19 | self.path = "recipe/\(recipeId)/comment/\(commentId)" 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Auth/RegisterRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegisterRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct RegisterRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = Auth 12 | 13 | public var path: String = "auth/register" 14 | public var method: RequestMethod = .post 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(username: String, email: String, password: String) { 18 | parameters["username"] = username 19 | parameters["email"] = email 20 | parameters["password"] = password 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/GetCategoriesWithRecipesRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetCategoriesWithRecipesRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct GetCategoriesWithRecipesRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = BaseResponse<[MainCategory]> 14 | 15 | public var path: String = "category-recipes" 16 | public var method: RequestMethod = .get 17 | public var queryParameters: RequestParameters = [:] 18 | 19 | public init(page: Int) { 20 | queryParameters["page"] = page 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CustomView+Model.xctemplate/Public/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | public class ___VARIABLE_moduleName___: UIView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___Protocol? 8 | 9 | override init(frame: CGRect) { 10 | super.init(frame: frame) 11 | configureContents() 12 | } 13 | 14 | required init?(coder aDecoder: NSCoder) { 15 | super.init(coder: aDecoder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | public func set(viewModel: ___VARIABLE_moduleName___Protocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/UIComponents.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIComponents.h 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import 13 | 14 | //! Project version number for UIComponents. 15 | FOUNDATION_EXPORT double UIComponentsVersionNumber; 16 | 17 | //! Project version string for UIComponents. 18 | FOUNDATION_EXPORT const unsigned char UIComponentsVersionString[]; 19 | 20 | // In this header, you should import all the public headers of your framework using statements like #import 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/RecipeComments/PostRecipeCommentRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 171, 3 | "text": "text text text", 4 | "difference": "1 saniye önce", 5 | "user": { 6 | "id": 2, 7 | "username": "aslanmsalih", 8 | "name": null, 9 | "surname": null, 10 | "definition": null, 11 | "is_trusted": 0, 12 | "facebook_url": null, 13 | "twitter_url": null, 14 | "instagram_url": null, 15 | "youtube_url": null, 16 | "language": "tr", 17 | "is_top_user_choice": false, 18 | "followed_count": 1, 19 | "following_count": 2, 20 | "recipe_count": 3, 21 | "is_following": false, 22 | "favorites_count": 0, 23 | "likes_count": 0, 24 | "cover": null, 25 | "image": null 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Toast/ToastPresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ToastPresenter.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 24.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import SwiftEntryKit 10 | 11 | public class ToastPresenter { 12 | 13 | public static func showWarningToast(text: String) { 14 | var attributes = EKAttributes.topToast 15 | attributes.entryBackground = .color(color: EKColor(light: .appRed, dark: .appRed)) 16 | attributes.entranceAnimation = .translation 17 | attributes.exitAnimation = .translation 18 | 19 | let customView = TostWarningView(text: text) 20 | SwiftEntryKit.display(entry: customView, using: attributes) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/UIActivityIndicatorView/ActivityIndicatorView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityIndicatorView.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class ActivityIndicatorView: UIActivityIndicatorView { 12 | 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | commonInit() 16 | } 17 | 18 | required init(coder: NSCoder) { 19 | super.init(coder: coder) 20 | commonInit() 21 | } 22 | 23 | private func commonInit() { 24 | style = .gray 25 | tintColor = .appCinder 26 | hidesWhenStopped = true 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/Comment/PostRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct PostRecipeCommentRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = RecipeComment 12 | 13 | public var path: String = "recipe/{recipeId}/comment" 14 | public var method: RequestMethod = .post 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(recipeId: Int, commentText: String) { 18 | self.path = "recipe/\(recipeId)/comment" 19 | self.parameters["text"] = commentText 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/Comment/GetRecipeCommentsRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecipeCommentsRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct GetRecipeCommentsRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = BaseResponse<[RecipeComment]> 12 | 13 | public var path: String = "recipe/{recipeId}/comment" 14 | public var method: RequestMethod = .get 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(recipeId: Int, page: Int? = 1) { 18 | self.path = "recipe/\(recipeId)/comment" 19 | self.parameters["page"] = page 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Loading/LoadingProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingProtocol.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol LoadingProtocol { 12 | func presentLoading() 13 | func dismissLoading() 14 | } 15 | 16 | public extension LoadingProtocol where Self: UIViewController { 17 | 18 | func presentLoading() { 19 | let window = UIApplication.shared.windows.first 20 | window?.startBlockingActivityIndicator() 21 | } 22 | 23 | func dismissLoading() { 24 | let window = UIApplication.shared.windows.first 25 | window?.stopBlockingActivityIndicator() 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI Scene.xctemplate/WithBaseView/___FILEBASENAME___Scene.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import Combine 4 | import SwiftUI 5 | 6 | struct ___VARIABLE_moduleName___Scene: View { 7 | 8 | @ObservedObject var viewModel: ViewModel 9 | 10 | var body: some View { 11 | BaseScene(content: { 12 | Text("___VARIABLE_moduleName___") 13 | }, viewModel: viewModel) 14 | } 15 | } 16 | 17 | struct ___VARIABLE_moduleName___Scene_Previews: PreviewProvider { 18 | static var previews: some View { 19 | let viewModel = ___VARIABLE_moduleName___SceneModel() 20 | return ___VARIABLE_moduleName___Scene(viewModel: viewModel) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Sources/Network/Core/RequestMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestMethod.swift 3 | // Network 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public enum RequestMethod: String { 10 | /// `CONNECT` method. 11 | case connect = "CONNECT" 12 | /// `DELETE` method. 13 | case delete = "DELETE" 14 | /// `GET` method. 15 | case get = "GET" 16 | /// `HEAD` method. 17 | case head = "HEAD" 18 | /// `OPTIONS` method. 19 | case options = "OPTIONS" 20 | /// `PATCH` method. 21 | case patch = "PATCH" 22 | /// `POST` method. 23 | case post = "POST" 24 | /// `PUT` method. 25 | case put = "PUT" 26 | /// `TRACE` method. 27 | case trace = "TRACE" 28 | } 29 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/Default/___FILEBASENAME___Cell.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___VARIABLE_moduleName___Cell: UICollectionViewCell, ReusableView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___CellProtocol? 8 | 9 | override init(frame: CGRect) { 10 | super.init(frame: frame) 11 | configureContents() 12 | } 13 | 14 | required init?(coder aDecoder: NSCoder) { 15 | super.init(coder: aDecoder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | func set(viewModel: ___VARIABLE_moduleName___CellProtocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/HorizontalRecipesView/HorizontalRecipesViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HorizontalRecipesViewModel.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 19.01.2023. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | 11 | public protocol HorizontalRecipesViewProtocol: Identifiable { 12 | var id: UUID { get } 13 | var viewModels: [RecipeViewModel] { get } 14 | } 15 | 16 | public class HorizontalRecipesViewModel: ObservableObject, HorizontalRecipesViewProtocol { 17 | 18 | public var id = UUID() 19 | @Published public var viewModels: [RecipeViewModel] = [] 20 | 21 | public init(id: UUID = UUID(), viewModels: [RecipeViewModel]) { 22 | self.id = id 23 | self.viewModels = viewModels 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/CollectionViewCell.xctemplate/Public/___FILEBASENAME___Cell.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | public class ___VARIABLE_moduleName___Cell: UICollectionViewCell, ReusableView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___CellProtocol? 8 | 9 | override init(frame: CGRect) { 10 | super.init(frame: frame) 11 | configureContents() 12 | } 13 | 14 | required init?(coder aDecoder: NSCoder) { 15 | super.init(coder: aDecoder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | public func set(viewModel: ___VARIABLE_moduleName___CellProtocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Push Route.xctemplate/___FILEBASENAME___Route.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | protocol ___VARIABLE_moduleName___Route { 4 | func push___VARIABLE_moduleName___() 5 | } 6 | 7 | extension ___VARIABLE_moduleName___Route where Self: RouterProtocol { 8 | 9 | func push___VARIABLE_moduleName___() { 10 | let router = ___VARIABLE_moduleName___Router() 11 | let viewModel = ___VARIABLE_moduleName___ViewModel(router: router) 12 | let viewController = ___VARIABLE_moduleName___ViewController(viewModel: viewModel) 13 | 14 | let transition = PushTransition() 15 | router.viewController = viewController 16 | router.openTransition = transition 17 | 18 | open(viewController, transition: transition) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/Recipe/Comment/EditRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct EditRecipeCommentRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = SuccessResponse 12 | 13 | public var path: String = "recipe/{recipeId}/comment/{commentId}" 14 | public var method: RequestMethod = .put 15 | public var parameters: RequestParameters = [:] 16 | 17 | public init(recipeId: Int, commentId: Int, commentText: String) { 18 | self.path = "recipe/\(recipeId)/comment/\(commentId)" 19 | self.parameters["text"] = commentText 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Helper/SKPhotoBrowserKingfisherCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SKPhotoBrowserKingfisherCache.swift 3 | // SampleProject 4 | // 5 | // Created by Alperen Ünal on 23.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import SKPhotoBrowser 10 | import Kingfisher 11 | 12 | class SKPhotoBrowserKingfisherCache: SKImageCacheable { 13 | 14 | let cache = ImageCache.default 15 | 16 | func imageForKey(_ key: String) -> UIImage? { 17 | cache.retrieveImageInMemoryCache(forKey: key) 18 | } 19 | 20 | func setImage(_ image: UIImage, forKey key: String) { 21 | cache.store(image, forKey: key) 22 | } 23 | 24 | func removeImageForKey(_ key: String) { 25 | cache.removeImage(forKey: key) 26 | } 27 | 28 | func removeAllImages() {} 29 | 30 | } 31 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Auth/Register/RegisterRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegisterRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Alihan Aktay on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | protocol RegisterRoute { 10 | func pushRegister() 11 | } 12 | 13 | extension RegisterRoute where Self: RouterProtocol { 14 | 15 | func pushRegister() { 16 | let router = RegisterRouter() 17 | let viewModel = RegisterViewModel(router: router) 18 | let viewController = RegisterViewController(viewModel: viewModel) 19 | let transition = PushTransition() 20 | 21 | router.viewController = viewController 22 | router.openTransition = transition 23 | 24 | open(viewController, transition: transition) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/MVVM-R Modal Route.xctemplate/___FILEBASENAME___Route.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | protocol ___VARIABLE_moduleName___Route { 4 | func present___VARIABLE_moduleName___() 5 | } 6 | 7 | extension ___VARIABLE_moduleName___Route where Self: RouterProtocol { 8 | 9 | func present___VARIABLE_moduleName___() { 10 | let router = ___VARIABLE_moduleName___Router() 11 | let viewModel = ___VARIABLE_moduleName___ViewModel(router: router) 12 | let viewController = ___VARIABLE_moduleName___ViewController(viewModel: viewModel) 13 | 14 | let transition = ModalTransition() 15 | router.viewController = viewController 16 | router.openTransition = transition 17 | 18 | open(viewController, transition: transition) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Auth/RegisterRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegisterRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct RegisterRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = Auth 14 | 15 | public var path: String = "auth/register" 16 | public var method: RequestMethod = .post 17 | public var bodyParameters: RequestParameters = [:] 18 | 19 | public init(username: String, email: String, password: String) { 20 | bodyParameters["username"] = username 21 | bodyParameters["email"] = email 22 | bodyParameters["password"] = password 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Comment/AddRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AddRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct AddRecipeCommentRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = RecipeComment 14 | 15 | public var path: String = "recipe/{recipeId}/comment" 16 | public var method: RequestMethod = .post 17 | public var bodyParameters: RequestParameters = [:] 18 | 19 | public init(recipeId: Int, commentText: String) { 20 | self.path = "recipe/\(recipeId)/comment" 21 | self.bodyParameters["text"] = commentText 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/Default/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import SwiftUI 4 | 5 | public struct ___VARIABLE_moduleName___View: View { 6 | 7 | var viewModel: any ___VARIABLE_moduleName___ViewProtocol 8 | 9 | public var body: some View { 10 | Text("___VARIABLE_moduleName___") 11 | } 12 | 13 | public init(viewModel: any ___VARIABLE_moduleName___ViewProtocol) { 14 | self.viewModel = viewModel 15 | } 16 | } 17 | 18 | struct ___VARIABLE_moduleName___View_Previews: PreviewProvider { 19 | static var previews: some View { 20 | let viewModel = ___VARIABLE_moduleName___ViewModel() 21 | let view = ___VARIABLE_moduleName___View(viewModel: viewModel) 22 | return view 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/User/UserViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserViewModel.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 24.11.2022. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | 11 | public protocol UserViewProtocol: Identifiable { 12 | var id: UUID { get } 13 | var imageUrl: String { get } 14 | var username: String { get } 15 | var stat: String { get } 16 | } 17 | 18 | public struct UserViewModel: UserViewProtocol { 19 | public var id = UUID() 20 | public var imageUrl: String 21 | public var username: String 22 | public var stat: String 23 | 24 | public init(imageUrl: String, username: String, stat: String) { 25 | self.imageUrl = imageUrl 26 | self.username = username 27 | self.stat = stat 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Xcode Templates/Source/SwiftUI Templates/SwiftUI View.xctemplate/Identifiable/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import SwiftUI 4 | 5 | public struct ___VARIABLE_moduleName___View: View { 6 | 7 | var viewModel: any ___VARIABLE_moduleName___ViewProtocol 8 | 9 | public var body: some View { 10 | Text("___VARIABLE_moduleName___") 11 | } 12 | 13 | public init(viewModel: any ___VARIABLE_moduleName___ViewProtocol) { 14 | self.viewModel = viewModel 15 | } 16 | } 17 | 18 | struct ___VARIABLE_moduleName___View_Previews: PreviewProvider { 19 | static var previews: some View { 20 | let viewModel = ___VARIABLE_moduleName___ViewModel() 21 | let view = ___VARIABLE_moduleName___View(viewModel: viewModel) 22 | return view 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/SampleProjectSwiftUI/UIComponents/RecipeViewModel+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeViewModel+Extensions.swift 3 | // SampleProjectSwiftUI 4 | // 5 | // Created by Mehmet Salih Aslan on 8.12.2022. 6 | // 7 | 8 | import DataProvider 9 | import Foundation 10 | import Components 11 | 12 | extension RecipeViewModel { 13 | init(recipe: Recipe) { 14 | let userViewModel = UserViewModel(recipe: recipe) 15 | self.init(userViewModel: userViewModel, 16 | name: recipe.title ?? "", 17 | category: recipe.category.name ?? "", 18 | imageUrl: recipe.images.first?.url ?? "", 19 | stat: L10n.Modules.Home.recipeCommnetAndLikeCount(recipe.commentCount, recipe.likeCount), 20 | isEditorChoice: recipe.isEditorChoice) 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /SampleProject/SampleProjectTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProject/SampleProjectUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Comment/GetRecipeCommentsRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetRecipeCommentsRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct GetRecipeCommentsRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = BaseResponse<[RecipeComment]> 14 | 15 | public var path: String = "recipe/{recipeId}/comment" 16 | public var method: RequestMethod = .get 17 | public var queryParameters: RequestParameters = [:] 18 | 19 | public init(recipeId: Int, page: Int? = 1) { 20 | self.path = "recipe/\(recipeId)/comment" 21 | self.queryParameters["page"] = page 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProject/Utilities/UtilitiesTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/AppDelegate/AppDelegate+IQKeyboardManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate+IQKeyboardManager.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 2.06.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import IQKeyboardManagerSwift 10 | 11 | extension AppDelegate { 12 | 13 | func configureIQKeyboardManager() { 14 | IQKeyboardManager.shared.enable = true 15 | IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(CommentListViewController.self) 16 | IQKeyboardManager.shared.disabledToolbarClasses.append(CommentListViewController.self) 17 | IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(CommentEditViewController.self) 18 | IQKeyboardManager.shared.disabledToolbarClasses.append(CommentEditViewController.self) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponentsTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/Default/___FILEBASENAME___Cell.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___VARIABLE_moduleName___Cell: UITableViewCell, ReusableView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___CellProtocol? 8 | 9 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 10 | super.init(style: style, reuseIdentifier: reuseIdentifier) 11 | configureContents() 12 | } 13 | 14 | required init?(coder: NSCoder) { 15 | super.init(coder: coder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | func set(viewModel: ___VARIABLE_moduleName___CellProtocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Model/Recipe.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Recipe.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Recipe: Decodable { 10 | public let id: Int 11 | public let title: String? 12 | public let isEditorChoice: Bool 13 | public let likeCount: Int 14 | public let commentCount: Int 15 | public let user: User 16 | public let category: CategoryDetail 17 | public let images: [Image] 18 | 19 | enum CodingKeys: String, CodingKey { 20 | case id 21 | case title 22 | case isEditorChoice = "is_editor_choice" 23 | case likeCount = "like_count" 24 | case commentCount = "comment_count" 25 | case user 26 | case category 27 | case images 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Templates/Source/Mobillium Templates/TableViewCell.xctemplate/Public/___FILEBASENAME___Cell.swift: -------------------------------------------------------------------------------- 1 | //___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | public class ___VARIABLE_moduleName___Cell: UITableViewCell, ReusableView { 6 | 7 | weak var viewModel: ___VARIABLE_moduleName___CellProtocol? 8 | 9 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 10 | super.init(style: style, reuseIdentifier: reuseIdentifier) 11 | configureContents() 12 | } 13 | 14 | required init?(coder: NSCoder) { 15 | super.init(coder: coder) 16 | configureContents() 17 | } 18 | 19 | private func configureContents() { 20 | 21 | } 22 | 23 | public func set(viewModel: ___VARIABLE_moduleName___CellProtocol) { 24 | self.viewModel = viewModel 25 | 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Onboarding/OnboardingViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OnboardingViewModel.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 22.09.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public protocol OnboardingViewProtocol: Identifiable { 11 | var id: UUID { get } 12 | var imageName: String { get } 13 | var title: String { get } 14 | var description: String { get } 15 | } 16 | 17 | public struct OnboardingViewModel: OnboardingViewProtocol { 18 | public var id = UUID() 19 | public let imageName: String 20 | public let title: String 21 | public let description: String 22 | 23 | public init(imageName: String, title: String, description: String) { 24 | self.imageName = imageName 25 | self.title = title 26 | self.description = description 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Requests/Recipe/Comment/EditRecipeCommentRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EditRecipeCommentRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import Network 10 | 11 | public struct EditRecipeCommentRequest: APIDecodableResponseRequest { 12 | 13 | public typealias ResponseType = SuccessResponse 14 | 15 | public var path: String = "recipe/{recipeId}/comment/{commentId}" 16 | public var method: RequestMethod = .put 17 | public var bodyParameters: RequestParameters = [:] 18 | 19 | public init(recipeId: Int, commentId: Int, commentText: String) { 20 | self.path = "recipe/\(recipeId)/comment/\(commentId)" 21 | self.bodyParameters["text"] = commentText 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Auth/PasswordReset/PasswordResetRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PasswordResetRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 31.05.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | protocol PasswordResetRoute { 10 | func pushPasswordReset() 11 | } 12 | 13 | extension PasswordResetRoute where Self: RouterProtocol { 14 | 15 | func pushPasswordReset() { 16 | let router = PasswordResetRouter() 17 | let viewModel = PasswordResetViewModel(router: router) 18 | let viewController = PasswordResetViewController(viewModel: viewModel) 19 | 20 | let transition = PushTransition() 21 | router.viewController = viewController 22 | router.openTransition = transition 23 | 24 | open(viewController, transition: transition) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/WalkThrough/WalkThroughRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WalkThroughRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Murat Celebi on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | protocol WalkThroughRoute { 10 | func placeOnWindowWalkThrough() 11 | } 12 | 13 | extension WalkThroughRoute where Self: RouterProtocol { 14 | 15 | func placeOnWindowWalkThrough() { 16 | let router = WalkThroughRouter() 17 | let viewModel = WalkThroughViewModel(router: router) 18 | let viewController = WalkThroughViewController(viewModel: viewModel) 19 | 20 | let transition = PlaceOnWindowTransition() 21 | router.viewController = viewController 22 | router.openTransition = transition 23 | 24 | open(viewController, transition: transition) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Routing/Transitions/PlaceOnWindowTransition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaceOnWindowTransition.swift 3 | // Routing 4 | // 5 | // Created by Mehmet Salih Aslan on 4.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class PlaceOnWindowTransition: Transition { 12 | 13 | var viewController: UIViewController? 14 | 15 | func open(_ viewController: UIViewController) { 16 | guard let window = UIApplication.shared.windows.first else { return } 17 | UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: { 18 | UIView.performWithoutAnimation { 19 | window.rootViewController = viewController 20 | } 21 | }, completion: nil) 22 | } 23 | 24 | func close(_ viewController: UIViewController) {} 25 | 26 | } 27 | -------------------------------------------------------------------------------- /SampleProject/Utilities/Utilities/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/DataProvider/Sources/DataProvider/Model/Recipe.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Recipe.swift 3 | // DataProvider 4 | // 5 | // Created by Murat Celebi on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct Recipe: Decodable { 10 | public let id: Int 11 | public let title: String? 12 | public let isEditorChoice: Bool 13 | public let likeCount: Int 14 | public let commentCount: Int 15 | public let user: User 16 | public let category: CategoryDetail 17 | public let images: [Image] 18 | 19 | enum CodingKeys: String, CodingKey { 20 | case id 21 | case title 22 | case isEditorChoice = "is_editor_choice" 23 | case likeCount = "like_count" 24 | case commentCount = "comment_count" 25 | case user 26 | case category 27 | case images 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Loading/ActivityIndicatorFooterView/ActivityIndicatorFooterView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityIndicatorFooterView.swift 3 | // UIComponents 4 | // 5 | // Created by Muart Celebi on 02.06.2021. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class ActivityIndicatorFooterView: UICollectionReusableView, ReusableView { 12 | 13 | public let activityIndicator = ActivityIndicatorView(frame: .infinite) 14 | 15 | override init(frame: CGRect) { 16 | super.init(frame: frame) 17 | setupConstraints() 18 | } 19 | 20 | required init?(coder: NSCoder) { 21 | super.init(coder: coder) 22 | setupConstraints() 23 | } 24 | 25 | private func setupConstraints() { 26 | addSubview(activityIndicator) 27 | activityIndicator.centerInSuperview() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/DataProvider/APIRequestInterceptor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApiRequestInterceptor.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 15.11.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Alamofire 10 | import KeychainSwift 11 | 12 | public class APIRequestInterceptor: RequestInterceptor { 13 | 14 | public static let shared = APIRequestInterceptor() 15 | 16 | public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { 17 | var urlRequest = urlRequest 18 | let accessToken = KeychainSwift().get(Keychain.token) 19 | 20 | if let accessToken = accessToken { 21 | urlRequest.headers.add(name: "X-Fodamy-Token", value: accessToken) 22 | } 23 | 24 | completion(.success(urlRequest)) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/Loading/FullScreenLoadingView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FullScreenLoadingView.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 15.09.2022. 6 | // 7 | 8 | import SwiftUI 9 | 10 | public struct FullScreenLoadingView: View { 11 | 12 | public init() { 13 | UIView.setAnimationsEnabled(false) 14 | } 15 | 16 | public var body: some View { 17 | ZStack { 18 | Color.black.opacity(0.5).ignoresSafeArea(.all) 19 | ProgressView() 20 | .progressViewStyle(CircularProgressViewStyle(tint: Color.white)) 21 | } 22 | .onDisappear { 23 | UIView.setAnimationsEnabled(true) 24 | } 25 | } 26 | } 27 | 28 | struct FullScreenLoadingView_Previews: PreviewProvider { 29 | static var previews: some View { 30 | FullScreenLoadingView() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/Auth/LoginRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "test", 3 | "user": { 4 | "id": 2, 5 | "email": "aslanmsalih@gmail.com", 6 | "username": "aslanmsalih", 7 | "name": "Salih", 8 | "surname": "Aslan", 9 | "definition": null, 10 | "phone": null, 11 | "tckn": null, 12 | "gender": null, 13 | "birthday": null, 14 | "is_banned": 0, 15 | "is_trusted": 0, 16 | "facebook_url": null, 17 | "twitter_url": null, 18 | "instagram_url": null, 19 | "youtube_url": null, 20 | "language": "tr", 21 | "is_top_user_choice": false, 22 | "followed_count": 1, 23 | "following_count": 2, 24 | "recipe_count": 3, 25 | "is_following": false, 26 | "favorites_count": 0, 27 | "likes_count": 0, 28 | "cover": null, 29 | "image": null, 30 | "top_user": null, 31 | "cover_image": null 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/RecipeDetail/RecipeDetailRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 8.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol RecipeDetailRoute { 12 | func pushRecipeDetail(recipeId: Int) 13 | } 14 | 15 | extension RecipeDetailRoute where Self: RouterProtocol { 16 | func pushRecipeDetail(recipeId: Int) { 17 | let router = RecipeDetailRouter() 18 | let viewModel = RecipeDetailViewModel(recipeId: recipeId, router: router) 19 | let viewController = RecipeDetailViewController(viewModel: viewModel) 20 | 21 | let transition = PushTransition() 22 | router.openTransition = transition 23 | router.viewController = viewController 24 | open(viewController, transition: transition) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProviderTests/MockData/JsonFiles/Auth/RegisterRequest.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "test", 3 | "user": { 4 | "id": 2, 5 | "email": "aslanmsalih@gmail.com", 6 | "username": "aslanmsalih", 7 | "name": "Salih", 8 | "surname": "Aslan", 9 | "definition": null, 10 | "phone": null, 11 | "tckn": null, 12 | "gender": null, 13 | "birthday": null, 14 | "is_banned": 0, 15 | "is_trusted": 0, 16 | "facebook_url": null, 17 | "twitter_url": null, 18 | "instagram_url": null, 19 | "youtube_url": null, 20 | "language": "tr", 21 | "is_top_user_choice": false, 22 | "followed_count": 0, 23 | "following_count": 0, 24 | "recipe_count": 0, 25 | "is_following": false, 26 | "favorites_count": 0, 27 | "likes_count": 0, 28 | "cover": null, 29 | "image": null, 30 | "top_user": null, 31 | "cover_image": null 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Components/Sources/Components/HorizontalRecipesHeaderView/HorizontalRecipesHeaderViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HorizontalRecipesHeaderViewModel.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 19.01.2023. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | 11 | public protocol HorizontalRecipesHeaderViewProtocol: Identifiable { 12 | var id: UUID { get } 13 | var categoryImageUrl: String { get } 14 | var title: String? { get } 15 | } 16 | 17 | public struct HorizontalRecipesHeaderViewModel: HorizontalRecipesHeaderViewProtocol { 18 | public var id = UUID() 19 | public var categoryImageUrl: String 20 | public var title: String? 21 | 22 | public init(id: UUID = UUID(), categoryImageUrl: String, title: String? = nil) { 23 | self.id = id 24 | self.categoryImageUrl = categoryImageUrl 25 | self.title = title 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /SampleProject/DataProvider/DataProvider/Requests/User/UserFollowRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserFollowRequest.swift 3 | // DataProvider 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | public struct UserFollowRequest: APIDecodableResponseRequest { 10 | 11 | public typealias ResponseType = SuccessResponse 12 | 13 | public var path: String = "user/{followedId}/following" 14 | public var method: RequestMethod = .post 15 | 16 | public init(followedId: Int, followType: FollowType) { 17 | self.path = "user/\(followedId)/following" 18 | switch followType { 19 | case .follow: 20 | method = .post 21 | case .unfollow: 22 | method = .delete 23 | } 24 | } 25 | 26 | public enum FollowType { 27 | case follow 28 | case unfollow 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SampleProject 4 | // 5 | // Created by Mehmet Salih Aslan on 3.11.2020. 6 | // Copyright © 2020 Mobillium. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import IQKeyboardManagerSwift 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | configureIQKeyboardManager() 20 | configureSKPhotoBrowser() 21 | let bounds = UIScreen.main.bounds 22 | self.window = UIWindow(frame: bounds) 23 | self.window?.makeKeyAndVisible() 24 | AppRouter.shared.startApp() 25 | return true 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/UIPageControl/PageControl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PageControl.swift 3 | // UIComponents 4 | // 5 | // Created by Mehmet Salih Aslan on 25.03.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class PageControl: UIPageControl { 12 | 13 | override init(frame: CGRect) { 14 | super.init(frame: frame) 15 | configureContents() 16 | } 17 | 18 | // swiftlint:disable fatal_error unavailable_function 19 | required init?(coder: NSCoder) { 20 | fatalError("init(coder:) has not been implemented") 21 | } 22 | // swiftlint:enable fatal_error unavailable_function 23 | 24 | private func configureContents() { 25 | tintColor = .appRed 26 | pageIndicatorTintColor = UIColor.appRed.withAlphaComponent(0.3) 27 | currentPageIndicatorTintColor = .appRed 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /SampleProject/SampleProject/Scenes/Recipes/RecipesRoute.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipesRoute.swift 3 | // SampleProject 4 | // 5 | // Created by Burak Kaya on 15.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | protocol RecipesRoute { 10 | func pushRecipes(categoryId: Int, title: String) 11 | } 12 | 13 | extension RecipesRoute where Self: RouterProtocol { 14 | 15 | func pushRecipes(categoryId: Int, title: String) { 16 | let router = RecipesRouter() 17 | let viewModel = RecipesViewModel(recipesListingType: .categoryRecipes(categoryId: categoryId), router: router) 18 | viewModel.title = title 19 | let viewController = RecipesViewController(viewModel: viewModel) 20 | 21 | let transition = PushTransition() 22 | router.openTransition = transition 23 | router.viewController = viewController 24 | open(viewController, transition: transition) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /SampleProject/UIComponents/UIComponents/Cell/RecipeHeaderCell/RecipeHeaderCellModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeHeaderCellModel.swift 3 | // UIComponents 4 | // 5 | // Created by Emirhan Battalbaş on 1.04.2021. 6 | // Copyright © 2021 Mobillium. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public protocol RecipeHeaderCellDataSource { 12 | var imageUrl: String { get } 13 | var isEditorChoice: Bool { get } 14 | } 15 | 16 | public protocol RecipeHeaderCellEventSource { 17 | 18 | } 19 | 20 | public protocol RecipeHeaderCellProtocol: RecipeHeaderCellDataSource, RecipeHeaderCellEventSource { 21 | 22 | } 23 | 24 | public final class RecipeHeaderCellModel: RecipeHeaderCellProtocol { 25 | public var imageUrl: String 26 | public var isEditorChoice: Bool 27 | 28 | public init(imageUrl: String, isEditorChoice: Bool) { 29 | self.imageUrl = imageUrl 30 | self.isEditorChoice = isEditorChoice 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /SampleProjectSwiftUI/Core/Network/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.9 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Network", 8 | platforms: [ 9 | .iOS(.v16) 10 | ], 11 | products: [ 12 | // Products define the executables and libraries a package produces, making them visible to other packages. 13 | .library( 14 | name: "Network", 15 | targets: ["Network"]), 16 | ], 17 | targets: [ 18 | // Targets are the basic building blocks of a package, defining a module or a test suite. 19 | // Targets can depend on other targets in this package and products from dependencies. 20 | .target( 21 | name: "Network"), 22 | .testTarget( 23 | name: "NetworkTests", 24 | dependencies: ["Network"]), 25 | ] 26 | ) 27 | --------------------------------------------------------------------------------