Skip to content

Commit

Permalink
feat: tạo các màn hình cho: learn, flip, test, match flashcard
Browse files Browse the repository at this point in the history
- navigation cơ bản cho các màn
  • Loading branch information
nqmgaming committed Oct 20, 2024
1 parent 4e28adb commit a2ec494
Show file tree
Hide file tree
Showing 49 changed files with 783 additions and 110 deletions.
14 changes: 14 additions & 0 deletions app/src/main/java/com/pwhs/quickmem/core/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.pwhs.quickmem.core.di

import com.pwhs.quickmem.data.remote.repository.AuthRepositoryImpl
import com.pwhs.quickmem.data.remote.repository.ClassRepositoryImpl
import com.pwhs.quickmem.data.remote.repository.FlashCardRepositoryImpl
import com.pwhs.quickmem.data.remote.repository.FolderRepositoryImpl
import com.pwhs.quickmem.data.remote.repository.StudySetRepositoryImpl
import com.pwhs.quickmem.data.remote.repository.UploadImageRepositoryImpl
import com.pwhs.quickmem.domain.repository.AuthRepository
import com.pwhs.quickmem.domain.repository.ClassRepository
import com.pwhs.quickmem.domain.repository.FlashCardRepository
import com.pwhs.quickmem.domain.repository.FolderRepository
import com.pwhs.quickmem.domain.repository.StudySetRepository
import com.pwhs.quickmem.domain.repository.UploadImageRepository
import dagger.Binds
Expand Down Expand Up @@ -36,4 +40,14 @@ abstract class RepositoryModule {
uploadImageRepositoryImpl: UploadImageRepositoryImpl
): UploadImageRepository

@Binds
abstract fun bindClassRepository(
classRepositoryImpl: ClassRepositoryImpl
): ClassRepository

@Binds
abstract fun bindFolderRepository(
folderRepositoryImpl: FolderRepositoryImpl
): FolderRepository

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.pwhs.quickmem.data.remote.repository

import com.pwhs.quickmem.data.remote.ApiService
import com.pwhs.quickmem.domain.repository.ClassRepository
import javax.inject.Inject

