Skip to content

Commit d7f5011

Browse files
feat: enhance Home screen with BottomAppBar and FloatingActionButton for improved navigation and link management (#74)
1 parent 51d37c4 commit d7f5011

File tree

3 files changed

+206
-234
lines changed

3 files changed

+206
-234
lines changed

app/src/main/java/com/yogeshpaliyal/deepr/ui/screens/home/Home.kt

Lines changed: 70 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ import androidx.compose.foundation.layout.padding
1717
import androidx.compose.foundation.layout.size
1818
import androidx.compose.foundation.lazy.LazyColumn
1919
import androidx.compose.foundation.lazy.items
20+
import androidx.compose.material3.BottomAppBar
2021
import androidx.compose.material3.ContainedLoadingIndicator
2122
import androidx.compose.material3.ExperimentalMaterial3Api
2223
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
24+
import androidx.compose.material3.FloatingActionButton
2325
import androidx.compose.material3.Icon
2426
import androidx.compose.material3.IconButton
2527
import androidx.compose.material3.MaterialTheme
@@ -46,7 +48,6 @@ import com.journeyapps.barcodescanner.ScanOptions
4648
import com.yogeshpaliyal.deepr.Deepr
4749
import com.yogeshpaliyal.deepr.DeeprQueries
4850
import com.yogeshpaliyal.deepr.ui.components.CreateShortcutDialog
49-
import com.yogeshpaliyal.deepr.ui.components.EditDeeplinkDialog
5051
import com.yogeshpaliyal.deepr.ui.components.QrCodeDialog
5152
import com.yogeshpaliyal.deepr.ui.screens.Settings
5253
import com.yogeshpaliyal.deepr.util.QRScanner
@@ -55,6 +56,7 @@ import com.yogeshpaliyal.deepr.util.openDeeplink
5556
import com.yogeshpaliyal.deepr.viewmodel.AccountViewModel
5657
import compose.icons.TablerIcons
5758
import compose.icons.tablericons.Link
59+
import compose.icons.tablericons.Plus
5860
import compose.icons.tablericons.Qrcode
5961
import compose.icons.tablericons.Search
6062
import compose.icons.tablericons.Settings
@@ -93,7 +95,7 @@ fun HomeScreen(
9395
Toast.makeText(context, "No Data found", Toast.LENGTH_SHORT).show()
9496
} else {
9597
if (isValidDeeplink(result.contents)) {
96-
saveDialogInfo = SaveDialogInfo(result.contents, false)
98+
saveDialogInfo = SaveDialogInfo(Deepr(0, result.contents, "", "", 0), false)
9799
} else {
98100
Toast.makeText(context, "Invalid deeplink", Toast.LENGTH_SHORT).show()
99101
}
@@ -104,7 +106,7 @@ fun HomeScreen(
104106
LaunchedEffect(sharedText) {
105107
if (!sharedText.isNullOrBlank() && saveDialogInfo == null) {
106108
if (isValidDeeplink(sharedText)) {
107-
saveDialogInfo = SaveDialogInfo(sharedText, false)
109+
saveDialogInfo = SaveDialogInfo(Deepr(0, sharedText, "", "", 0), false)
108110
} else {
109111
Toast
110112
.makeText(context, "Invalid deeplink from shared content", Toast.LENGTH_SHORT)
@@ -142,25 +144,9 @@ fun HomeScreen(
142144
contentDescription = if (isSearchActive) "Close search" else "Search",
143145
)
144146
}
145-
IconButton(onClick = {
146-
qrScanner.launch(ScanOptions())
147-
}) {
148-
Icon(
149-
TablerIcons.Qrcode,
150-
contentDescription = "QR Scanner",
151-
)
152-
}
153147
FilterMenu(onSortOrderChange = {
154148
viewModel.setSortOrder(it)
155149
})
156-
IconButton(onClick = {
157-
backStack.add(Settings)
158-
}) {
159-
Icon(
160-
TablerIcons.Settings,
161-
contentDescription = "Settings",
162-
)
163-
}
164150
},
165151
)
166152
AnimatedVisibility(visible = isSearchActive) {
@@ -180,16 +166,43 @@ fun HomeScreen(
180166
}
181167
},
182168
bottomBar = {
183-
HomeBottomContent(
184-
hazeState = hazeState,
185-
saveDialogInfo = saveDialogInfo,
186-
deeprQueries = deeprQueries,
187-
) {
188-
saveDialogInfo = it
189-
if (it == null) {
190-
resetSharedText()
191-
}
192-
}
169+
BottomAppBar(
170+
modifier =
171+
Modifier.hazeEffect(
172+
state = hazeState,
173+
style = HazeMaterials.ultraThin(),
174+
),
175+
containerColor = Color.Transparent,
176+
actions = {
177+
IconButton(onClick = {
178+
qrScanner.launch(ScanOptions())
179+
}) {
180+
Icon(
181+
TablerIcons.Qrcode,
182+
contentDescription = "QR Scanner",
183+
)
184+
}
185+
IconButton(onClick = {
186+
// Settings action
187+
backStack.add(Settings)
188+
}) {
189+
Icon(
190+
TablerIcons.Settings,
191+
contentDescription = "Settings",
192+
)
193+
}
194+
},
195+
floatingActionButton = {
196+
FloatingActionButton(onClick = {
197+
saveDialogInfo = SaveDialogInfo(createDeeprObject(), true)
198+
}) {
199+
Icon(
200+
TablerIcons.Plus,
201+
contentDescription = "Add Link",
202+
)
203+
}
204+
},
205+
)
193206
},
194207
) { contentPadding ->
195208
Column(
@@ -200,9 +213,34 @@ fun HomeScreen(
200213
Content(
201214
hazeState = hazeState,
202215
contentPaddingValues = contentPadding,
203-
deeprQueries = deeprQueries,
216+
editDeepr = {
217+
saveDialogInfo = SaveDialogInfo(it, false)
218+
},
204219
)
205220
}
221+
222+
saveDialogInfo?.let {
223+
HomeBottomContent(
224+
deeprQueries = deeprQueries,
225+
saveDialogInfo = it,
226+
) { updatedValue ->
227+
if (updatedValue != null) {
228+
if (updatedValue.deepr.id == 0L) {
229+
// New Account
230+
viewModel.insertAccount(updatedValue.deepr.link, updatedValue.deepr.name, updatedValue.executeAfterSave)
231+
} else {
232+
// Edit
233+
viewModel.updateDeeplink(updatedValue.deepr.id, updatedValue.deepr.link, updatedValue.deepr.name)
234+
}
235+
236+
if (updatedValue.executeAfterSave) {
237+
openDeeplink(context, updatedValue.deepr.link)
238+
}
239+
}
240+
saveDialogInfo = null
241+
resetSharedText()
242+
}
243+
}
206244
}
207245
}
208246

@@ -211,9 +249,9 @@ fun HomeScreen(
211249
fun Content(
212250
hazeState: HazeState,
213251
contentPaddingValues: PaddingValues,
214-
deeprQueries: DeeprQueries,
215252
modifier: Modifier = Modifier,
216253
viewModel: AccountViewModel = koinViewModel(),
254+
editDeepr: (Deepr) -> Unit = {},
217255
) {
218256
val accounts by viewModel.accounts.collectAsStateWithLifecycle()
219257

@@ -230,7 +268,6 @@ fun Content(
230268
val context = LocalContext.current
231269
var showShortcutDialog by remember { mutableStateOf<Deepr?>(null) }
232270
var showQrCodeDialog by remember { mutableStateOf<Deepr?>(null) }
233-
var showEditDialog by remember { mutableStateOf<Deepr?>(null) }
234271

235272
showShortcutDialog?.let { deepr ->
236273
CreateShortcutDialog(
@@ -245,24 +282,6 @@ fun Content(
245282
}
246283
}
247284

248-
showEditDialog?.let { deepr ->
249-
EditDeeplinkDialog(
250-
deepr = deepr,
251-
onDismiss = { showEditDialog = null },
252-
onSave = { newLink, newName ->
253-
if (deeprQueries.getDeeprByLink(newLink).executeAsOneOrNull() != null) {
254-
Toast
255-
.makeText(context, "Deeplink already exists", Toast.LENGTH_SHORT)
256-
.show()
257-
} else {
258-
viewModel.updateDeeplink(deepr.id, newLink, newName)
259-
Toast.makeText(context, "Deeplink updated", Toast.LENGTH_SHORT).show()
260-
}
261-
showEditDialog = null
262-
},
263-
)
264-
}
265-
266285
DeeprList(
267286
modifier =
268287
Modifier
@@ -282,9 +301,7 @@ fun Content(
282301
onShortcutClick = {
283302
showShortcutDialog = it
284303
},
285-
onEditClick = {
286-
showEditDialog = it
287-
},
304+
onEditClick = editDeepr,
288305
onItemLongClick = {
289306
val clipboard =
290307
context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

0 commit comments

Comments
 (0)