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