diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a5ccda1..b50c38d 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -47,5 +47,21 @@ dependencies {
implementation("io.ktor:ktor-client-cio:$ktor")
implementation("io.ktor:ktor-client-content-negotiation:$ktor")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor")
+ implementation("io.coil-kt.coil3:coil-compose-core:$coil")
+
+ implementation("io.ktor:ktor-client-okhttp:$ktor")
+ implementation("io.ktor:ktor-client-logging:$ktor")
+ implementation("io.ktor:ktor-client-auth:$ktor")
+
+ implementation("androidx.compose.material:material-icons-extended:1.6.3")
+
+ implementation(platform("io.insert-koin:koin-bom:4.0.0"))
+ implementation("io.insert-koin:koin-core")
+ implementation("io.insert-koin:koin-android")
+ implementation("io.insert-koin:koin-compose")
+ implementation("io.insert-koin:koin-androidx-compose")
+
+ implementation(platform("io.coil-kt.coil3:coil-bom:3.0.0"))
+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a2c02bd..b3798f5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,7 +5,7 @@
+ android:label="@string/app_name">
diff --git a/app/src/main/java/ru/myitschool/work/App.kt b/app/src/main/java/ru/myitschool/work/App.kt
deleted file mode 100644
index aa33483..0000000
--- a/app/src/main/java/ru/myitschool/work/App.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package ru.myitschool.work
-
-import android.app.Application
-import android.content.Context
-
-class App: Application() {
- override fun onCreate() {
- super.onCreate()
- context = this
- }
-
- companion object {
- lateinit var context: Context
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/Application.kt b/app/src/main/java/ru/myitschool/work/Application.kt
new file mode 100644
index 0000000..f1e375d
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/Application.kt
@@ -0,0 +1,16 @@
+package ru.myitschool.work
+
+import android.app.Application
+import ru.myitschool.work.comp.di.appModule
+import org.koin.android.ext.koin.androidContext
+import org.koin.core.context.startKoin
+
+class Application : Application(){
+ override fun onCreate() {
+ super.onCreate()
+ startKoin {
+ androidContext(this@Application)
+ modules(appModule)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/MainActivity.kt b/app/src/main/java/ru/myitschool/work/MainActivity.kt
new file mode 100644
index 0000000..b2ff542
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/MainActivity.kt
@@ -0,0 +1,19 @@
+package ru.myitschool.work
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.activity.enableEdgeToEdge
+import ru.myitschool.work.ui.theme.WorkTheme
+
+class MainActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ setContent {
+ WorkTheme {
+ AppNavHost()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/NavigationGraph.kt
new file mode 100644
index 0000000..a8a7dd8
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/NavigationGraph.kt
@@ -0,0 +1,83 @@
+package ru.myitschool.work
+
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.rememberNavController
+import ru.myitschool.work.comp.presentation.auth.AuthScreenRoot
+import ru.myitschool.work.comp.presentation.bookingScreen.BookingScreenRoot
+import ru.myitschool.work.comp.presentation.main.MainScreenRoot
+import ru.myitschool.work.comp.domain.nav.AuthScreenDestination
+import ru.myitschool.work.comp.domain.nav.BookScreenDestination
+import ru.myitschool.work.comp.domain.nav.MainScreenDestination
+import ru.myitschool.work.comp.domain.nav.SplashScreenDestination
+import com.example.result.comp.presentation.splash.SplashScreen
+
+@Composable
+fun AppNavHost(
+ modifier: Modifier = Modifier,
+ navController: NavHostController = rememberNavController()
+) {
+ NavHost(
+ modifier = modifier,
+ enterTransition = { EnterTransition.None },
+ exitTransition = { ExitTransition.None },
+ navController = navController,
+ startDestination = SplashScreenDestination,
+ ) {
+ composable {
+ SplashScreen(
+ onNavigateToMainScreen = {
+ navController.navigate(MainScreenDestination){
+ popUpTo(SplashScreenDestination){
+ inclusive = true
+ }
+ }
+ },
+ onNavigateToAuthScreen = {
+ navController.navigate(AuthScreenDestination){
+ popUpTo(SplashScreenDestination){
+ inclusive = true
+ }
+ }
+ }
+ )
+ }
+ composable {
+ AuthScreenRoot(
+ onNavigateToMainScreen = {
+ navController.navigate(MainScreenDestination){
+ popUpTo(AuthScreenDestination){
+ inclusive = true
+ }
+ }
+ }
+ )
+ }
+ composable {
+ MainScreenRoot(
+ onNavigateToAuthScreen = {
+ navController.navigate(AuthScreenDestination){
+ popUpTo(MainScreenDestination){
+ inclusive = true
+ }
+ }
+ },
+ onNavigateToBookingScreen = {
+ navController.navigate(BookScreenDestination)
+ }
+ )
+ }
+ composable {
+ BookingScreenRoot(
+ onNavigateBack = {
+ navController.popBackStack()
+ }
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/dtos/BookDto.kt b/app/src/main/java/ru/myitschool/work/comp/data/dtos/BookDto.kt
new file mode 100644
index 0000000..b41c8dd
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/dtos/BookDto.kt
@@ -0,0 +1,9 @@
+package ru.myitschool.work.comp.data.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class BookDto(
+ val date : String,
+ val placeId : Int
+)
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetBookingsDto.kt b/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetBookingsDto.kt
new file mode 100644
index 0000000..6b92154
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetBookingsDto.kt
@@ -0,0 +1,11 @@
+package ru.myitschool.work.comp.data.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class PlaceDto(
+ val id: Int,
+ val place: String
+)
+
+typealias BookingsResponse = Map>
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetInfoDto.kt b/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetInfoDto.kt
new file mode 100644
index 0000000..f792dda
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/dtos/GetInfoDto.kt
@@ -0,0 +1,16 @@
+package ru.myitschool.work.comp.data.dtos
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class GetInfoDto(
+ val photoUrl : String,
+ val booking : Map,
+ val name : String,
+)
+
+@Serializable
+data class BookingDto(
+ val id: Int,
+ val place: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/mappers/BookMapper.kt b/app/src/main/java/ru/myitschool/work/comp/data/mappers/BookMapper.kt
new file mode 100644
index 0000000..445ddb7
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/mappers/BookMapper.kt
@@ -0,0 +1,12 @@
+package ru.myitschool.work.comp.data.mappers
+
+import ru.myitschool.work.comp.domain.model.BookModel
+import ru.myitschool.work.comp.data.dtos.BookDto
+
+
+fun BookModel.toDto(): BookDto {
+ return BookDto(
+ date = date,
+ placeId = placeId
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetBookingsMapper.kt b/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetBookingsMapper.kt
new file mode 100644
index 0000000..d13a744
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetBookingsMapper.kt
@@ -0,0 +1,19 @@
+package ru.myitschool.work.comp.data.mappers
+
+
+import ru.myitschool.work.comp.domain.model.GetBookingsModel
+import ru.myitschool.work.comp.domain.model.PlaceModel
+import ru.myitschool.work.comp.data.dtos.PlaceDto
+
+fun Map>.toModel(): GetBookingsModel {
+ return GetBookingsModel(
+ bookings = this.mapValues { (_, places) ->
+ places.map { placeDto ->
+ PlaceModel(
+ id = placeDto.id,
+ place = placeDto.place
+ )
+ }
+ }
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetInfoMapper.kt b/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetInfoMapper.kt
new file mode 100644
index 0000000..1ebbbb0
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/mappers/GetInfoMapper.kt
@@ -0,0 +1,24 @@
+package ru.myitschool.work.comp.data.mappers
+
+import ru.myitschool.work.comp.data.dtos.BookingDto
+import ru.myitschool.work.comp.data.dtos.GetInfoDto
+import ru.myitschool.work.comp.domain.model.BookingModel
+import ru.myitschool.work.comp.domain.model.GetInfoModel
+
+fun GetInfoDto.toModel(): GetInfoModel {
+ return GetInfoModel(
+ photoUrl = photoUrl,
+ booking = booking.map { (date, bookingItem) ->
+ bookingItem.toModel(date)
+ }.toList(),
+ name = name,
+ )
+}
+
+fun BookingDto.toModel(date: String): BookingModel {
+ return BookingModel(
+ id = id,
+ date = date,
+ place = place
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/ru/myitschool/work/comp/data/repository/AppRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/comp/data/repository/AppRepositoryImpl.kt
new file mode 100644
index 0000000..a377997
--- /dev/null
+++ b/app/src/main/java/ru/myitschool/work/comp/data/repository/AppRepositoryImpl.kt
@@ -0,0 +1,79 @@
+package ru.myitschool.work.comp.data.repository
+
+import ru.myitschool.work.comp.data.dtos.BookDto
+import ru.myitschool.work.comp.data.dtos.GetInfoDto
+import ru.myitschool.work.comp.data.dtos.PlaceDto
+import ru.myitschool.work.comp.domain.repository.AppRepository
+import ru.myitschool.work.core.auth.CodeProvider
+import ru.myitschool.work.core.data.safeCall
+import ru.myitschool.work.core.domain.Constants
+import ru.myitschool.work.core.domain.DataError
+import ru.myitschool.work.core.domain.Result
+import io.ktor.client.HttpClient
+import io.ktor.client.request.get
+import io.ktor.client.request.post
+import io.ktor.client.request.setBody
+import io.ktor.client.statement.HttpResponse
+import io.ktor.http.ContentType
+import io.ktor.http.contentType
+
+class AppRepositoryImpl(
+ private val httpClient: HttpClient,
+ private val codeProvider: CodeProvider
+) : AppRepository {
+ private val code: String?
+ get() = codeProvider.getCode()
+
+ override suspend fun auth(codeToSend: String): Result {
+ return try {
+ val response: HttpResponse = httpClient.get(
+ urlString = "/api/" + codeToSend + Constants.AUTH_URL
+ )
+
+ when (response.status.value) {
+ 200 -> {
+ Result.Success(Unit)
+ }
+ 401 -> {
+ Result.Error(DataError.Remote.UNAUTHORIZED)
+ }
+ 400 -> {
+ Result.Error(DataError.Remote.BAD_REQUEST)
+ }
+ else -> {
+ Result.Error(DataError.Remote.UNKNOWN)
+ }
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ Result.Error(DataError.Remote.NETWORK)
+ }
+ }
+
+ override suspend fun getInfo(): Result {
+ return safeCall {
+ httpClient.get(
+ urlString = code + Constants.INFO_URL
+ )
+ }
+ }
+
+ override suspend fun getBooking(): Result