class ClassRepositoryImpl @Inject constructor(
private val apiService: ApiService
) : ClassRepository {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.pwhs.quickmem.data.remote.repository

import com.pwhs.quickmem.data.remote.ApiService
import com.pwhs.quickmem.domain.repository.FolderRepository
import javax.inject.Inject

class FolderRepositoryImpl @Inject constructor(
private val apiService: ApiService
) : FolderRepository {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.pwhs.quickmem.domain.repository

interface ClassRepository {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.pwhs.quickmem.domain.repository

interface FolderRepository {
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ import androidx.navigation.NavController
import androidx.navigation.compose.currentBackStackEntryAsState
import com.pwhs.quickmem.R
import com.pwhs.quickmem.presentation.component.BottomSheetItem
import com.ramcosta.composedestinations.generated.destinations.CreateClassScreenDestination
import com.ramcosta.composedestinations.generated.destinations.CreateFolderScreenDestination
import com.ramcosta.composedestinations.generated.destinations.CreateStudySetScreenDestination

@OptIn(ExperimentalMaterial3Api::class)
Expand Down Expand Up @@ -190,13 +192,15 @@ fun StandardScaffold(
icon = R.drawable.ic_folder,
onClick = {
showBottomSheetCreate = false
navController.navigate(CreateFolderScreenDestination.route)
}
)
BottomSheetItem(
title = "Create a class",
icon = R.drawable.ic_school,
onClick = {
showBottomSheetCreate = false
navController.navigate(CreateClassScreenDestination.route)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,56 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.annotation.parameters.DeepLink
import com.ramcosta.composedestinations.generated.destinations.WelcomeScreenDestination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator

@OptIn(ExperimentalMaterial3Api::class)
@Composable
@Destination<RootGraph>(deepLinks = [DeepLink(uriPattern = "quickmem://join/class?code={code}")])
fun ClassesScreen(
fun ClassScreen(
modifier: Modifier = Modifier,
code: String = "",
viewModel: ClassesViewModel = hiltViewModel(),
viewModel: ClassViewModel = hiltViewModel(),
navigator: DestinationsNavigator
) {
val uiState by viewModel.uiState.collectAsState()
LaunchedEffect(key1 = true) {
viewModel.uiEvent.collect { event ->
when (event) {
ClassesUiEvent.NavigateToWelcome -> {
ClassUiEvent.NavigateToWelcome -> {
navigator.navigate(WelcomeScreenDestination) {
popUpTo(WelcomeScreenDestination) {
inclusive = true
}
}
}

ClassesUiEvent.OnJoinClass -> TODO()
ClassUiEvent.OnJoinClass -> TODO()
}
}
}

Class(modifier = modifier, code = code)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Class(
modifier: Modifier = Modifier,
code: String
) {
Scaffold(
topBar = {
CenterAlignedTopAppBar(
Expand All @@ -57,4 +68,12 @@ fun ClassesScreen(
Text(text = "Code: $code")
}
}
}

@Preview
@Composable
private fun ClassScreenPreview() {
MaterialTheme {
Class(code = "123")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.pwhs.quickmem.presentation.app.classes

sealed class ClassUiAction {
data object JoinClassClicked : ClassUiAction()
data object NavigateToWelcomeClicked : ClassUiAction()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.pwhs.quickmem.presentation.app.classes

sealed class ClassUiEvent {
data object OnJoinClass : ClassUiEvent()
data object NavigateToWelcome : ClassUiEvent()
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.pwhs.quickmem.presentation.app.classes

data class ClassesUiState(
data class ClassUiState(
val joinClassCode: String = "",
val isLogin: Boolean = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class ClassesViewModel @Inject constructor(
class ClassViewModel @Inject constructor(
private val tokenManager: TokenManager,
private val appManager: AppManager,
savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _uiState = MutableStateFlow(ClassesUiState())
private val _uiState = MutableStateFlow(ClassUiState())
val uiState = _uiState.asStateFlow()

private val _uiEvent = Channel<ClassesUiEvent>()
private val _uiEvent = Channel<ClassUiEvent>()
val uiEvent = _uiEvent.receiveAsFlow()

init {
Expand All @@ -34,20 +34,20 @@ class ClassesViewModel @Inject constructor(
_uiState.update { it.copy(isLogin = true) }
} else {
_uiState.update { it.copy(isLogin = false) }
onEvent(ClassesUiAction.NavigateToWelcomeClicked)
onEvent(ClassUiAction.NavigateToWelcomeClicked)
}
}
}
}

fun onEvent(event: ClassesUiAction) {
fun onEvent(event: ClassUiAction) {
when (event) {
ClassesUiAction.JoinClassClicked -> {
ClassUiAction.JoinClassClicked -> {
TODO()
}

ClassesUiAction.NavigateToWelcomeClicked -> {
_uiEvent.trySend(ClassesUiEvent.NavigateToWelcome)
ClassUiAction.NavigateToWelcomeClicked -> {
_uiEvent.trySend(ClassUiEvent.NavigateToWelcome)
}
}
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.pwhs.quickmem.presentation.app.classes.create

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator

@Composable
@Destination<RootGraph>
fun CreateClassScreen(
modifier: Modifier = Modifier,
viewModel: CreateClassViewModel = hiltViewModel(),
navigator: DestinationsNavigator
) {
val uiState by viewModel.uiState.collectAsState()
LaunchedEffect(key1 = true) {
viewModel.uiEvent.collect { event ->
when (event) {

else -> {}
}
}
}

CreateClass(modifier = modifier)

}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CreateClass(modifier: Modifier = Modifier) {
Scaffold(
topBar = {
CenterAlignedTopAppBar(
title = { Text(text = "Create Class") }
)
}
) { innerPadding ->
Column(
modifier = modifier.padding(innerPadding)
) {
Text(text = "Create class screen")
}
}
}

@Preview
@Composable
private fun CreateClassesPreview() {
MaterialTheme {
CreateClass()
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.pwhs.quickmem.presentation.app.classes.create

sealed class CreateClassUiAction {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.pwhs.quickmem.presentation.app.classes.create

sealed class CreateClassUiEvent {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.pwhs.quickmem.presentation.app.classes.create

data class CreateClassUiState(
val isLoading: Boolean = false,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.pwhs.quickmem.presentation.app.classes.create

import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import com.pwhs.quickmem.core.datastore.AppManager
import com.pwhs.quickmem.core.datastore.TokenManager
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.receiveAsFlow
import javax.inject.Inject

@HiltViewModel
class CreateClassViewModel @Inject constructor(
private val tokenManager: TokenManager,
private val appManager: AppManager,
savedStateHandle: SavedStateHandle
) : ViewModel() {
private val _uiState = MutableStateFlow(CreateClassUiState())
val uiState = _uiState.asStateFlow()

private val _uiEvent = Channel<CreateClassUiEvent>()
val uiEvent = _uiEvent.receiveAsFlow()

fun onEvent(event: CreateClassUiAction) {
when (event) {

else -> {}
}
}
}
Loading

0 comments on commit a2ec494

Please sign in to comment.