Skip to content

Commit 245ec63

Browse files
Free draw (#583)
* Sketch of free draw * Update EditorKmpInjector.kt * Fixing colors * ios building * Kotlin bump * Saving draw after leaving free canvas * Fixing edition of images * UI clean * Moving button * start with the right color * Fixing drawer * Code clean * Update DrawingPreviewDrawer.kt * Allowing default interactions with DrawingPreviewDrawer
1 parent b1585f5 commit 245ec63

File tree

149 files changed

+5017
-4490
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

149 files changed

+5017
-4490
lines changed

application/common_flows/wide_screen_common/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ kotlin {
6363
implementation(project(":application:features:account"))
6464
implementation(project(":application:features:search"))
6565
implementation(project(":application:features:documents_graph"))
66+
implementation(project(":application:features:drawing"))
6667

6768
implementation(libs.ktor.client.logging)
6869
implementation(libs.ktor.client.core)
@@ -73,7 +74,6 @@ kotlin {
7374
implementation(compose.material3)
7475
implementation(libs.material.icons.core)
7576

76-
7777
implementation(libs.compose.navigation)
7878
}
7979
}
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<baseline version="1.0">
3-
<file name="build.gradle.kts">
4-
<error line="76" column="1" source="standard:no-consecutive-blank-lines" />
5-
</file>
63
</baseline>

application/common_flows/wide_screen_common/src/commonMain/kotlin/io/writeopia/notes/desktop/components/DesktopApp.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import io.writeopia.common.utils.Destinations
3434
import io.writeopia.common.utils.NotesNavigation
3535
import io.writeopia.common.utils.NotesNavigationType
3636
import io.writeopia.documents.graph.di.DocumentsGraphInjection
37+
import io.writeopia.drawing.di.DrawingInjection
3738
import io.writeopia.editor.di.EditorKmpInjector
3839
import io.writeopia.features.search.di.KmpSearchInjection
3940
import io.writeopia.features.search.ui.SearchDialog
@@ -95,6 +96,8 @@ fun DesktopApp(
9596
SideMenuKmpInjector()
9697
}
9798

99+
val drawingInjection = remember { DrawingInjection() }
100+
98101
val documentsGraphInjection =
99102
DocumentsGraphInjection(repositoryInjection = RepositoryInjector.singleton())
100103

@@ -193,7 +196,15 @@ fun DesktopApp(
193196
sideMenuKmpInjector = sideMenuInjector,
194197
documentsGraphInjection = documentsGraphInjection,
195198
editorInjector = editorInjector,
199+
drawingInjection = drawingInjection,
196200
selectColorTheme = selectColorTheme,
201+
onDrawingSaved = { documentId, storyStepId, drawingData ->
202+
editorInjector.addDrawingToDocument(
203+
documentId,
204+
storyStepId,
205+
drawingData
206+
)
207+
},
197208
navigationBar = {},
198209
navController = navigationController
199210
) {}

application/composeApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ kotlin {
6363
implementation(project(":application:features:search"))
6464
implementation(project(":application:features:global_shell"))
6565
implementation(project(":application:features:auth"))
66+
implementation(project(":application:features:drawing"))
6667

6768
implementation(libs.room.runtime)
6869

application/composeApp/src/commonMain/kotlin/io/writeopia/mobile/AppMobile.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.writeopia.common.utils.configuration.LocalPlatform
2020
import io.writeopia.common.utils.configuration.PlatformType
2121
import io.writeopia.common.utils.keyboard.KeyboardCommands
2222
import io.writeopia.common.utils.keyboard.isMultiSelectionTrigger
23+
import io.writeopia.drawing.di.DrawingInjection
2324
import io.writeopia.editor.di.EditorKmpInjector
2425
import io.writeopia.features.search.di.SearchInjection
2526
import io.writeopia.model.ColorThemeOption
@@ -249,6 +250,8 @@ fun AppMobile(
249250
landspaceModileFn()
250251
}
251252
} else {
253+
val drawingInjection = DrawingInjection()
254+
252255
CompositionLocalProvider(LocalPlatform provides PlatformType.MOBILE_PORTRAIT) {
253256
PortraitMobile(
254257
startDestination = Destinations.START_APP.id,
@@ -258,6 +261,10 @@ fun AppMobile(
258261
notesMenuInjection = notesMenuInjection,
259262
editorInjector = editorInjector,
260263
navigationViewModel = navigationViewModel,
264+
drawingInjection = drawingInjection,
265+
onDrawingSaved = { documentId, storyStepId, drawingData ->
266+
editorInjector.addDrawingToDocument(documentId, storyStepId, drawingData)
267+
}
261268
) {
262269
startScreen(navController, colorThemeState)
263270

application/composeApp/src/commonMain/kotlin/io/writeopia/mobile/PortraitMobile.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ import androidx.navigation.NavOptionsBuilder
1919
import androidx.navigation.compose.currentBackStackEntryAsState
2020
import io.writeopia.common.utils.NotesNavigation
2121
import io.writeopia.common.utils.icons.WrIcons
22+
import io.writeopia.drawing.di.DrawingInjection
2223
import io.writeopia.editor.di.TextEditorInjector
2324
import io.writeopia.features.search.di.SearchInjection
2425
import io.writeopia.model.isDarkTheme
2526
import io.writeopia.navigation.NavItemName
2627
import io.writeopia.navigation.Navigation
2728
import io.writeopia.navigation.NavigationViewModel
29+
import io.writeopia.sdk.models.drawing.DrawingData
2830
import io.writeopia.navigation.notes.navigateToNoteMenu
2931
import io.writeopia.navigation.notifications.navigateToNotifications
3032
import io.writeopia.navigation.search.navigateToSearch
@@ -41,6 +43,8 @@ fun PortraitMobile(
4143
notesMenuInjection: NotesMenuInjection,
4244
editorInjector: TextEditorInjector,
4345
navigationViewModel: NavigationViewModel,
46+
drawingInjection: DrawingInjection? = null,
47+
onDrawingSaved: (String, String, DrawingData) -> Unit = { _, _, _ -> },
4448
modifier: Modifier = Modifier,
4549
builder: NavGraphBuilder.() -> Unit
4650
) {
@@ -54,7 +58,9 @@ fun PortraitMobile(
5458
notesMenuInjection = notesMenuInjection,
5559
navController = navController,
5660
editorInjector = editorInjector,
61+
drawingInjection = drawingInjection,
5762
selectColorTheme = uiConfigViewModel::changeColorTheme,
63+
onDrawingSaved = onDrawingSaved,
5864
searchInjection = searchInjector,
5965
navigationBar = {
6066
NavigationBar(
Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,3 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<baseline version="1.0">
3-
<file name="src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt">
4-
<error line="22" column="82" source="standard:function-expression-body" />
5-
<error line="42" column="33" source="standard:function-expression-body" />
6-
<error line="56" column="85" source="standard:function-expression-body" />
7-
<error line="75" column="67" source="standard:function-expression-body" />
8-
</file>
9-
<file name="src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt">
10-
<error line="55" column="84" source="standard:function-expression-body" />
11-
</file>
12-
<file name="src/commonMain/kotlin/io/writeopia/auth/core/utils/UserExtensions.kt">
13-
<error line="7" column="52" source="standard:function-expression-body" />
14-
</file>
15-
<file name="src/webMain/kotlin/io/writeopia/auth/core/token/AppBearerTokenHandler.web.kt">
16-
<error line="9" column="1" source="standard:no-consecutive-blank-lines" />
17-
</file>
183
</baseline>

application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt

Lines changed: 39 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -19,68 +19,60 @@ import io.writeopia.sdk.serialization.data.auth.RegisterRequest
1919
import io.writeopia.sdk.serialization.data.auth.ResetPasswordRequest
2020

2121
class AuthApi(private val client: HttpClient, private val baseUrl: String) {
22-
suspend fun login(email: String, password: String): ResultData<AuthResponse> {
23-
return try {
24-
val response = client.post("$baseUrl/api/login") {
25-
contentType(ContentType.Application.Json)
26-
setBody(LoginRequest(email, password))
27-
}.body<AuthResponse>()
22+
suspend fun login(email: String, password: String): ResultData<AuthResponse> = try {
23+
val response = client.post("$baseUrl/api/login") {
24+
contentType(ContentType.Application.Json)
25+
setBody(LoginRequest(email, password))
26+
}.body<AuthResponse>()
2827

29-
ResultData.Complete(response)
30-
} catch (e: Exception) {
31-
println("login error: ${e.message}")
32-
e.printStackTrace()
33-
ResultData.Error(e)
34-
}
28+
ResultData.Complete(response)
29+
} catch (e: Exception) {
30+
println("login error: ${e.message}")
31+
e.printStackTrace()
32+
ResultData.Error(e)
3533
}
3634

3735
suspend fun register(
3836
name: String,
3937
email: String,
4038
workspaceName: String,
4139
password: String
42-
): ResultData<AuthResponse> {
43-
return try {
44-
val response = client.post("$baseUrl/api/register") {
45-
contentType(ContentType.Application.Json)
46-
setBody(RegisterRequest(name, email, workspaceName, password))
47-
}.body<AuthResponse>()
40+
): ResultData<AuthResponse> = try {
41+
val response = client.post("$baseUrl/api/register") {
42+
contentType(ContentType.Application.Json)
43+
setBody(RegisterRequest(name, email, workspaceName, password))
44+
}.body<AuthResponse>()
4845

49-
ResultData.Complete(response)
50-
} catch (e: Exception) {
51-
e.printStackTrace()
52-
ResultData.Error(e)
53-
}
46+
ResultData.Complete(response)
47+
} catch (e: Exception) {
48+
e.printStackTrace()
49+
ResultData.Error(e)
5450
}
5551

56-
suspend fun resetPassword(newPassword: String, token: String): ResultData<Unit> {
57-
return try {
58-
val response = client.put("$baseUrl/api/password/reset") {
59-
contentType(ContentType.Application.Json)
60-
setBody(ResetPasswordRequest(newPassword))
61-
header(HttpHeaders.Authorization, "Bearer $token")
62-
}
52+
suspend fun resetPassword(newPassword: String, token: String): ResultData<Unit> = try {
53+
val response = client.put("$baseUrl/api/password/reset") {
54+
contentType(ContentType.Application.Json)
55+
setBody(ResetPasswordRequest(newPassword))
56+
header(HttpHeaders.Authorization, "Bearer $token")
57+
}
6358

64-
if (response.status.isSuccess()) {
65-
ResultData.Complete(Unit)
66-
} else {
67-
ResultData.Error()
68-
}
69-
} catch (e: Exception) {
70-
e.printStackTrace()
71-
ResultData.Error(e)
59+
if (response.status.isSuccess()) {
60+
ResultData.Complete(Unit)
61+
} else {
62+
ResultData.Error()
7263
}
64+
} catch (e: Exception) {
65+
e.printStackTrace()
66+
ResultData.Error(e)
7367
}
7468

75-
suspend fun deleteAccount(token: String): ResultData<Boolean> {
76-
return try {
77-
val response = client.delete("$baseUrl/api/account") {
78-
header(HttpHeaders.Authorization, "Bearer $token")
79-
}.body<DeleteAccountResponse>()
69+
suspend fun deleteAccount(token: String): ResultData<Boolean> = try {
70+
val response = client.delete("$baseUrl/api/account") {
71+
header(HttpHeaders.Authorization, "Bearer $token")
72+
}.body<DeleteAccountResponse>()
8073

81-
ResultData.Complete(response.deleted)
82-
} catch (e: Exception) {
83-
ResultData.Error(e)
84-
}
74+
ResultData.Complete(response.deleted)
75+
} catch (e: Exception) {
76+
ResultData.Error(e)
8577
}
8678
}

application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,19 @@ class WorkspaceApi(private val client: HttpClient, private val baseUrl: String)
5252
}
5353
}
5454

55-
suspend fun getAvailableWorkspaces(token: String): ResultData<List<Workspace>> {
56-
return try {
57-
val response = client.get("$baseUrl/api/workspace/user") {
58-
header(HttpHeaders.Authorization, "Bearer $token")
59-
}.body<List<WorkspaceApi>>()
55+
suspend fun getAvailableWorkspaces(token: String): ResultData<List<Workspace>> = try {
56+
val response = client.get("$baseUrl/api/workspace/user") {
57+
header(HttpHeaders.Authorization, "Bearer $token")
58+
}.body<List<WorkspaceApi>>()
6059

61-
val now = Clock.System.now()
60+
val now = Clock.System.now()
6261

63-
ResultData.Complete(
64-
response.map { workspaceApi -> workspaceApi.toModel(now) }
65-
)
66-
} catch (e: Exception) {
67-
e.printStackTrace()
68-
ResultData.Error(e)
69-
}
62+
ResultData.Complete(
63+
response.map { workspaceApi -> workspaceApi.toModel(now) }
64+
)
65+
} catch (e: Exception) {
66+
e.printStackTrace()
67+
ResultData.Error(e)
7068
}
7169

7270
suspend fun getUsersOfWorkspace(

application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/utils/UserExtensions.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import io.writeopia.app.sql.Writeopia_user_entity
44
import io.writeopia.sdk.models.user.Tier
55
import io.writeopia.sdk.models.user.WriteopiaUser
66

7-
fun Writeopia_user_entity.toModel(): WriteopiaUser {
8-
return WriteopiaUser(
9-
id = this.id,
10-
email = this.email,
11-
name = this.name,
12-
tier = Tier.valueOf(this.tier),
13-
)
14-
}
7+
fun Writeopia_user_entity.toModel(): WriteopiaUser = WriteopiaUser(
8+
id = this.id,
9+
email = this.email,
10+
name = this.name,
11+
tier = Tier.valueOf(this.tier),
12+
)

0 commit comments

Comments
 (0)