Skip to content

Commit 8f9046d

Browse files
committed
refractor edit view model
1 parent f2973fb commit 8f9046d

File tree

4 files changed

+55
-57
lines changed

4 files changed

+55
-57
lines changed

app/src/main/java/io/github/wiiznokes/gitnote/ui/screen/app/EditScreen.kt

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.wiiznokes.gitnote.ui.screen.app
22

3-
import android.util.Log
43
import androidx.compose.foundation.layout.Box
54
import androidx.compose.foundation.layout.Spacer
65
import androidx.compose.foundation.layout.WindowInsets
@@ -14,7 +13,8 @@ import androidx.compose.foundation.text.KeyboardActions
1413
import androidx.compose.material.icons.Icons
1514
import androidx.compose.material.icons.automirrored.filled.ArrowBack
1615
import androidx.compose.material.icons.filled.Done
17-
import androidx.compose.material.icons.filled.Edit
16+
import androidx.compose.material.icons.filled.Lock
17+
import androidx.compose.material.icons.filled.LockOpen
1818
import androidx.compose.material.icons.filled.Save
1919
import androidx.compose.material3.Button
2020
import androidx.compose.material3.ButtonDefaults
@@ -102,7 +102,7 @@ fun EditScreen(
102102
navigationIcon = {
103103
IconButton(
104104
onClick = {
105-
vm.onFinish()
105+
vm.shouldSaveWhenQuitting = false
106106
onFinished()
107107
},
108108
) {
@@ -151,31 +151,35 @@ fun EditScreen(
151151
contentColor = MaterialTheme.colorScheme.onPrimary
152152
),
153153
onClick = {
154-
vm.onValidation(onSuccess = null)
154+
vm.save()
155155
},
156156
enabled = !isReadOnlyModeActive
157157
) {
158158
SimpleIcon(
159159
imageVector = Icons.Default.Save,
160160
)
161161
}
162-
if (isReadOnlyModeActive) {
163-
Spacer(modifier = Modifier.width(10.dp))
164-
IconButton(
165-
colors = IconButtonDefaults.iconButtonColors(
166-
containerColor = MaterialTheme.colorScheme.primary,
167-
contentColor = MaterialTheme.colorScheme.onPrimary
168-
),
169-
onClick = {
170-
vm.viewModelScope.launch {
171-
vm.prefs.isReadOnlyModeActive.update(false)
172-
}
162+
163+
Spacer(modifier = Modifier.width(10.dp))
164+
165+
IconButton(
166+
colors = IconButtonDefaults.iconButtonColors(
167+
containerColor = MaterialTheme.colorScheme.primary,
168+
contentColor = MaterialTheme.colorScheme.onPrimary
169+
),
170+
onClick = {
171+
vm.viewModelScope.launch {
172+
vm.prefs.isReadOnlyModeActive.update(!isReadOnlyModeActive)
173+
}
174+
},
175+
) {
176+
SimpleIcon(
177+
imageVector = if (isReadOnlyModeActive) {
178+
Icons.Default.Lock
179+
} else {
180+
Icons.Default.LockOpen
173181
},
174-
) {
175-
SimpleIcon(
176-
imageVector = Icons.Default.Edit,
177-
)
178-
}
182+
)
179183
}
180184
}
181185
)
@@ -189,8 +193,7 @@ fun EditScreen(
189193
containerColor = MaterialTheme.colorScheme.primary,
190194
shape = RoundedCornerShape(20.dp),
191195
onClick = {
192-
vm.onFinish()
193-
vm.onValidation(onSuccess = onFinished)
196+
vm.save(onSuccess = onFinished)
194197
}
195198
) {
196199
SimpleIcon(
@@ -203,17 +206,15 @@ fun EditScreen(
203206
) { paddingValues ->
204207

205208
if (isReadOnlyModeActive && vm.fileExtension.value is FileExtension.Md) {
206-
Log.d(TAG, vm.content.value.text)
207-
Box {
208-
RichText(
209-
modifier = Modifier
210-
.padding(paddingValues)
211-
.fillMaxSize()
212-
) {
213-
Markdown(vm.content.value.text)
214-
}
209+
RichText(
210+
modifier = Modifier
211+
.padding(paddingValues)
212+
.fillMaxSize()
213+
) {
214+
Markdown(vm.content.value.text)
215215
}
216216

217+
217218
} else {
218219
TextField(
219220
modifier = Modifier
@@ -234,8 +235,7 @@ fun EditScreen(
234235
),
235236
keyboardActions = KeyboardActions(
236237
onDone = {
237-
vm.onFinish()
238-
vm.onValidation(onSuccess = onFinished)
238+
vm.save(onSuccess = onFinished)
239239
}
240240
),
241241
readOnly = isReadOnlyModeActive

app/src/main/java/io/github/wiiznokes/gitnote/ui/viewmodel/EditViewModel.kt

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.lifecycle.ViewModel
1111
import androidx.lifecycle.viewmodel.compose.viewModel
1212
import io.github.wiiznokes.gitnote.MyApp
1313
import io.github.wiiznokes.gitnote.R
14-
import io.github.wiiznokes.gitnote.data.AppPreferences
1514
import io.github.wiiznokes.gitnote.data.room.Note
1615
import io.github.wiiznokes.gitnote.helper.NameValidation
1716
import io.github.wiiznokes.gitnote.helper.UiHelper
@@ -50,7 +49,7 @@ class EditViewModel() : ViewModel() {
5049
lateinit var content: MutableState<TextFieldValue>
5150
lateinit var fileExtension: MutableState<FileExtension>
5251

53-
private var isSaved: Boolean = false
52+
var shouldSaveWhenQuitting: Boolean = true
5453

5554
constructor(editType: EditType, previousNote: Note) : this() {
5655
this.editType = editType
@@ -91,12 +90,13 @@ class EditViewModel() : ViewModel() {
9190
private val uiHelper: UiHelper = MyApp.appModule.uiHelper
9291
val prefs = MyApp.appModule.appPreferences
9392

93+
fun save(onSuccess: () -> Unit = {}) {
9494

95-
fun onFinish() {
96-
isSaved = true
97-
}
98-
99-
fun onValidation(onSuccess: (() -> Unit)?) {
95+
if (isPreviousNoteTheSame()) {
96+
uiHelper.makeToast(uiHelper.getString(R.string.error_note_is_the_same))
97+
onSuccess()
98+
return
99+
}
100100

101101
when (editType) {
102102
EditType.Create -> create(
@@ -106,12 +106,9 @@ class EditViewModel() : ViewModel() {
106106
content = content.value.text,
107107
id = previousNote.id
108108
).onSuccess {
109-
if (onSuccess != null) {
110-
onSuccess()
111-
} else {
112-
editType = EditType.Update
113-
previousNote = it
114-
}
109+
editType = EditType.Update
110+
previousNote = it
111+
onSuccess()
115112
}
116113

117114
EditType.Update -> update(
@@ -121,16 +118,13 @@ class EditViewModel() : ViewModel() {
121118
fileExtension = fileExtension.value,
122119
content = content.value.text,
123120
).onSuccess {
124-
if (onSuccess != null) {
125-
onSuccess()
126-
} else {
127-
previousNote = it
128-
}
121+
previousNote = it
122+
onSuccess()
129123
}
130124
}
131125
}
132126

133-
/** Return early to note block the ui thread.
127+
/** Return early to not block the ui thread.
134128
* This is a best effort to catch problem
135129
*/
136130
private fun update(
@@ -234,15 +228,17 @@ class EditViewModel() : ViewModel() {
234228
return success(note)
235229
}
236230

231+
private fun isPreviousNoteTheSame(): Boolean =
232+
previousNote.nameWithoutExtension() == name.value.text
233+
&& previousNote.content == content.value.text
234+
&& previousNote.fileExtension().text == fileExtension.value.text
235+
237236
override fun onCleared() {
238237

239-
fun isPreviousNoteTheSame(): Boolean =
240-
previousNote.nameWithoutExtension() == name.value.text
241-
&& previousNote.content == content.value.text
242-
&& previousNote.fileExtension().text == fileExtension.value.text
243238

244239

245-
if (isSaved || isPreviousNoteTheSame()) {
240+
241+
if (!shouldSaveWhenQuitting || isPreviousNoteTheSame()) {
246242
writeObj(EDIT_IS_UNSAVED, false)
247243
return
248244
}

app/src/main/res/values-fr/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
<string name="error_clone_repo">Impossible de clone: %1$s</string>
7474
<string name="error_open_repo">Impossible d\'ouvrir le dépôt: %1$s</string>
7575
<string name="error_create_repo">Impossible de créer le dépôt: %1$s</string>
76+
<string name="error_note_is_the_same">Aucune modification</string>
7677
<string name="grid">Grille</string>
7778
<string name="about">À propos</string>
7879
<string name="app_page_choose_method">Choisir la méthode</string>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<string name="error_invalid_name">Name is invalid</string>
6363
<string name="error_invalid_extension">Extension is invalid</string>
6464
<string name="error_folder_already_exist">Folder already exist</string>
65+
<string name="error_note_is_the_same">No modification</string>
6566
<string name="grid">Grid</string>
6667
<string name="about">About</string>
6768
<string name="app_page_choose_method">Choose method</string>

0 commit comments

Comments
 (0)