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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ compose-build/

# Firebase local cache
.firebase/
/firebase-debug.log
4 changes: 2 additions & 2 deletions apps/mobile/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ val gitCode: Int by lazy {
}

// Construct the version name using a major.minor.patch pattern with the git code.
val majorMinorPatchVersionName = "0.5.0.$gitCode"
val majorMinorPatchVersionName = "0.6.0.$gitCode"

android {
// Set the application namespace.
Expand Down Expand Up @@ -176,7 +176,7 @@ dependencies {
// Timber for logging.
implementation(libs.timber)
// Project modules.
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))
implementation(project(":libraries:architecture:presentation:mobile"))
implementation(project(":libraries:authentication:domain"))
implementation(project(":libraries:smokes:domain"))
Expand Down
18 changes: 11 additions & 7 deletions apps/wear/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.google.common.base.Charsets
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.io.ByteArrayOutputStream
import java.io.FileInputStream
import java.io.InputStreamReader
Expand Down Expand Up @@ -82,19 +83,22 @@ android {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = Java.JVM_TARGET
freeCompilerArgs = listOf(
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-opt-in=kotlin.RequiresOptIn",
)
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.fromTarget(Java.JVM_TARGET))
freeCompilerArgs.addAll(
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-opt-in=kotlin.RequiresOptIn",
)
}
}

buildFeatures {
compose = true
buildConfig = true
}

@Suppress("UnstableApiUsage")
composeOptions {
kotlinCompilerExtensionVersion = Java.KOTLIN_COMPILER_EXTENSION_VERSION
}
Expand Down Expand Up @@ -140,7 +144,7 @@ dependencies {
implementation(libs.bundles.compose)
implementation(libs.hilt)
implementation(libs.timber)
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))
implementation(libs.androidx.tiles)
implementation(libs.horologist.composables)
implementation(libs.horologist.tiles)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class MainTileService : SuspendingTileService() {
ResourceBuilders.ImageResource.Builder()
.setAndroidResourceByResId(
ResourceBuilders.AndroidImageResourceByResId.Builder()
.setResourceId(com.feragusper.smokeanalytics.libraries.design.R.drawable.ic_cigarette)
.setResourceId(com.feragusper.smokeanalytics.libraries.design.mobile.R.drawable.ic_cigarette)
.build()
).build()
)
Expand Down
6 changes: 3 additions & 3 deletions apps/web/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import com.codingfeline.buildkonfig.compiler.FieldSpec.Type.STRING
import org.gradle.api.tasks.Sync

