diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..acdd86e9 Binary files /dev/null and b/.DS_Store differ diff --git a/README.md b/README.md index ac05bb02..9ee7e4cb 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ Para tener un estándar y un layout minimamente definido adjuntamos algunos asse Piensa en el desafío como una oportunidad de mostrar todo tu conocimiento. **¡Hazlo con calma!** porque tienes una semana para entregar. - Dentro de los elementos que vamos a evaluar se encuentra: - Consumo de APIs @@ -36,7 +35,7 @@ Los únicos requisitos previos para este desafío es que el código se haga en S - Crear o estructurar tus vistas con Storyboards, Xibs o ViewCode. - Adoptar la arquitectura que más te acomode y utilizar los patrones de diseño que desees. -Estamos especialmente preocupados por la calidad. Creemos que los patrones de diseño, pruebas automatizadas y la integración contínua son aspectos importantes. Sin embargo, sabemos que éstos no son tópicos dominados por todos y debido a eso hemos estructurado el desafío en varios niveles, los cuales van incrementando en dificultad. Esto implica que un postulante *Senior* debería ser capaz de completar más niveles. +Estamos especialmente preocupados por la calidad. Creemos que los patrones de diseño, pruebas automatizadas y la integración contínua son aspectos importantes. Sin embargo, sabemos que éstos no son tópicos dominados por todos y debido a eso hemos estructurado el desafío en varios niveles, los cuales van incrementando en dificultad. Esto implica que un postulante _Senior_ debería ser capaz de completar más niveles. # Proceso de desarrollo y envío @@ -45,7 +44,7 @@ Estamos especialmente preocupados por la calidad. Creemos que los patrones de di 3. Al momento de hacer commit, sube los cambios a tu fork. 4. Por la interfaz de GitHub, haz un pull request a este repositorio. 5. En el pull request copia y pega la sección **Requerimientos** de este archivo y actualiza las cosas que hayas podido completar. - - Si pudiste completar algún aspecto específico de alguna de las partes, por ejemplo, de la parte 5, pero no terminaste todo lo que se pedía, no hay problema en marcarlo. + - Si pudiste completar algún aspecto específico de alguna de las partes, por ejemplo, de la parte 5, pero no terminaste todo lo que se pedía, no hay problema en marcarlo. Si tienes alguna consulta, no dudes en preguntarnos :) @@ -54,43 +53,88 @@ Si tienes alguna consulta, no dudes en preguntarnos :) ## Información del postulante ### Nombre -_(Tu nombre va aquí)_ + +Orlando Velasco ### Comentarios -_(Cualquier consideración que quieras mencionar, déjala acá)_ +(El desarrollo fue realizado durante el sabado y domingo, dias previos solo definiciones de proyecto. Para analisis de trazabilidad consultar https://github.com/orvenuevo1/ios-recruiting-hsa/tree/main) + +El proyecto de aplicación iOS desarrollado en SwiftUI que se centra en la visualización y gestión de películas. A continuación, se presenta una descripción general de su estructura y componentes principales: + +Modelos: + +- Genre.swift: Define el modelo para los géneros de películas. +- GenreResponse.swift: Modelo para la respuesta de la API de géneros. +- Movie.swift: Define el modelo principal para las películas. +- MoviesResponse.swift: Modelo para la respuesta de la API de películas. + +Vistas: + +- ContentView.swift: Vista principal de la aplicación. +- MovieView.swift: Vista que muestra la lista de películas. +- MovieDetailView.swift: Vista detallada de una película específica. +- FavoriteMoviesView.swift: Vista que muestra las películas favoritas del usuario. +- SearchBarView.swift: Componente de barra de búsqueda. +- MovieCardView.swift: Componente de tarjeta para representar una película en la lista. +- FavoriteCardMovieView.swift: Componente de tarjeta para representar una película favorita. + +Componentes: + +- ImageView.swift: Componente para la carga y visualización de imágenes desde una URL. + +Gestión de Datos: + +- MovieViewModel.swift: ViewModel asociado con MovieView. +- FavoriteMovieManager.swift: Gestor para las operaciones relacionadas con las películas favoritas. +- CoreDataManager.swift: Gestor para las operaciones de la base de datos Core Data. +- GenreManager.swift: Gestor para las operaciones relacionadas con los géneros de películas. +- KeychainManager.swift: Gestor para las operaciones relacionadas con Keychain. +- UserDefaultsManager.swift: Gestor para las operaciones relacionadas con UserDefaults. + +Servicios: + +- APIManager.swift: Gestor de API para realizar solicitudes a la API de películas. +- Constants.swift: Contiene constantes utilizadas en toda la aplicación. + +Workers: + +- MoviesWorker.swift: Worker asociado con la funcionalidad de películas. +- GenreWorker.swift: Worker asociado con la funcionalidad de géneros. ## Parte 1 + - [ ] Pantalla de Splash -- [ ] Pantalla con una grilla de películas populares. Para ello debes usar esta [API](https://developers.themoviedb.org/3/movies/get-popular-movies) +- [x] Pantalla con una grilla de películas populares. Para ello debes usar esta [API](https://developers.themoviedb.org/3/movies/get-popular-movies) (Se usó el endpoint de Top Rated) - [ ] Tratamiento de errores y presentación de flujos de excepción: - [ ] Error genérico - [ ] Cargando ## Parte 2 -- [ ] Al hacer clic en una película de la grilla debe dirigirse a la pantalla de detalle de la película. Esta pantalla debe contener: - - [ ] Nombre de la película - - [ ] Año de estreno - - [ ] Sinopsis - - [ ] El nombre del género de la película y no su ID (ej: Action, Horror, etc). Para ello, debes utilizar esta [API](https://developers.themoviedb.org/3/genres/get-movie-list). + +- [x] Al hacer clic en una película de la grilla debe dirigirse a la pantalla de detalle de la película. Esta pantalla debe contener: + - [x] Nombre de la película + - [x] Año de estreno + - [x] Sinopsis + - [x] El nombre del género de la película y no su ID (ej: Action, Horror, etc). Para ello, debes utilizar esta [API](https://developers.themoviedb.org/3/genres/get-movie-list). ## Parte 3 -- [ ] Selección de películas favoritas - - [ ] La acción para poner como favorita una película debe estar en la pantalla creada en el nivel 2. - - [ ] La información sobre las películas favoritas debe ser persistente, es decir, debe guardarse entre sesiones de la aplicación. -- [ ] Lista de películas favoritas: - - [ ] Borrado de películas favoritas desde la lista. -- [ ] Layout en pestañas: - - [ ] En la primera pestaña debes mostrarse la pantalla creada en el nivel 1. - - [ ] En la segunda pestaña debes mostrar la lista de películas favoritas. +- [x] Selección de películas favoritas + - [x] La acción para poner como favorita una película debe estar en la pantalla creada en el nivel 2. + - [x] La información sobre las películas favoritas debe ser persistente, es decir, debe guardarse entre sesiones de la aplicación. +- [x] Lista de películas favoritas: + - [x] Borrado de películas favoritas desde la lista. +- [x] Layout en pestañas: + - [x] En la primera pestaña debes mostrarse la pantalla creada en el nivel 1. + - [x] En la segunda pestaña debes mostrar la lista de películas favoritas. ## Parte 4 -- [ ] Mejoras a la grilla de películas populares: +- [x] Mejoras a la grilla de películas populares: - [ ] Scroll infinito. - - [ ] Mostrar si una película es favorita o no en cada celda de la grilla. - - [ ] Búsqueda local (filtrar por algún término). + - [x] Mostrar si una película es favorita o no en cada celda de la grilla. + - [x] Búsqueda local (filtrar por algún término). - [ ] Pantalla de filtro con selección de fecha de lanzamiento y género: - [ ] Sólo debe ser accesible desde la pantalla de favoritos. - [ ] Al aplicar el filtro, debes volver a la pantalla de favoritos y hacer un filtro local usando la información seleccionada referente a la fecha de lanzamiento y el género. @@ -106,7 +150,6 @@ _(Cualquier consideración que quieras mencionar, déjala acá)_ - [ ] Integración del repositorio con un servicio de integración continua como [Bitrise](https://www.bitrise.io/) o [AppCenter](https://appcenter.ms). No existe problema en usar otra plataforma, pero esta debe estar disponible online (un jenkins local no cuenta). - [ ] Integración de un servicio de análisis de código como [SonarCloud](https://sonarcloud.io/). - # Ejemplos y sugerencias A continuación puedes ver algunas pantallas de ejemplo de algunos flujos. Son sólo sugerencias, pero puedes modificarlas a tu gusto. @@ -122,4 +165,4 @@ Para facilitar el proceso, tienes assets, iconos de aplicación y paleta de colo ## Flujo opcional de filtro -![Image of Yaktocat](assets/flow/filtro.png) \ No newline at end of file +![Image of Yaktocat](assets/flow/filtro.png) diff --git a/movieAppAccen/.DS_Store b/movieAppAccen/.DS_Store new file mode 100644 index 00000000..9e8b26b4 Binary files /dev/null and b/movieAppAccen/.DS_Store differ diff --git a/movieAppAccen/movieAppAccen.xcodeproj/project.pbxproj b/movieAppAccen/movieAppAccen.xcodeproj/project.pbxproj new file mode 100644 index 00000000..86ff4381 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/project.pbxproj @@ -0,0 +1,610 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + AD187F3F2AE32D0D005FBF3A /* UserDefaultsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD187F3E2AE32D0D005FBF3A /* UserDefaultsManager.swift */; }; + AD187F412AE32DD7005FBF3A /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD187F402AE32DD7005FBF3A /* Constants.swift */; }; + AD187F472AE33331005FBF3A /* MoviesWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD187F462AE33331005FBF3A /* MoviesWorker.swift */; }; + AD1DE4592AE545940032557C /* MovieDataModel.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE4572AE545940032557C /* MovieDataModel.xcdatamodeld */; }; + AD1DE45D2AE54DB00032557C /* CoreDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE45C2AE54DB00032557C /* CoreDataManager.swift */; }; + AD1DE4602AE54E000032557C /* FavoriteMovieManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE45F2AE54E000032557C /* FavoriteMovieManager.swift */; }; + AD1DE4622AE5606A0032557C /* FavoriteMoviesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE4612AE5606A0032557C /* FavoriteMoviesView.swift */; }; + AD1DE4652AE560A50032557C /* FavoriteCardMovieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE4642AE560A50032557C /* FavoriteCardMovieView.swift */; }; + AD1DE4672AE562A80032557C /* FavoriteMoviesInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE4662AE562A80032557C /* FavoriteMoviesInteractor.swift */; }; + AD1DE4692AE562C20032557C /* FavoriteMoviesPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE4682AE562C20032557C /* FavoriteMoviesPresenter.swift */; }; + AD1DE46B2AE563400032557C /* FavoriteMoviesDisplayLogic.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE46A2AE563400032557C /* FavoriteMoviesDisplayLogic.swift */; }; + AD1DE46E2AE594370032557C /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD1DE46D2AE594370032557C /* ImageView.swift */; }; + AD1DE4712AE595520032557C /* URLImage in Frameworks */ = {isa = PBXBuildFile; productRef = AD1DE4702AE595520032557C /* URLImage */; }; + AD2A02E12AE3F85A00F78998 /* MoviesModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02E02AE3F85A00F78998 /* MoviesModels.swift */; }; + AD2A02E32AE3F88500F78998 /* MoviesInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02E22AE3F88500F78998 /* MoviesInteractor.swift */; }; + AD2A02E52AE3F8A800F78998 /* MoviesPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02E42AE3F8A800F78998 /* MoviesPresenter.swift */; }; + AD2A02E72AE3F8F200F78998 /* MoviesDisplayLogic.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02E62AE3F8F200F78998 /* MoviesDisplayLogic.swift */; }; + AD2A02E92AE3F97100F78998 /* MovieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02E82AE3F97100F78998 /* MovieView.swift */; }; + AD2A02EB2AE3FAEB00F78998 /* MovieViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02EA2AE3FAEB00F78998 /* MovieViewModel.swift */; }; + AD2A02EE2AE445B400F78998 /* MovieCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02ED2AE445B400F78998 /* MovieCardView.swift */; }; + AD2A02F12AE4467800F78998 /* SearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02F02AE4467800F78998 /* SearchBarView.swift */; }; + AD2A02F62AE4751000F78998 /* GenreWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02F52AE4751000F78998 /* GenreWorker.swift */; }; + AD2A02F82AE4757100F78998 /* GenreResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02F72AE4757100F78998 /* GenreResponse.swift */; }; + AD2A02FA2AE4759700F78998 /* Genre.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02F92AE4759700F78998 /* Genre.swift */; }; + AD2A02FC2AE4767900F78998 /* GenreManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02FB2AE4767900F78998 /* GenreManager.swift */; }; + AD2A02FF2AE480FC00F78998 /* MovieDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2A02FE2AE480FC00F78998 /* MovieDetailView.swift */; }; + AD49DE172AE1EE6700A677EB /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = AD49DE162AE1EE6700A677EB /* KeychainSwift */; }; + AD49DE1E2AE1EFE800A677EB /* KeychainManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD49DE1D2AE1EFE800A677EB /* KeychainManager.swift */; }; + ADC09E572AE34C0000B65421 /* APIManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC09E562AE34C0000B65421 /* APIManager.swift */; }; + ADC09E5B2AE3543400B65421 /* MoviesResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC09E5A2AE3543400B65421 /* MoviesResponse.swift */; }; + ADC09E5D2AE3547500B65421 /* Movie.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC09E5C2AE3547500B65421 /* Movie.swift */; }; + ADE7D9D22AE1E7BE00D06BBC /* movieAppAccenApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE7D9D12AE1E7BE00D06BBC /* movieAppAccenApp.swift */; }; + ADE7D9D42AE1E7BE00D06BBC /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE7D9D32AE1E7BE00D06BBC /* ContentView.swift */; }; + ADE7D9D62AE1E7BF00D06BBC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADE7D9D52AE1E7BF00D06BBC /* Assets.xcassets */; }; + ADE7D9D92AE1E7BF00D06BBC /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADE7D9D82AE1E7BF00D06BBC /* Preview Assets.xcassets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + AD187F3E2AE32D0D005FBF3A /* UserDefaultsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsManager.swift; sourceTree = ""; }; + AD187F402AE32DD7005FBF3A /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + AD187F462AE33331005FBF3A /* MoviesWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesWorker.swift; sourceTree = ""; }; + AD1DE4582AE545940032557C /* MovieDataModel.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MovieDataModel.xcdatamodel; sourceTree = ""; }; + AD1DE45C2AE54DB00032557C /* CoreDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataManager.swift; sourceTree = ""; }; + AD1DE45F2AE54E000032557C /* FavoriteMovieManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteMovieManager.swift; sourceTree = ""; }; + AD1DE4612AE5606A0032557C /* FavoriteMoviesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteMoviesView.swift; sourceTree = ""; }; + AD1DE4642AE560A50032557C /* FavoriteCardMovieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteCardMovieView.swift; sourceTree = ""; }; + AD1DE4662AE562A80032557C /* FavoriteMoviesInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteMoviesInteractor.swift; sourceTree = ""; }; + AD1DE4682AE562C20032557C /* FavoriteMoviesPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteMoviesPresenter.swift; sourceTree = ""; }; + AD1DE46A2AE563400032557C /* FavoriteMoviesDisplayLogic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteMoviesDisplayLogic.swift; sourceTree = ""; }; + AD1DE46D2AE594370032557C /* ImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageView.swift; sourceTree = ""; }; + AD2A02E02AE3F85A00F78998 /* MoviesModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesModels.swift; sourceTree = ""; }; + AD2A02E22AE3F88500F78998 /* MoviesInteractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesInteractor.swift; sourceTree = ""; }; + AD2A02E42AE3F8A800F78998 /* MoviesPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesPresenter.swift; sourceTree = ""; }; + AD2A02E62AE3F8F200F78998 /* MoviesDisplayLogic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesDisplayLogic.swift; sourceTree = ""; }; + AD2A02E82AE3F97100F78998 /* MovieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieView.swift; sourceTree = ""; }; + AD2A02EA2AE3FAEB00F78998 /* MovieViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieViewModel.swift; sourceTree = ""; }; + AD2A02ED2AE445B400F78998 /* MovieCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieCardView.swift; sourceTree = ""; }; + AD2A02F02AE4467800F78998 /* SearchBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarView.swift; sourceTree = ""; }; + AD2A02F52AE4751000F78998 /* GenreWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenreWorker.swift; sourceTree = ""; }; + AD2A02F72AE4757100F78998 /* GenreResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenreResponse.swift; sourceTree = ""; }; + AD2A02F92AE4759700F78998 /* Genre.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Genre.swift; sourceTree = ""; }; + AD2A02FB2AE4767900F78998 /* GenreManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenreManager.swift; sourceTree = ""; }; + AD2A02FE2AE480FC00F78998 /* MovieDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDetailView.swift; sourceTree = ""; }; + AD49DE1D2AE1EFE800A677EB /* KeychainManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainManager.swift; sourceTree = ""; }; + ADC09E562AE34C0000B65421 /* APIManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIManager.swift; sourceTree = ""; }; + ADC09E5A2AE3543400B65421 /* MoviesResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoviesResponse.swift; sourceTree = ""; }; + ADC09E5C2AE3547500B65421 /* Movie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Movie.swift; sourceTree = ""; }; + ADE7D9CE2AE1E7BE00D06BBC /* movieAppAccen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = movieAppAccen.app; sourceTree = BUILT_PRODUCTS_DIR; }; + ADE7D9D12AE1E7BE00D06BBC /* movieAppAccenApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = movieAppAccenApp.swift; sourceTree = ""; }; + ADE7D9D32AE1E7BE00D06BBC /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + ADE7D9D52AE1E7BF00D06BBC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + ADE7D9D82AE1E7BF00D06BBC /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + ADE7D9CB2AE1E7BE00D06BBC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AD1DE4712AE595520032557C /* URLImage in Frameworks */, + AD49DE172AE1EE6700A677EB /* KeychainSwift in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AD187F2D2AE32A72005FBF3A /* Movies */ = { + isa = PBXGroup; + children = ( + AD187F462AE33331005FBF3A /* MoviesWorker.swift */, + AD2A02E02AE3F85A00F78998 /* MoviesModels.swift */, + AD2A02E22AE3F88500F78998 /* MoviesInteractor.swift */, + AD2A02E42AE3F8A800F78998 /* MoviesPresenter.swift */, + AD2A02E62AE3F8F200F78998 /* MoviesDisplayLogic.swift */, + AD2A02E82AE3F97100F78998 /* MovieView.swift */, + AD2A02EA2AE3FAEB00F78998 /* MovieViewModel.swift */, + ); + path = Movies; + sourceTree = ""; + }; + AD1DE45E2AE54DE60032557C /* FavoriteMovie */ = { + isa = PBXGroup; + children = ( + AD1DE45F2AE54E000032557C /* FavoriteMovieManager.swift */, + AD1DE4612AE5606A0032557C /* FavoriteMoviesView.swift */, + AD1DE4662AE562A80032557C /* FavoriteMoviesInteractor.swift */, + AD1DE4682AE562C20032557C /* FavoriteMoviesPresenter.swift */, + AD1DE46A2AE563400032557C /* FavoriteMoviesDisplayLogic.swift */, + ); + path = FavoriteMovie; + sourceTree = ""; + }; + AD1DE4632AE560860032557C /* FavoriteCard */ = { + isa = PBXGroup; + children = ( + AD1DE4642AE560A50032557C /* FavoriteCardMovieView.swift */, + ); + path = FavoriteCard; + sourceTree = ""; + }; + AD1DE46C2AE594000032557C /* Components */ = { + isa = PBXGroup; + children = ( + AD1DE46D2AE594370032557C /* ImageView.swift */, + ); + path = Components; + sourceTree = ""; + }; + AD2A02EC2AE4458600F78998 /* MovieCard */ = { + isa = PBXGroup; + children = ( + AD2A02ED2AE445B400F78998 /* MovieCardView.swift */, + ); + path = MovieCard; + sourceTree = ""; + }; + AD2A02EF2AE4466200F78998 /* SearchBar */ = { + isa = PBXGroup; + children = ( + AD2A02F02AE4467800F78998 /* SearchBarView.swift */, + ); + path = SearchBar; + sourceTree = ""; + }; + AD2A02FD2AE480E400F78998 /* MovieDetail */ = { + isa = PBXGroup; + children = ( + AD2A02FE2AE480FC00F78998 /* MovieDetailView.swift */, + ); + path = MovieDetail; + sourceTree = ""; + }; + AD49DE182AE1EF3600A677EB /* Models */ = { + isa = PBXGroup; + children = ( + ADC09E5A2AE3543400B65421 /* MoviesResponse.swift */, + ADC09E5C2AE3547500B65421 /* Movie.swift */, + AD2A02F72AE4757100F78998 /* GenreResponse.swift */, + AD2A02F92AE4759700F78998 /* Genre.swift */, + AD1DE4572AE545940032557C /* MovieDataModel.xcdatamodeld */, + ); + path = Models; + sourceTree = ""; + }; + AD49DE1A2AE1EF4E00A677EB /* Services */ = { + isa = PBXGroup; + children = ( + AD49DE1D2AE1EFE800A677EB /* KeychainManager.swift */, + AD187F3E2AE32D0D005FBF3A /* UserDefaultsManager.swift */, + AD187F402AE32DD7005FBF3A /* Constants.swift */, + ADC09E562AE34C0000B65421 /* APIManager.swift */, + AD2A02FB2AE4767900F78998 /* GenreManager.swift */, + AD1DE45C2AE54DB00032557C /* CoreDataManager.swift */, + ); + path = Services; + sourceTree = ""; + }; + AD49DE1B2AE1EF5700A677EB /* Scenes */ = { + isa = PBXGroup; + children = ( + AD1DE46C2AE594000032557C /* Components */, + AD1DE4632AE560860032557C /* FavoriteCard */, + AD1DE45E2AE54DE60032557C /* FavoriteMovie */, + AD2A02FD2AE480E400F78998 /* MovieDetail */, + AD2A02EF2AE4466200F78998 /* SearchBar */, + AD2A02EC2AE4458600F78998 /* MovieCard */, + AD187F2D2AE32A72005FBF3A /* Movies */, + ); + path = Scenes; + sourceTree = ""; + }; + AD49DE1C2AE1EFAB00A677EB /* Workers */ = { + isa = PBXGroup; + children = ( + AD2A02F52AE4751000F78998 /* GenreWorker.swift */, + ); + path = Workers; + sourceTree = ""; + }; + ADE7D9C52AE1E7BE00D06BBC = { + isa = PBXGroup; + children = ( + ADE7D9D02AE1E7BE00D06BBC /* movieAppAccen */, + ADE7D9CF2AE1E7BE00D06BBC /* Products */, + ); + sourceTree = ""; + }; + ADE7D9CF2AE1E7BE00D06BBC /* Products */ = { + isa = PBXGroup; + children = ( + ADE7D9CE2AE1E7BE00D06BBC /* movieAppAccen.app */, + ); + name = Products; + sourceTree = ""; + }; + ADE7D9D02AE1E7BE00D06BBC /* movieAppAccen */ = { + isa = PBXGroup; + children = ( + AD49DE1C2AE1EFAB00A677EB /* Workers */, + AD49DE1B2AE1EF5700A677EB /* Scenes */, + AD49DE1A2AE1EF4E00A677EB /* Services */, + AD49DE182AE1EF3600A677EB /* Models */, + ADE7D9D12AE1E7BE00D06BBC /* movieAppAccenApp.swift */, + ADE7D9D32AE1E7BE00D06BBC /* ContentView.swift */, + ADE7D9D52AE1E7BF00D06BBC /* Assets.xcassets */, + ADE7D9D72AE1E7BF00D06BBC /* Preview Content */, + ); + path = movieAppAccen; + sourceTree = ""; + }; + ADE7D9D72AE1E7BF00D06BBC /* Preview Content */ = { + isa = PBXGroup; + children = ( + ADE7D9D82AE1E7BF00D06BBC /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + ADE7D9CD2AE1E7BE00D06BBC /* movieAppAccen */ = { + isa = PBXNativeTarget; + buildConfigurationList = ADE7D9DC2AE1E7BF00D06BBC /* Build configuration list for PBXNativeTarget "movieAppAccen" */; + buildPhases = ( + ADE7D9CA2AE1E7BE00D06BBC /* Sources */, + ADE7D9CB2AE1E7BE00D06BBC /* Frameworks */, + ADE7D9CC2AE1E7BE00D06BBC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = movieAppAccen; + packageProductDependencies = ( + AD49DE162AE1EE6700A677EB /* KeychainSwift */, + AD1DE4702AE595520032557C /* URLImage */, + ); + productName = movieAppAccen; + productReference = ADE7D9CE2AE1E7BE00D06BBC /* movieAppAccen.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + ADE7D9C62AE1E7BE00D06BBC /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + ADE7D9CD2AE1E7BE00D06BBC = { + CreatedOnToolsVersion = 15.0; + }; + }; + }; + buildConfigurationList = ADE7D9C92AE1E7BE00D06BBC /* Build configuration list for PBXProject "movieAppAccen" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = ADE7D9C52AE1E7BE00D06BBC; + packageReferences = ( + AD49DE152AE1EE6700A677EB /* XCRemoteSwiftPackageReference "keychain-swift" */, + AD1DE46F2AE595520032557C /* XCRemoteSwiftPackageReference "url-image" */, + ); + productRefGroup = ADE7D9CF2AE1E7BE00D06BBC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + ADE7D9CD2AE1E7BE00D06BBC /* movieAppAccen */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + ADE7D9CC2AE1E7BE00D06BBC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ADE7D9D92AE1E7BF00D06BBC /* Preview Assets.xcassets in Resources */, + ADE7D9D62AE1E7BF00D06BBC /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + ADE7D9CA2AE1E7BE00D06BBC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ADE7D9D42AE1E7BE00D06BBC /* ContentView.swift in Sources */, + ADC09E5B2AE3543400B65421 /* MoviesResponse.swift in Sources */, + AD1DE46E2AE594370032557C /* ImageView.swift in Sources */, + AD2A02F82AE4757100F78998 /* GenreResponse.swift in Sources */, + AD2A02FC2AE4767900F78998 /* GenreManager.swift in Sources */, + AD1DE4602AE54E000032557C /* FavoriteMovieManager.swift in Sources */, + ADC09E5D2AE3547500B65421 /* Movie.swift in Sources */, + AD2A02EE2AE445B400F78998 /* MovieCardView.swift in Sources */, + AD49DE1E2AE1EFE800A677EB /* KeychainManager.swift in Sources */, + AD2A02FA2AE4759700F78998 /* Genre.swift in Sources */, + AD1DE4672AE562A80032557C /* FavoriteMoviesInteractor.swift in Sources */, + AD2A02E12AE3F85A00F78998 /* MoviesModels.swift in Sources */, + ADC09E572AE34C0000B65421 /* APIManager.swift in Sources */, + ADE7D9D22AE1E7BE00D06BBC /* movieAppAccenApp.swift in Sources */, + AD1DE4622AE5606A0032557C /* FavoriteMoviesView.swift in Sources */, + AD187F3F2AE32D0D005FBF3A /* UserDefaultsManager.swift in Sources */, + AD2A02E32AE3F88500F78998 /* MoviesInteractor.swift in Sources */, + AD1DE4652AE560A50032557C /* FavoriteCardMovieView.swift in Sources */, + AD2A02F62AE4751000F78998 /* GenreWorker.swift in Sources */, + AD2A02E92AE3F97100F78998 /* MovieView.swift in Sources */, + AD1DE46B2AE563400032557C /* FavoriteMoviesDisplayLogic.swift in Sources */, + AD187F412AE32DD7005FBF3A /* Constants.swift in Sources */, + AD1DE4692AE562C20032557C /* FavoriteMoviesPresenter.swift in Sources */, + AD2A02EB2AE3FAEB00F78998 /* MovieViewModel.swift in Sources */, + AD1DE45D2AE54DB00032557C /* CoreDataManager.swift in Sources */, + AD187F472AE33331005FBF3A /* MoviesWorker.swift in Sources */, + AD2A02E72AE3F8F200F78998 /* MoviesDisplayLogic.swift in Sources */, + AD2A02FF2AE480FC00F78998 /* MovieDetailView.swift in Sources */, + AD2A02F12AE4467800F78998 /* SearchBarView.swift in Sources */, + AD1DE4592AE545940032557C /* MovieDataModel.xcdatamodeld in Sources */, + AD2A02E52AE3F8A800F78998 /* MoviesPresenter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + ADE7D9DA2AE1E7BF00D06BBC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + ADE7D9DB2AE1E7BF00D06BBC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + ADE7D9DD2AE1E7BF00D06BBC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"movieAppAccen/Preview Content\""; + DEVELOPMENT_TEAM = J2P5349N7B; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.or.movieAppAccen; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + ADE7D9DE2AE1E7BF00D06BBC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"movieAppAccen/Preview Content\""; + DEVELOPMENT_TEAM = J2P5349N7B; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.or.movieAppAccen; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + ADE7D9C92AE1E7BE00D06BBC /* Build configuration list for PBXProject "movieAppAccen" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ADE7D9DA2AE1E7BF00D06BBC /* Debug */, + ADE7D9DB2AE1E7BF00D06BBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + ADE7D9DC2AE1E7BF00D06BBC /* Build configuration list for PBXNativeTarget "movieAppAccen" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ADE7D9DD2AE1E7BF00D06BBC /* Debug */, + ADE7D9DE2AE1E7BF00D06BBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + AD1DE46F2AE595520032557C /* XCRemoteSwiftPackageReference "url-image" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/dmytro-anokhin/url-image"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.1.1; + }; + }; + AD49DE152AE1EE6700A677EB /* XCRemoteSwiftPackageReference "keychain-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/evgenyneu/keychain-swift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 20.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + AD1DE4702AE595520032557C /* URLImage */ = { + isa = XCSwiftPackageProductDependency; + package = AD1DE46F2AE595520032557C /* XCRemoteSwiftPackageReference "url-image" */; + productName = URLImage; + }; + AD49DE162AE1EE6700A677EB /* KeychainSwift */ = { + isa = XCSwiftPackageProductDependency; + package = AD49DE152AE1EE6700A677EB /* XCRemoteSwiftPackageReference "keychain-swift" */; + productName = KeychainSwift; + }; +/* End XCSwiftPackageProductDependency section */ + +/* Begin XCVersionGroup section */ + AD1DE4572AE545940032557C /* MovieDataModel.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + AD1DE4582AE545940032557C /* MovieDataModel.xcdatamodel */, + ); + currentVersion = AD1DE4582AE545940032557C /* MovieDataModel.xcdatamodel */; + path = MovieDataModel.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = ADE7D9C62AE1E7BE00D06BBC /* Project object */; +} diff --git a/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..4310ed67 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,23 @@ +{ + "pins" : [ + { + "identity" : "keychain-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/evgenyneu/keychain-swift.git", + "state" : { + "revision" : "d108a1fa6189e661f91560548ef48651ed8d93b9", + "version" : "20.0.0" + } + }, + { + "identity" : "url-image", + "kind" : "remoteSourceControl", + "location" : "https://github.com/dmytro-anokhin/url-image", + "state" : { + "revision" : "4042f955f1fdff00ced85545e1eecdbf969b5cd0", + "version" : "3.1.1" + } + } + ], + "version" : 2 +} diff --git a/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcuserdata/orlandovelasco.xcuserdatad/UserInterfaceState.xcuserstate b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcuserdata/orlandovelasco.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 00000000..82ddcae3 Binary files /dev/null and b/movieAppAccen/movieAppAccen.xcodeproj/project.xcworkspace/xcuserdata/orlandovelasco.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..74f2cf17 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcschemes/xcschememanagement.plist b/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 00000000..4d1810d8 --- /dev/null +++ b/movieAppAccen/movieAppAccen.xcodeproj/xcuserdata/orlandovelasco.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + movieAppAccen.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/movieAppAccen/movieAppAccen/.DS_Store b/movieAppAccen/movieAppAccen/.DS_Store new file mode 100644 index 00000000..5830be66 Binary files /dev/null and b/movieAppAccen/movieAppAccen/.DS_Store differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/AccentColor.colorset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/AppIcon.appiconset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..13613e3e --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Contents.json new file mode 100644 index 00000000..4ca4d41f --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Contents.json @@ -0,0 +1,12 @@ +{ + "data" : [ + { + "filename" : "Logo-animado-1.gif", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Logo-animado-1.gif b/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Logo-animado-1.gif new file mode 100644 index 00000000..c6767c8e Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/Logo-animado-1.dataset/Logo-animado-1.gif differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Contents.json new file mode 100644 index 00000000..ac194a29 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Icon-20.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-20@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-20@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20.png new file mode 100644 index 00000000..a336bf3c Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@2x.png new file mode 100644 index 00000000..ecb363b8 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@3x.png new file mode 100644 index 00000000..59aca727 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-20.imageset/Icon-20@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Contents.json new file mode 100644 index 00000000..64a1c693 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Icon-29.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-29@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-29@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29.png new file mode 100644 index 00000000..a4550b53 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@2x.png new file mode 100644 index 00000000..45a28075 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@3x.png new file mode 100644 index 00000000..f153ad96 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29.imageset/Icon-29@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Contents.json new file mode 100644 index 00000000..e8f159a7 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-29@2x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-29@2x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@2x.png new file mode 100644 index 00000000..7140f306 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@3x.png new file mode 100644 index 00000000..b69875a7 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@2x.imageset/Icon-29@2x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Contents.json new file mode 100644 index 00000000..8c9c5658 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-29@3x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-29@3x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@2x.png new file mode 100644 index 00000000..68718681 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@3x.png new file mode 100644 index 00000000..1bac0bee Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-29@3x.imageset/Icon-29@3x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Contents.json new file mode 100644 index 00000000..04910a0b --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Icon-40.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-40@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-40@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40.png new file mode 100644 index 00000000..66d3a259 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@2x.png new file mode 100644 index 00000000..81ba9b33 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@3x.png new file mode 100644 index 00000000..98e8870f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40.imageset/Icon-40@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Contents.json new file mode 100644 index 00000000..4694d60c --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-40@2x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-40@2x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@2x.png new file mode 100644 index 00000000..db8a73c2 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@3x.png new file mode 100644 index 00000000..8b617212 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@2x.imageset/Icon-40@2x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Contents.json new file mode 100644 index 00000000..84966485 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-40@3x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-40@3x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@2x.png new file mode 100644 index 00000000..2f4b871a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@3x.png new file mode 100644 index 00000000..fd5fa2a1 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-40@3x.imageset/Icon-40@3x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Contents.json new file mode 100644 index 00000000..5e38437b --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-60@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-60@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@2x.png new file mode 100644 index 00000000..98e8870f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@3x.png new file mode 100644 index 00000000..bebdd249 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60.imageset/Icon-60@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Contents.json new file mode 100644 index 00000000..770f10d8 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-60@2x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-60@2x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@2x.png new file mode 100644 index 00000000..2f4b871a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@3x.png new file mode 100644 index 00000000..fd5fa2a1 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@2x.imageset/Icon-60@2x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Contents.json new file mode 100644 index 00000000..12f7d666 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-60@3x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-60@3x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@2x.png new file mode 100644 index 00000000..bbb2d43a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@3x.png new file mode 100644 index 00000000..26262c99 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-60@3x.imageset/Icon-60@3x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Contents.json new file mode 100644 index 00000000..7c373e50 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Icon-76.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-76@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-76@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76.png new file mode 100644 index 00000000..44003f87 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@2x.png new file mode 100644 index 00000000..a1d6e870 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@3x.png new file mode 100644 index 00000000..faa88652 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76.imageset/Icon-76@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Contents.json new file mode 100644 index 00000000..71e1a5d1 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-76@2x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-76@2x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@2x.png new file mode 100644 index 00000000..42e550b0 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@3x.png new file mode 100644 index 00000000..25f29583 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-76@2x.imageset/Icon-76@2x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Contents.json new file mode 100644 index 00000000..d9438826 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Icon-83.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Icon-83@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Icon-83@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83.png new file mode 100644 index 00000000..829169ed Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@2x.png new file mode 100644 index 00000000..d5d58f8c Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@3x.png new file mode 100644 index 00000000..c0c270e3 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/Icon-83.imageset/Icon-83@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/Contents.json new file mode 100644 index 00000000..49e3aefc --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iTunesArtwork@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/iTunesArtwork@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/iTunesArtwork@2x.png new file mode 100644 index 00000000..0ea24c0c Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork.imageset/iTunesArtwork@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/Contents.json new file mode 100644 index 00000000..6597416c --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iTunesArtwork@2x@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "iTunesArtwork@2x@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@2x.png new file mode 100644 index 00000000..30ecf24d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@3x.png new file mode 100644 index 00000000..8745b58c Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/appIcons/iTunesArtwork@2x.imageset/iTunesArtwork@2x@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/Contents.json new file mode 100644 index 00000000..8210b0e8 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "filtro.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/filtro.png b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/filtro.png new file mode 100644 index 00000000..cf913d7f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/filtro.imageset/filtro.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/Contents.json new file mode 100644 index 00000000..14d19ade --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "lista.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/lista.png b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/lista.png new file mode 100644 index 00000000..2cfd429d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/lista.imageset/lista.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/Contents.json new file mode 100644 index 00000000..1ee24ce4 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "splash_detalhes.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/splash_detalhes.png b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/splash_detalhes.png new file mode 100644 index 00000000..9f68d7c9 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/flow/splash_detalhes.imageset/splash_detalhes.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/Contents.json new file mode 100644 index 00000000..715da0e6 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "FilterIcon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "FilterIcon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "FilterIcon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon.png new file mode 100644 index 00000000..1189b5d2 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@2x.png new file mode 100644 index 00000000..5a3dcefd Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@3x.png new file mode 100644 index 00000000..0f02f209 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/FilterIcon.imageset/FilterIcon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/Contents.json new file mode 100644 index 00000000..e9b24c1d --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "check_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "check_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "check_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon.png new file mode 100644 index 00000000..9d9dfe9a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@2x.png new file mode 100644 index 00000000..045dfd6d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@3x.png new file mode 100644 index 00000000..38fef76f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/check_icon.imageset/check_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/Contents.json new file mode 100644 index 00000000..a7246d43 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "favorite_empty_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "favorite_empty_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "favorite_empty_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon.png new file mode 100644 index 00000000..429ac8f2 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@2x.png new file mode 100644 index 00000000..745071dd Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@3x.png new file mode 100644 index 00000000..1fc36b4e Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_empty_icon.imageset/favorite_empty_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/Contents.json new file mode 100644 index 00000000..b1edaae9 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "favorite_full_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "favorite_full_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "favorite_full_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon.png new file mode 100644 index 00000000..88ea5e06 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@2x.png new file mode 100644 index 00000000..d852b253 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@3x.png new file mode 100644 index 00000000..1b2a8a32 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_full_icon.imageset/favorite_full_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/Contents.json new file mode 100644 index 00000000..2a30cb2f --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "favorite_gray_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "favorite_gray_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "favorite_gray_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon.png new file mode 100644 index 00000000..90cb0d48 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@2x.png new file mode 100644 index 00000000..710f2e9d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@3x.png new file mode 100644 index 00000000..3fa7f1f2 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/favorite_gray_icon.imageset/favorite_gray_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/Contents.json new file mode 100644 index 00000000..7609a04a --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "list_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "list_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "list_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon.png new file mode 100644 index 00000000..9242c58a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@2x.png new file mode 100644 index 00000000..eefd201b Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@3x.png new file mode 100644 index 00000000..65fc127d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/list_icon.imageset/list_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/Contents.json new file mode 100644 index 00000000..3432447b --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "search_icon.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "search_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "search_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon.png new file mode 100644 index 00000000..b5baa52d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@2x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@2x.png new file mode 100644 index 00000000..0257f7aa Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@2x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@3x.png new file mode 100644 index 00000000..996a7e26 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/icons/search_icon.imageset/search_icon@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Contents.json new file mode 100644 index 00000000..fe93cd27 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Detail@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Detail@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Detail@3x.png new file mode 100644 index 00000000..64103330 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Detail.imageset/Detail@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Contents.json new file mode 100644 index 00000000..051d7a9b --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Favorites@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Favorites@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Favorites@3x.png new file mode 100644 index 00000000..acb16e3e Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Favorites.imageset/Favorites@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Contents.json new file mode 100644 index 00000000..673b502f --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Filter Option Selection@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Filter Option Selection@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Filter Option Selection@3x.png new file mode 100644 index 00000000..4f8b7f9a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter Option Selection.imageset/Filter Option Selection@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Contents.json new file mode 100644 index 00000000..6f9b100d --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Filter@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Filter@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Filter@3x.png new file mode 100644 index 00000000..24ddbe9f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Filter.imageset/Filter@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Contents.json new file mode 100644 index 00000000..22a3612d --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Movies Error State@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Movies Error State@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Movies Error State@3x.png new file mode 100644 index 00000000..bc3f7292 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Error State.imageset/Movies Error State@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Contents.json new file mode 100644 index 00000000..07b14177 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Movies Loading State@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Movies Loading State@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Movies Loading State@3x.png new file mode 100644 index 00000000..6afd8975 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Loading State.imageset/Movies Loading State@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Contents.json new file mode 100644 index 00000000..cd27df97 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Movies Search Empty State@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Movies Search Empty State@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Movies Search Empty State@3x.png new file mode 100644 index 00000000..c7230a5d Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies Search Empty State.imageset/Movies Search Empty State@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Contents.json new file mode 100644 index 00000000..41975460 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Movies@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Movies@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Movies@3x.png new file mode 100644 index 00000000..57be07a8 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Movies.imageset/Movies@3x.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Contents.json new file mode 100644 index 00000000..b71d33b7 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Pallete.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Pallete.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Pallete.png new file mode 100644 index 00000000..3971e7a6 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Pallete.imageset/Pallete.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Contents.json new file mode 100644 index 00000000..f0108832 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Splash Detalhes e Favoritos.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Splash Detalhes e Favoritos.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Splash Detalhes e Favoritos.png new file mode 100644 index 00000000..9f68d7c9 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash Detalhes e Favoritos.imageset/Splash Detalhes e Favoritos.png differ diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Contents.json b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Contents.json new file mode 100644 index 00000000..d32d1e22 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Splash@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Splash@3x.png b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Splash@3x.png new file mode 100644 index 00000000..b2bce346 Binary files /dev/null and b/movieAppAccen/movieAppAccen/Assets.xcassets/screenshots/Splash.imageset/Splash@3x.png differ diff --git a/movieAppAccen/movieAppAccen/ContentView.swift b/movieAppAccen/movieAppAccen/ContentView.swift new file mode 100644 index 00000000..f851bd5e --- /dev/null +++ b/movieAppAccen/movieAppAccen/ContentView.swift @@ -0,0 +1,30 @@ +// +// ContentView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 19-10-23. +// + +import SwiftUI + +struct ContentView: View { + @State private var selectedTab = 0 + + var body: some View { + TabView(selection: $selectedTab) { + MovieView(viewModel: MovieViewModel()) + .tabItem { + Image(systemName: "list.bullet") + Text("Movies") + } + .tag(0) + + FavoriteMoviesView() + .tabItem { + Image(systemName: "heart") + Text("Favorites") + } + .tag(1) + } + } +} diff --git a/movieAppAccen/movieAppAccen/Models/.DS_Store b/movieAppAccen/movieAppAccen/Models/.DS_Store new file mode 100644 index 00000000..4d193b4a Binary files /dev/null and b/movieAppAccen/movieAppAccen/Models/.DS_Store differ diff --git a/movieAppAccen/movieAppAccen/Models/Genre.swift b/movieAppAccen/movieAppAccen/Models/Genre.swift new file mode 100644 index 00000000..c2d7b161 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Models/Genre.swift @@ -0,0 +1,13 @@ +// +// Genre.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +struct Genre: Codable, Identifiable { + let id: Int + let name: String +} diff --git a/movieAppAccen/movieAppAccen/Models/GenreResponse.swift b/movieAppAccen/movieAppAccen/Models/GenreResponse.swift new file mode 100644 index 00000000..24d0afb8 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Models/GenreResponse.swift @@ -0,0 +1,12 @@ +// +// GenreResponse.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +struct GenreResponse: Codable { + let genres: [Genre] +} diff --git a/movieAppAccen/movieAppAccen/Models/Movie.swift b/movieAppAccen/movieAppAccen/Models/Movie.swift new file mode 100644 index 00000000..f15e30fd --- /dev/null +++ b/movieAppAccen/movieAppAccen/Models/Movie.swift @@ -0,0 +1,42 @@ +// +// Movie.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation + +struct Movie: Identifiable, Codable { + let adult: Bool + let backdropPath: String? + let genreIds: [Int] + let id: Int + let originalLanguage: String + let originalTitle: String + let overview: String + let popularity: Double + let posterPath: String? + let releaseDate: String + let title: String + let video: Bool + let voteAverage: Double + let voteCount: Int + + enum CodingKeys: String, CodingKey { + case adult + case backdropPath = "backdrop_path" + case genreIds = "genre_ids" + case id + case originalLanguage = "original_language" + case originalTitle = "original_title" + case overview + case popularity + case posterPath = "poster_path" + case releaseDate = "release_date" + case title + case video + case voteAverage = "vote_average" + case voteCount = "vote_count" + } +} diff --git a/movieAppAccen/movieAppAccen/Models/MovieDataModel.xcdatamodeld/MovieDataModel.xcdatamodel/contents b/movieAppAccen/movieAppAccen/Models/MovieDataModel.xcdatamodeld/MovieDataModel.xcdatamodel/contents new file mode 100644 index 00000000..5e3fcb38 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Models/MovieDataModel.xcdatamodeld/MovieDataModel.xcdatamodel/contents @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/movieAppAccen/movieAppAccen/Models/MoviesResponse.swift b/movieAppAccen/movieAppAccen/Models/MoviesResponse.swift new file mode 100644 index 00000000..37848a02 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Models/MoviesResponse.swift @@ -0,0 +1,23 @@ +// +// MovieResponse.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation + +struct MoviesResponse: Codable { + let page: Int + let results: [Movie] + let totalPages: Int + let totalResults: Int + + enum CodingKeys: String, CodingKey { + case page + case results + case totalPages = "total_pages" + case totalResults = "total_results" + } +} + diff --git a/movieAppAccen/movieAppAccen/Preview Content/Preview Assets.xcassets/Contents.json b/movieAppAccen/movieAppAccen/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/.DS_Store b/movieAppAccen/movieAppAccen/Scenes/.DS_Store new file mode 100644 index 00000000..1202113f Binary files /dev/null and b/movieAppAccen/movieAppAccen/Scenes/.DS_Store differ diff --git a/movieAppAccen/movieAppAccen/Scenes/Components/ImageView.swift b/movieAppAccen/movieAppAccen/Scenes/Components/ImageView.swift new file mode 100644 index 00000000..a3687681 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Components/ImageView.swift @@ -0,0 +1,30 @@ +// +// ImageView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import SwiftUI +import URLImage + +struct ImageView: View { + let url: String + let baseURL = "https://image.tmdb.org/t/p/w500/" + + var body: some View { + URLImage(URL(string: baseURL + url)!) { + EmptyView() + } inProgress: { progress in + Text("Loading...") + } failure: { error, retry in + VStack { + Text(error.localizedDescription) + Button("Retry", action: retry) + } + } content: { image in + image + .resizable() + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteCard/FavoriteCardMovieView.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteCard/FavoriteCardMovieView.swift new file mode 100644 index 00000000..dc6d0d47 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteCard/FavoriteCardMovieView.swift @@ -0,0 +1,43 @@ +// +// FavoriteCardMovieView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import SwiftUI + +struct FavoriteCardMovieView: View { + let movie: FavoriteMovie + + var body: some View { + HStack(spacing: 10) { + + if let posterPath = movie.posterPath { + ImageView(url: posterPath).frame(width: 80, height: 120) + } else { + Image("defaultImage") + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: 80, height: 120) + .clipped() + } + + VStack(alignment: .leading, spacing: 5) { + Text(movie.title ?? "") + .fontWeight(.bold) + + Text(dateFormatter.string(from: movie.releaseDate ?? Date()).split(separator: "-")[2]) + + Text(movie.overview ?? "") + .lineLimit(2) + } + } + } + + private var dateFormatter: DateFormatter { + let formatter = DateFormatter() + formatter.dateStyle = .medium + return formatter + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMovieManager.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMovieManager.swift new file mode 100644 index 00000000..4f5b8f8e --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMovieManager.swift @@ -0,0 +1,70 @@ +// +// FavoriteMovieManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import Foundation +import CoreData + +class FavoriteMovieManager { + + private let context = CoreDataManager.shared.container.viewContext + + func fetchAllFavorites() -> [FavoriteMovie] { + let fetchRequest: NSFetchRequest = FavoriteMovie.fetchRequest() + do { + let favorites = try context.fetch(fetchRequest) + return favorites + } catch { + print("Error: \(error.localizedDescription)") + return [] + } + } + + func addFavorite(movie: Movies.FetchMovies.ViewModel.DisplayedMovie) { + let favorite = FavoriteMovie(context: context) + favorite.id = Int64(movie.id) + favorite.title = movie.title + favorite.posterPath = movie.posterPath + favorite.overview = movie.overview + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + if let releaseDate = dateFormatter.date(from: movie.releaseDate) { + favorite.releaseDate = releaseDate + } + + CoreDataManager.shared.saveContext() + } + + func removeFavorite(by movieId: Int) { + let fetchRequest: NSFetchRequest = FavoriteMovie.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "id == %d", movieId) + + do { + let favorites = try context.fetch(fetchRequest) + for favorite in favorites { + context.delete(favorite) + } + CoreDataManager.shared.saveContext() + } catch { + print("Error: \(error.localizedDescription)") + } + } + + func isFavorite(movieId: Int) -> Bool { + let fetchRequest: NSFetchRequest = FavoriteMovie.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "id == %d", movieId) + + do { + let favorites = try context.fetch(fetchRequest) + return !favorites.isEmpty + } catch { + print("Error: \(error.localizedDescription)") + return false + } + } +} + diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesDisplayLogic.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesDisplayLogic.swift new file mode 100644 index 00000000..99097163 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesDisplayLogic.swift @@ -0,0 +1,12 @@ +// +// FavoriteMoviesDisplayLogic.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import Foundation + +protocol FavoriteMoviesDisplayLogic { + func displayFavoriteMovies(_ movies: [FavoriteMovie]) +} diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesInteractor.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesInteractor.swift new file mode 100644 index 00000000..ab254891 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesInteractor.swift @@ -0,0 +1,14 @@ +// +// FavoriteMoviesInteractor.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import Foundation + +class FavoriteMoviesInteractor { + func fetchFavoriteMovies() -> [FavoriteMovie] { + return FavoriteMovieManager().fetchAllFavorites() + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesPresenter.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesPresenter.swift new file mode 100644 index 00000000..c43b855f --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesPresenter.swift @@ -0,0 +1,14 @@ +// +// FavoriteMoviesPresenter.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import Foundation + +class FavoriteMoviesPresenter { + func presentFavoriteMovies(_ movies: [FavoriteMovie]) -> [FavoriteMovie] { + return movies + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesView.swift b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesView.swift new file mode 100644 index 00000000..688c1afd --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/FavoriteMovie/FavoriteMoviesView.swift @@ -0,0 +1,41 @@ +// +// FavoriteMoviesView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// + +import SwiftUI + +struct FavoriteMoviesView: View, FavoriteMoviesDisplayLogic { + @State private var favoriteMovies: [FavoriteMovie] = [] + private let interactor = FavoriteMoviesInteractor() + private let presenter = FavoriteMoviesPresenter() + + var body: some View { + List(favoriteMovies, id: \.id) { movie in + FavoriteCardMovieView(movie: movie) + .swipeActions(edge: .trailing) { + Button(action: { + FavoriteMovieManager().removeFavorite(by: Int(movie.id)) + loadFavoriteMovies() + }) { + Text("Unfavorite") + } + .tint(.red) + } + } + .onAppear { + loadFavoriteMovies() + } + } + + func loadFavoriteMovies() { + let movies = interactor.fetchFavoriteMovies() + displayFavoriteMovies(presenter.presentFavoriteMovies(movies)) + } + + func displayFavoriteMovies(_ movies: [FavoriteMovie]) { + favoriteMovies = movies + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/MovieCard/MovieCardView.swift b/movieAppAccen/movieAppAccen/Scenes/MovieCard/MovieCardView.swift new file mode 100644 index 00000000..0db49b39 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/MovieCard/MovieCardView.swift @@ -0,0 +1,60 @@ +// +// MovieCardView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import SwiftUI + +struct MovieCardView: View { + var movie: Movies.FetchMovies.ViewModel.DisplayedMovie + @State private var isFavorite: Bool = false + + var body: some View { + NavigationLink(destination: MovieDetailView(movie: movie)) { + + VStack(spacing: 0) { + Spacer() + HStack{ + if let posterPath = movie.posterPath { + ImageView(url: posterPath).frame(height: 190) + } else { + Image("defaultImage") + .resizable() + .scaledToFit() + .frame(height: 190) + } + } + HStack { + Spacer() + + Text(movie.title) + .fontWeight(.medium) + .frame(height: 60) + .foregroundColor(Color.black) + Spacer() + + Button(action: { + if isFavorite { + FavoriteMovieManager().removeFavorite(by: movie.id) + } else { + FavoriteMovieManager().addFavorite(movie: movie) + } + isFavorite.toggle() + }) { + Image(systemName: isFavorite ? "heart.fill" : "heart") + .font(.system(size: 25)) + .foregroundColor(Color.black) + .padding(.trailing, 5) + } + } + .background(Color.gray) + } + } + .frame(width: 180, height: 250) + .onAppear { + isFavorite = FavoriteMovieManager().isFavorite(movieId: movie.id) + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/MovieDetail/MovieDetailView.swift b/movieAppAccen/movieAppAccen/Scenes/MovieDetail/MovieDetailView.swift new file mode 100644 index 00000000..1e5a2bc0 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/MovieDetail/MovieDetailView.swift @@ -0,0 +1,57 @@ +// +// MovieDetailView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import SwiftUI + +struct MovieDetailView: View { + var movie: Movies.FetchMovies.ViewModel.DisplayedMovie + @State private var isFavorite: Bool = false + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + if let posterPath = movie.posterPath { + ImageView(url: posterPath) + } else { + Image("defaultImage") + .resizable() + .scaledToFit() + .padding(.top, 20) + } + HStack{ + Text(movie.title) + Spacer() + Button(action: { + if isFavorite { + FavoriteMovieManager().removeFavorite(by: movie.id) + } else { + FavoriteMovieManager().addFavorite(movie: movie) + } + isFavorite.toggle() + }) { + Image(systemName: isFavorite ? "heart.fill" : "heart") + .font(.system(size: 25)) + .foregroundColor(Color.black) + .padding(.trailing, 5) + } + } + Divider().background(Color.black) + Text(movie.releaseDate.split(separator: "-")[0]) + Divider().background(Color.black) + let genreNames = movie.genreIds.compactMap { GenreManager.shared.genre(forID: $0)?.name } + if !genreNames.isEmpty { + Text(genreNames.joined(separator: ", ")) + } + Divider().background(Color.black) + Text(movie.overview) + Spacer() + } + .padding() + .onAppear { + isFavorite = FavoriteMovieManager().isFavorite(movieId: movie.id) + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MovieView.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MovieView.swift new file mode 100644 index 00000000..60924399 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MovieView.swift @@ -0,0 +1,35 @@ +// +// MovieView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import SwiftUI + +struct MovieView: View { + @ObservedObject var viewModel: MovieViewModel + @State private var searchText = "" + + var body: some View { + NavigationView { + VStack { + SearchBarView(searchText: $searchText) + .onChange(of: searchText) { newValue in + viewModel.filterMovies(by: newValue) + } + ScrollView { + let columns: [GridItem] = Array(repeating: .init(.flexible()), count: UIScreen.main.bounds.width < 600 ? 2 : 3) + LazyVGrid(columns: columns, spacing: 20) { + ForEach(viewModel.displayedMovies) { movie in + MovieCardView(movie: movie) + } + } + .padding() + } + } + .onAppear(perform: viewModel.fetchMovies) + .navigationTitle("Movies") + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MovieViewModel.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MovieViewModel.swift new file mode 100644 index 00000000..35ad6fb6 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MovieViewModel.swift @@ -0,0 +1,52 @@ +// +// MovieViewModel.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +class MovieViewModel: ObservableObject, MoviesDisplayLogic { + + @Published var displayedMovies: [Movies.FetchMovies.ViewModel.DisplayedMovie] = [] + private var allMovies: [Movies.FetchMovies.ViewModel.DisplayedMovie] = [] + @Published var errorMessage: String = "" + @Published var showErrorAlert: Bool = false + var interactor: MoviesBusinessLogic? + var presenter: MoviesPresentationLogic? + + init() { + let interactor = MoviesInteractor() + let presenter = MoviesPresenter() + self.interactor = interactor + self.presenter = presenter + interactor.presenter = presenter + presenter.view = self + } + + func fetchMovies() { + let request = Movies.FetchMovies.Request() + interactor?.fetchMovies(request: request) + } + + func displayFetchedMovies(viewModel: Movies.FetchMovies.ViewModel) { + allMovies = viewModel.displayedMovies + displayedMovies = viewModel.displayedMovies + } + + func displayError(message: String) { + self.errorMessage = message + self.showErrorAlert = true + } + + func filterMovies(by searchText: String) { + if !searchText.isEmpty { + displayedMovies = allMovies.filter { movie in + movie.title.lowercased().contains(searchText.lowercased()) + } + } else { + displayedMovies = allMovies + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesDisplayLogic.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesDisplayLogic.swift new file mode 100644 index 00000000..f65ed652 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesDisplayLogic.swift @@ -0,0 +1,11 @@ +// +// MoviesDisplayLogic.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +protocol MoviesDisplayLogic { + func displayFetchedMovies(viewModel: Movies.FetchMovies.ViewModel) + func displayError(message: String) +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesInteractor.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesInteractor.swift new file mode 100644 index 00000000..9e7edd49 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesInteractor.swift @@ -0,0 +1,45 @@ +// +// MoviesInteractor.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +protocol MoviesBusinessLogic { + func fetchMovies(request: Movies.FetchMovies.Request) +} + +class MoviesInteractor: MoviesBusinessLogic { + var presenter: MoviesPresentationLogic? + var worker: MoviesWorker = MoviesWorker() + var genreManager: GenreManager = GenreManager.shared + + + func fetchMovies(request: Movies.FetchMovies.Request) { + if genreManager.genres.isEmpty { + genreManager.fetchAndStoreGenres { error in + if error == nil { + self.retrieveTopRatedMovies() + } else { + self.presenter?.handleError(error: error) + } + } + } else { + self.retrieveTopRatedMovies() + } + } + + private func retrieveTopRatedMovies() { + worker.fetchTopRatedMovies { movies, error in + if let movies = movies { + let response = Movies.FetchMovies.Response(movies: movies) + self.presenter?.presentFetchedMovies(response: response) + } else if let error = error { + self.presenter?.handleError(error: error) + } + } + } + +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesModels.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesModels.swift new file mode 100644 index 00000000..a19ab54a --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesModels.swift @@ -0,0 +1,31 @@ +// +// MoviesModels.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// +import Foundation + +enum Movies { + enum FetchMovies { + struct Request { + } + + struct Response { + let movies: [Movie] + } + + struct ViewModel { + let displayedMovies: [DisplayedMovie] + + struct DisplayedMovie: Identifiable { + let id: Int + let title: String + let overview: String + let genreIds: [Int] + let releaseDate: String + let posterPath: String? + } + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesPresenter.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesPresenter.swift new file mode 100644 index 00000000..cd43fecd --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesPresenter.swift @@ -0,0 +1,39 @@ +// +// MoviesPresenter.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +protocol MoviesPresentationLogic { + func presentFetchedMovies(response: Movies.FetchMovies.Response) + func handleError(error: Error?) +} + +class MoviesPresenter: MoviesPresentationLogic { + + var view: MoviesDisplayLogic? + + func presentFetchedMovies(response: Movies.FetchMovies.Response) { + let displayedMovies = response.movies.map { movie in + Movies.FetchMovies.ViewModel.DisplayedMovie( + id: movie.id, + title: movie.title, + overview: movie.overview, + genreIds: movie.genreIds, + releaseDate: movie.releaseDate, + posterPath: movie.posterPath + ) + } + let viewModel = Movies.FetchMovies.ViewModel(displayedMovies: displayedMovies) + view?.displayFetchedMovies(viewModel: viewModel) + } + + func handleError(error: Error?) { + guard let error = error else { return } + let errorMessage = "Ocurrió un error: \(error.localizedDescription)" + view?.displayError(message: errorMessage) + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesWorker.swift b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesWorker.swift new file mode 100644 index 00000000..2fb7bd03 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/Movies/MoviesWorker.swift @@ -0,0 +1,32 @@ +// +// MoviesWorker.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation + +class MoviesWorker { + + private let apiManager = APIManager() + + func fetchTopRatedMovies(completion: @escaping ([Movie]?, Error?) -> Void) { + let endpoint = "/movie/top_rated" + let parameters = ["language": "en-US", "page": "1"] + + apiManager.get(endpoint: endpoint, parameters: parameters) { data, error in + if let data = data { + let decoder = JSONDecoder() + do { + let response = try decoder.decode(MoviesResponse.self, from: data) + completion(response.results, nil) + } catch { + completion(nil, error) + } + } else if let error = error { + completion(nil, error) + } + } + } +} diff --git a/movieAppAccen/movieAppAccen/Scenes/SearchBar/SearchBarView.swift b/movieAppAccen/movieAppAccen/Scenes/SearchBar/SearchBarView.swift new file mode 100644 index 00000000..411ddbe7 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Scenes/SearchBar/SearchBarView.swift @@ -0,0 +1,28 @@ +// +// SearchBarView.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import SwiftUI + +struct SearchBarView: View { + @Binding var searchText: String + + var body: some View { + ZStack { + if searchText.isEmpty { + HStack { + Image(systemName: "magnifyingglass") + Text("Search") + } + } + TextField("", text: $searchText) + .padding(12) + .background(Color.gray.opacity(0.2)) + .cornerRadius(8) + .padding(.horizontal) + } + } +} diff --git a/movieAppAccen/movieAppAccen/Services/APIManager.swift b/movieAppAccen/movieAppAccen/Services/APIManager.swift new file mode 100644 index 00000000..c74bbac8 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/APIManager.swift @@ -0,0 +1,61 @@ +// +// APIManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation + +class APIManager { + + private let baseURL = "https://api.themoviedb.org/3" + private var apiKey: String? { + return KeychainManager.shared.get(key: KeychainKeys.apiKey) + } + + func get(endpoint: String, parameters: [String: String] = [:], headers: [String: String] = [:], completion: @escaping (Data?, Error?) -> Void) { + request(method: "GET", endpoint: endpoint, parameters: parameters, body: nil, headers: headers, completion: completion) + } + + func post(endpoint: String, parameters: [String: String] = [:], body: Data?, headers: [String: String] = [:], completion: @escaping (Data?, Error?) -> Void) { + request(method: "POST", endpoint: endpoint, parameters: parameters, body: body, headers: headers, completion: completion) + } + + func delete(endpoint: String, parameters: [String: String] = [:], headers: [String: String] = [:], completion: @escaping (Data?, Error?) -> Void) { + request(method: "DELETE", endpoint: endpoint, parameters: parameters, body: nil, headers: headers, completion: completion) + } + + private func request(method: String, endpoint: String, parameters: [String: String], body: Data?, headers: [String: String], completion: @escaping (Data?, Error?) -> Void) { + var urlComponents = URLComponents(string: baseURL + endpoint) + + let queryItems: [URLQueryItem] = parameters.map { URLQueryItem(name: $0.key, value: $0.value) } + urlComponents?.queryItems = queryItems + + guard let url = urlComponents?.url else { + completion(nil, NSError(domain: "", code: 400, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"])) + return + } + + var request = URLRequest(url: url) + request.httpMethod = method + + if let apiKey = apiKey { + request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization") + } + + for (key, value) in headers { + request.setValue(value, forHTTPHeaderField: key) + } + + if let body = body { + request.httpBody = body + } + + let task = URLSession.shared.dataTask(with: request) { data, response, error in + completion(data, error) + } + + task.resume() + } +} diff --git a/movieAppAccen/movieAppAccen/Services/Constants.swift b/movieAppAccen/movieAppAccen/Services/Constants.swift new file mode 100644 index 00000000..f49bb27a --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/Constants.swift @@ -0,0 +1,11 @@ +// +// Constants.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation +struct KeychainKeys { + static let apiKey = "movieAPIKey" +} diff --git a/movieAppAccen/movieAppAccen/Services/CoreDataManager.swift b/movieAppAccen/movieAppAccen/Services/CoreDataManager.swift new file mode 100644 index 00000000..9e4e0233 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/CoreDataManager.swift @@ -0,0 +1,34 @@ +// +// CoreDataManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 22-10-23. +// +// CoreDataManager.swift + +import Foundation +import CoreData + +class CoreDataManager { + + static let shared = CoreDataManager() + + let container: NSPersistentContainer + + private init() { + container = NSPersistentContainer(name: "MovieDataModel") + container.loadPersistentStores { (description, error) in + if let error = error { + fatalError("Error: \(error.localizedDescription)") + } + } + } + + func saveContext() { + do { + try container.viewContext.save() + } catch { + print("Error: \(error.localizedDescription)") + } + } +} diff --git a/movieAppAccen/movieAppAccen/Services/GenreManager.swift b/movieAppAccen/movieAppAccen/Services/GenreManager.swift new file mode 100644 index 00000000..fcc31338 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/GenreManager.swift @@ -0,0 +1,33 @@ +// +// GenreManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +class GenreManager { + static let shared = GenreManager() + + var genres: [Genre] = [] + private let genreWorker = GenreWorker() + + private init() {} + + func fetchAndStoreGenres(completion: @escaping (Error?) -> Void) { + genreWorker.fetchMovieGenres { fetchedGenres, error in + if let fetchedGenres = fetchedGenres { + self.genres = fetchedGenres + completion(nil) + } else if let error = error { + completion(error) + } + } + } + + func genre(forID id: Int) -> Genre? { + return genres.first { $0.id == id } + } +} + diff --git a/movieAppAccen/movieAppAccen/Services/KeychainManager.swift b/movieAppAccen/movieAppAccen/Services/KeychainManager.swift new file mode 100644 index 00000000..b9e306b3 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/KeychainManager.swift @@ -0,0 +1,30 @@ +// +// KeychainManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 19-10-23. +// + +import Foundation +import KeychainSwift + +class KeychainManager { + + private let keychain = KeychainSwift() + + static let shared = KeychainManager() + + private init() {} + + func save(key: String, value: String) { + keychain.set(value, forKey: key) + } + + func get(key: String) -> String? { + return keychain.get(key) + } + + func delete(key: String) { + keychain.delete(key) + } +} diff --git a/movieAppAccen/movieAppAccen/Services/UserDefaultsManager.swift b/movieAppAccen/movieAppAccen/Services/UserDefaultsManager.swift new file mode 100644 index 00000000..9eac0b54 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Services/UserDefaultsManager.swift @@ -0,0 +1,35 @@ +// +// UserDefaultsManager.swift +// movieAppAccen +// +// Created by Orlando Velasco on 20-10-23. +// + +import Foundation + +class UserDefaultsManager { + + static let shared = UserDefaultsManager() + + private init() {} + + func set(_ value: T, forKey key: String) { + let encoder = JSONEncoder() + if let encoded = try? encoder.encode(value) { + UserDefaults.standard.set(encoded, forKey: key) + } + } + + func get(forKey key: String) -> T? { + let decoder = JSONDecoder() + if let data = UserDefaults.standard.data(forKey: key), + let value = try? decoder.decode(T.self, from: data) { + return value + } + return nil + } + + func remove(forKey key: String) { + UserDefaults.standard.removeObject(forKey: key) + } +} diff --git a/movieAppAccen/movieAppAccen/Workers/GenreWorker.swift b/movieAppAccen/movieAppAccen/Workers/GenreWorker.swift new file mode 100644 index 00000000..eb356b69 --- /dev/null +++ b/movieAppAccen/movieAppAccen/Workers/GenreWorker.swift @@ -0,0 +1,29 @@ +// +// GenreWorker.swift +// movieAppAccen +// +// Created by Orlando Velasco on 21-10-23. +// + +import Foundation + +class GenreWorker { + private let apiManager = APIManager() + + func fetchMovieGenres(completion: @escaping ([Genre]?, Error?) -> Void) { + let endpoint = "/genre/movie/list" + apiManager.get(endpoint: endpoint, parameters: [:]) { data, error in + if let data = data { + let decoder = JSONDecoder() + do { + let response = try decoder.decode(GenreResponse.self, from: data) + completion(response.genres, nil) + } catch { + completion(nil, error) + } + } else if let error = error { + completion(nil, error) + } + } + } +} diff --git a/movieAppAccen/movieAppAccen/movieAppAccenApp.swift b/movieAppAccen/movieAppAccen/movieAppAccenApp.swift new file mode 100644 index 00000000..7b3c17cb --- /dev/null +++ b/movieAppAccen/movieAppAccen/movieAppAccenApp.swift @@ -0,0 +1,29 @@ +// +// movieAppAccenApp.swift +// movieAppAccen +// +// Created by Orlando Velasco on 19-10-23. +// + +import SwiftUI + +@main +struct movieAppAccenApp: App { + + init() { + setupAPIKey() + } + + var body: some Scene { + WindowGroup { + ContentView() + } + } + + private func setupAPIKey() { + if KeychainManager.shared.get(key: KeychainKeys.apiKey) == nil { + let apiKeyValue = "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI1MjAxY2M5YzExYThjYjdiMDlkNTA3MzExMTZlZjdkMSIsInN1YiI6IjY1MmVmMjVhMzU4ZGE3NWI2MWY5OTNkNiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.dIxmT9seCTpQ3i9pgNNtZfouZEYRtmk34nbXFnizCaQ" + KeychainManager.shared.save(key: KeychainKeys.apiKey, value: apiKeyValue) + } + } +}