Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion application/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ android {
compileSdk = 35

defaultConfig {
val baseUrl = System.getenv("WRITEOPIA_CLIENT_BASE_URL")
val baseUrl = "https://writeopia.dev"
buildConfigField("String", "BASE_URL", "\"$baseUrl\"")

applicationId = "io.writeopia"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ import androidx.navigation.compose.rememberNavController
import io.writeopia.BuildConfig
import io.writeopia.auth.di.AuthInjection
import io.writeopia.auth.navigation.authNavigation
import io.writeopia.common.utils.Destinations
import io.writeopia.common.utils.NotesNavigation
import io.writeopia.common.utils.di.SharedPreferencesInjector
import io.writeopia.editor.di.EditorKmpInjector
import io.writeopia.features.search.di.MobileSearchInjection
import io.writeopia.mobile.AppMobile
import io.writeopia.notemenu.di.NotesMenuKmpInjection
import io.writeopia.notemenu.di.UiConfigurationInjector
import io.writeopia.notemenu.navigation.NoteMenuDestiny
import io.writeopia.notemenu.navigation.navigateToNotes
import io.writeopia.persistence.room.DatabaseConfigAndroid
import io.writeopia.persistence.room.WriteopiaApplicationDatabase
Expand All @@ -42,7 +42,7 @@ class NavigationActivity : ComponentActivity() {

NavigationGraph(
application = application,
startDestination = NoteMenuDestiny.noteMenu()
startDestination = Destinations.START_APP.id
)
}
}
Expand Down Expand Up @@ -96,6 +96,8 @@ fun NavigationGraph(
editorInjector = editorInjector,
navigationViewModel = navigationViewModel
) {
startScreen(navController, authInjection, colorThemeState)

authNavigation(navController, authInjection, colorThemeState) {
navController.navigateToNotes(NotesNavigation.Root)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.compose.currentBackStackEntryAsState
import io.writeopia.common.utils.Destinations
import io.writeopia.common.utils.NotesNavigation
import io.writeopia.common.utils.icons.WrIcons
import io.writeopia.editor.di.TextEditorInjector
import io.writeopia.features.search.di.SearchInjection
Expand All @@ -30,14 +30,13 @@ import io.writeopia.navigation.NavigationViewModel
import io.writeopia.navigation.notes.navigateToNoteMenu
import io.writeopia.navigation.notifications.navigateToNotifications
import io.writeopia.navigation.search.navigateToSearch
import io.writeopia.common.utils.NotesNavigation
import io.writeopia.notemenu.di.NotesMenuInjection
import io.writeopia.theme.WrieopiaTheme
import io.writeopia.viewmodel.UiConfigurationViewModel

@Composable
fun AppMobile(
startDestination: String = Destinations.AUTH_MENU_INNER_NAVIGATION.id,
startDestination: String,
navController: NavHostController,
searchInjector: SearchInjection,
uiConfigViewModel: UiConfigurationViewModel,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package io.writeopia.navigation

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import io.writeopia.auth.core.di.AuthCoreInjectionNeo
import io.writeopia.auth.di.AuthInjection
import io.writeopia.auth.menu.AuthMenuViewModel
import io.writeopia.common.utils.Destinations
import io.writeopia.di.AppConnectionInjection
import io.writeopia.model.ColorThemeOption
import io.writeopia.model.isDarkTheme
import io.writeopia.theme.WrieopiaTheme
import io.writeopia.theme.WriteopiaTheme
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.StateFlow

fun NavGraphBuilder.startScreen(
navigationController: NavController,
authInjection: AuthInjection,
colorTheme: StateFlow<ColorThemeOption?>
) {
composable(route = Destinations.START_APP.id) {
val authMenuViewModel: AuthMenuViewModel =
authInjection.provideAuthMenuViewModel()

IntroScreen(colorTheme.value)

LaunchedEffect(Unit) {
AuthCoreInjectionNeo.singleton()
.provideAuthRepository()
.getAuthToken()
?.let(AppConnectionInjection.singleton()::setJwtToken)

authMenuViewModel.isLoggedIn().collect { loggedIn ->
delay(300)
navigationController.navigate(
if (loggedIn) {
Destinations.MAIN_APP.id
} else {
Destinations.AUTH_MENU_INNER_NAVIGATION.id
}
)
}
}
}
}

@Composable
fun ScreenLoading() {
Box(modifier = Modifier.fillMaxSize()) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
}
}

@Composable
fun IntroScreen(colorThemeOption: ColorThemeOption?) {
WrieopiaTheme(darkTheme = colorThemeOption.isDarkTheme()) {
Box(
modifier = Modifier
.fillMaxSize()
.background(
WriteopiaTheme.colorScheme.globalBackground
)
) {
CircularProgressIndicator(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.onBackground
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package io.writeopia.desktop
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
Expand All @@ -24,17 +22,15 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import io.github.kdroidfilter.platformtools.darkmodedetector.isSystemInDarkMode
import io.github.kdroidfilter.platformtools.darkmodedetector.windows.setWindowsAdaptiveTitleBar
import io.writeopia.auth.core.di.AuthCoreInjectionNeo
import io.writeopia.auth.di.AuthInjection
import io.writeopia.auth.menu.AuthMenuViewModel
import io.writeopia.auth.navigation.authNavigation
import io.writeopia.common.utils.Destinations
import io.writeopia.common.utils.keyboard.KeyboardCommands
import io.writeopia.common.utils.keyboard.isMultiSelectionTrigger
import io.writeopia.common.utils.ui.GlobalToastBox
import io.writeopia.di.AppConnectionInjection
import io.writeopia.model.ColorThemeOption
import io.writeopia.model.isDarkTheme
import io.writeopia.navigation.ScreenLoading
import io.writeopia.navigation.startScreen
import io.writeopia.notemenu.di.UiConfigurationInjector
import io.writeopia.notes.desktop.components.DesktopApp
import io.writeopia.resources.CommonImages
Expand Down Expand Up @@ -236,32 +232,9 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
navController = navigationController,
startDestination = Destinations.START_APP.id
) {
composable(route = Destinations.START_APP.id) {
val authMenuViewModel: AuthMenuViewModel =
authInjection.provideAuthMenuViewModel()
startScreen(navigationController, authInjection, colorTheme)

IntroScreen(colorTheme.value)

LaunchedEffect(Unit) {
AuthCoreInjectionNeo.singleton()
.provideAuthRepository()
.getAuthToken()
?.let(AppConnectionInjection.singleton()::setJwtToken)

authMenuViewModel.isLoggedIn().collect { loggedIn ->
delay(300)
navigationController.navigate(
if (loggedIn) {
Destinations.CHOOSE_NOTE.id
} else {
Destinations.AUTH_MENU_INNER_NAVIGATION.id
}
)
}
}
}

composable(route = Destinations.CHOOSE_NOTE.id) {
composable(route = Destinations.MAIN_APP.id) {
DesktopApp(
writeopiaDb = database,
selectionState = selectionState,
Expand Down Expand Up @@ -289,7 +262,7 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
authInjection = authInjection,
colorThemeOption = colorTheme
) {
navigationController.navigate(Destinations.CHOOSE_NOTE.id)
navigationController.navigate(Destinations.MAIN_APP.id)
}
}
}
Expand All @@ -303,28 +276,3 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
}
}
}

@Composable
private fun ScreenLoading() {
Box(modifier = Modifier.fillMaxSize()) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
}
}

@Composable
private fun IntroScreen(colorThemeOption: ColorThemeOption?) {
WrieopiaTheme(darkTheme = colorThemeOption.isDarkTheme()) {
Box(
modifier = Modifier
.fillMaxSize()
.background(
WriteopiaTheme.colorScheme.globalBackground
)
) {
CircularProgressIndicator(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.onBackground
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@ package io.writeopia.auth.core.di

import io.writeopia.auth.core.data.AuthApi
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.auth.core.manager.SqlDelightRepository
import io.writeopia.auth.core.repository.RoomAuthRepository
import io.writeopia.common.utils.persistence.di.AppDaosInjection
import io.writeopia.di.AppConnectionInjection
import io.writeopia.persistence.room.injection.AppRoomDaosInjection
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
import io.writeopia.sql.WriteopiaDb
import io.writeopia.sqldelight.di.WriteopiaDbInjector

// Todo: Fix this
actual class AuthCoreInjectionNeo(
// Change this to use a different persistence
private val writeopiaDb: WriteopiaDb? = WriteopiaDbInjector.singleton()?.database,
private val appsDaosInjection: AppDaosInjection = AppRoomDaosInjection.singleton(),
private val appConnectionInjection: AppConnectionInjection = AppConnectionInjection.singleton(),
private val connectionInjector: WriteopiaConnectionInjector =
WriteopiaConnectionInjector.singleton()
) {

actual fun provideAuthRepository(): AuthRepository = SqlDelightRepository(writeopiaDb)
actual fun provideAuthRepository(): AuthRepository =
RoomAuthRepository(appsDaosInjection.provideUserDao(), appsDaosInjection.provideTokenDao())

actual fun provideAuthApi(): AuthApi =
AuthApi(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.writeopia.auth.core.repository

import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.common.utils.ResultData
import io.writeopia.common.utils.persistence.daos.TokenCommonDao
import io.writeopia.common.utils.persistence.daos.UserCommonDao
import io.writeopia.sdk.models.user.WriteopiaUser

class RoomAuthRepository(
private val userDao: UserCommonDao,
private val tokenCommonDao: TokenCommonDao
) : AuthRepository {
override suspend fun getUser(): WriteopiaUser = userDao.selectCurrentUser()

override suspend fun isLoggedIn(): Boolean = getUser().id != WriteopiaUser.DISCONNECTED

override suspend fun logout(): ResultData<Boolean> {
if (isLoggedIn()) {
userDao.deleteUser(getUser().id)
}

return ResultData.Complete(true)
}

override suspend fun saveUser(user: WriteopiaUser, selected: Boolean) {
userDao.insertUser(user, selected)
}

override suspend fun saveToken(userId: String, token: String) {
tokenCommonDao.saveToken(token = token, userId = userId)
}

override suspend fun getAuthToken(): String? = tokenCommonDao.getTokenByUserId(getUser().id)

override suspend fun useOffline() {
saveUser(WriteopiaUser.disconnectedUser().copy(id = WriteopiaUser.OFFLINE), true)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ interface AuthRepository : UserRepository {
suspend fun saveToken(userId: String, token: String)

suspend fun getAuthToken(): String?

suspend fun useOffline()
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import io.writeopia.common.utils.extensions.toLong
import io.writeopia.sdk.models.user.WriteopiaUser
import io.writeopia.sql.WriteopiaDb

internal class SqlDelightRepository(
internal class SqlDelightAuthRepository(
private val writeopiaDb: WriteopiaDb?
) : AuthRepository {

Expand Down Expand Up @@ -54,4 +54,9 @@ internal class SqlDelightRepository(
writeopiaDb?.tokenEntityQueries
?.insertToken(userId, token)
}

override suspend fun useOffline() {
val user = getUser()
saveUser(user.copy(id = WriteopiaUser.OFFLINE), true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ fun Writeopia_user_entity.toModel(): WriteopiaUser {
id = this.id,
email = this.email,
name = this.name,
tier = Tier.valueOf(this.tier)
tier = Tier.valueOf(this.tier),
company = ""
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package io.writeopia.auth.core.di

import io.writeopia.auth.core.data.AuthApi
import io.writeopia.auth.core.manager.AuthRepository
import io.writeopia.auth.core.manager.SqlDelightRepository
import io.writeopia.auth.core.manager.SqlDelightAuthRepository
import io.writeopia.di.AppConnectionInjection
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
import io.writeopia.sql.WriteopiaDb
Expand All @@ -15,7 +15,7 @@ actual class AuthCoreInjectionNeo(
WriteopiaConnectionInjector.singleton()
) {

actual fun provideAuthRepository(): AuthRepository = SqlDelightRepository(writeopiaDb)
actual fun provideAuthRepository(): AuthRepository = SqlDelightAuthRepository(writeopiaDb)

actual fun provideAuthApi(): AuthApi =
AuthApi(
Expand Down
Loading