plugins {
kotlin("multiplatform")
Expand Down Expand Up @@ -77,9 +76,10 @@ kotlin {
implementation(project(":libraries:smokes:data:web"))
implementation(project(":libraries:authentication:domain"))
implementation(project(":libraries:authentication:data:web"))
implementation(project(":libraries:design:web"))

implementation("dev.gitlive:firebase-auth:1.13.0")
implementation("dev.gitlive:firebase-app:1.13.0")
implementation(libs.gitlive.firebase.auth)
implementation(libs.firebase.app)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ import com.feragusper.smokeanalytics.libraries.smokes.domain.usecase.DeleteSmoke
import com.feragusper.smokeanalytics.libraries.smokes.domain.usecase.EditSmokeUseCase
import com.feragusper.smokeanalytics.libraries.smokes.domain.usecase.FetchSmokeStatsUseCase
import com.feragusper.smokeanalytics.libraries.smokes.domain.usecase.FetchSmokesUseCase
import dev.gitlive.firebase.Firebase
import dev.gitlive.firebase.auth.auth
import dev.gitlive.firebase.auth.externals.GoogleAuthProvider
import dev.gitlive.firebase.auth.externals.getAuth
import dev.gitlive.firebase.auth.externals.signInWithPopup
import kotlinx.coroutines.await

Expand Down Expand Up @@ -73,9 +72,8 @@ data class WebAppGraph(
)

val signInWithGoogleWeb: suspend () -> Unit = {
val auth = Firebase.auth
val provider = GoogleAuthProvider()
signInWithPopup(auth.js, provider).await()
signInWithPopup(getAuth(), provider).await()
}

return WebAppGraph(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,98 +1,38 @@
package com.feragusper.smokeanalytics

import androidx.compose.runtime.Composable
import org.jetbrains.compose.web.css.DisplayStyle
import org.jetbrains.compose.web.css.FlexDirection
import org.jetbrains.compose.web.css.JustifyContent
import org.jetbrains.compose.web.css.cursor
import org.jetbrains.compose.web.css.display
import org.jetbrains.compose.web.css.flexDirection
import org.jetbrains.compose.web.css.flexGrow
import org.jetbrains.compose.web.css.fontWeight
import org.jetbrains.compose.web.css.height
import org.jetbrains.compose.web.css.justifyContent
import org.jetbrains.compose.web.css.padding
import org.jetbrains.compose.web.css.px
import org.jetbrains.compose.web.css.vh
import com.feragusper.smokeanalytics.libraries.design.SmokeWebStyles
import org.jetbrains.compose.web.dom.Div
import org.jetbrains.compose.web.dom.Text

/**
* The scaffold for the web application.
*
* @param tab The current tab.
* @param onTabSelected The callback for when a tab is selected.
* @param content The content to display.
*/
@Composable
fun WebScaffold(
tab: WebTab,
onTabSelected: (WebTab) -> Unit,
content: @Composable () -> Unit,
) {
Div({
style {
display(DisplayStyle.Flex)
flexDirection(FlexDirection.Column)
height(100.vh)
}
}) {
Div({
style {
flexGrow(1)
padding(16.px)
}
}) {
content()
}

WebBottomNav(
selected = tab,
onSelected = onTabSelected,
)
}
}
Div(attrs = { classes(SmokeWebStyles.shell) }) {
Div(attrs = { classes(SmokeWebStyles.sidebar) }) {
Div(attrs = { classes(SmokeWebStyles.sidebarTitle) }) { Text("Smoke Analytics") }

@Composable
private fun WebBottomNav(
selected: WebTab,
onSelected: (WebTab) -> Unit,
) {
Div({
style {
display(DisplayStyle.Flex)
justifyContent(JustifyContent.SpaceAround)
padding(12.px)
property(
"border-top",
"1px solid lightgray"
)
}
}) {
WebTab.entries.forEach { tab ->
WebNavItem(
label = tab.label(),
selected = tab == selected,
onClick = { onSelected(tab) },
)
Div(attrs = { classes(SmokeWebStyles.navList) }) {
WebTab.entries.forEach { t ->
Div(
attrs = {
classes(SmokeWebStyles.navItem)
if (t == tab) classes(SmokeWebStyles.navItemActive)
onClick { onTabSelected(t) }
}
) { Text(t.label()) }
}
}
}
}
}

@Composable
private fun WebNavItem(
label: String,
selected: Boolean,
onClick: () -> Unit,
) {
Div({
onClick { onClick() }
style {
cursor("pointer")
fontWeight(if (selected) "bold" else "normal")
Div(attrs = { classes(SmokeWebStyles.main) }) {
Div(attrs = { classes(SmokeWebStyles.mainInner) }) {
content()
}
}
}) {
Text(label)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.feragusper.smokeanalytics

import com.feragusper.smokeanalytics.libraries.design.SmokeWebTheme
import org.jetbrains.compose.web.renderComposable

/**
* The main entry point for the web application.
*/
fun main() {
FirebaseWebInit.init()
val graph = WebAppGraph.create()

renderComposable(rootElementId = "root") {
AppRoot(graph)
SmokeWebTheme {
AppRoot(graph)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dependencies {
implementation(project(":libraries:authentication:domain"))

// Design system for consistent theming and UI components
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))

// AndroidX and Compose libraries
implementation(libs.bundles.androidx.base)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.feragusper.smokeanalytics.features.authentication.presentation.R
Expand Down Expand Up @@ -72,29 +71,30 @@ data class AuthenticationViewState(
) {
Text(text = stringResource(id = R.string.authentication_sign_in_to_continue))
val scope = rememberCoroutineScope()
val context = LocalContext.current
val message =
stringResource(com.feragusper.smokeanalytics.libraries.design.mobile.R.string.error_general)
GoogleSignInComponent(
modifier = Modifier.padding(top = 16.dp),
onSignInSuccess = { intent(AuthenticationIntent.FetchUser) },
onSignInError = {
scope.launch {
snackbarHostState.showSnackbar(
context.getString(com.feragusper.smokeanalytics.libraries.design.R.string.error_general)
message
)
}
},
)
}

// Display error messages as snackbars
val context = LocalContext.current
val message = stringResource(
R.string.error_generic
)
LaunchedEffect(error) {
error?.let {
when (it) {
AuthenticationResult.Error.Generic -> snackbarHostState.showSnackbar(
context.getString(
R.string.error_generic
)
message
)
}
}
Expand Down
2 changes: 1 addition & 1 deletion features/chatbot/presentation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ dependencies {
implementation(project(":libraries:architecture:presentation:mobile"))

// Design system for consistent theming and UI components
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))

implementation(project(":features:chatbot:domain"))
implementation(project(":features:chatbot:data"))
Expand Down
2 changes: 1 addition & 1 deletion features/devtools/presentation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ android {
dependencies {
// Architecture and presentation layers
implementation(project(":libraries:architecture:presentation:mobile"))
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))

// Authentication modules for user session and sign-in management
implementation(project(":libraries:authentication:presentation:mobile"))
Expand Down
2 changes: 1 addition & 1 deletion features/history/presentation/mobile/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ dependencies {
implementation(project(":libraries:authentication:domain"))

// Design system for consistent theming and UI components
implementation(project(":libraries:design"))
implementation(project(":libraries:design:mobile"))

// Smoke feature dependencies
implementation(project(":libraries:smokes:data:mobile"))
Expand Down
1 change: 1 addition & 0 deletions features/history/presentation/web/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ kotlin {
implementation(compose.runtime)
implementation(compose.html.core)

implementation(project(":libraries:design:web"))
implementation(project(":libraries:architecture:domain"))
implementation(project(":libraries:smokes:domain"))
implementation(project(":libraries:authentication:domain"))
Expand Down
Loading