Skip to content

Commit a8493f6

Browse files
committed
refactor: Refactor Home and Splash Screen with new design system
1 parent 79218bf commit a8493f6

File tree

19 files changed

+569
-17
lines changed

19 files changed

+569
-17
lines changed

sample/android/src/main/AndroidManifest.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
<uses-permission android:name="android.permission.INTERNET" />
55

66
<application
7-
android:name=".AppApplication"
8-
android:allowBackup="false"
7+
android:name=".YChatApplication"
8+
android:allowBackup="true"
9+
android:label="@string/app_name"
910
android:supportsRtl="true"
1011
android:theme="@style/AppTheme">
1112
<activity
12-
android:name="co.yml.ychat.android.MainActivity"
13+
android:name="co.yml.ychat.android.presentation.MainActivity"
1314
android:exported="true"
1415
android:windowSoftInputMode="adjustResize">
1516
<intent-filter>
@@ -18,4 +19,4 @@
1819
</intent-filter>
1920
</activity>
2021
</application>
21-
</manifest>
22+
</manifest>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package co.yml.ychat.android
2+
3+
import android.app.Application
4+
import co.yml.ychat.android.di.appModule
5+
import org.koin.android.ext.koin.androidContext
6+
import org.koin.android.ext.koin.androidLogger
7+
import org.koin.core.context.startKoin
8+
9+
class YChatApplication : Application() {
10+
11+
override fun onCreate() {
12+
super.onCreate()
13+
startKoin {
14+
androidLogger()
15+
androidContext(this@YChatApplication)
16+
modules(appModule)
17+
}
18+
}
19+
}

sample/android/src/main/java/co/yml/ychat/android/di/AppModule.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package co.yml.ychat.android.di
22

33
import co.yml.ychat.YChat
44
import co.yml.ychat.android.BuildConfig
5-
import co.yml.ychat.android.MainViewModel
5+
import co.yml.ychat.android.presentation.chatcompletions.viewmodel.ChatCompletionsViewModel
6+
import co.yml.ychat.android.presentation.home.viewmodel.HomeViewModel
67
import org.koin.androidx.viewmodel.dsl.viewModelOf
78
import org.koin.dsl.module
89

910
val appModule = module {
1011
single { YChat.create(BuildConfig.API_KEY) }
11-
viewModelOf(::MainViewModel)
12+
viewModelOf(::HomeViewModel)
13+
viewModelOf(::ChatCompletionsViewModel)
1214
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package co.yml.ychat.android.presentation
2+
3+
import android.os.Bundle
4+
import androidx.activity.ComponentActivity
5+
import androidx.activity.compose.setContent
6+
import androidx.compose.runtime.Composable
7+
import androidx.navigation.compose.NavHost
8+
import androidx.navigation.compose.composable
9+
import androidx.navigation.compose.rememberNavController
10+
import co.yml.ychat.android.presentation.home.screen.HomeScreen
11+
import co.yml.ychat.android.presentation.splash.SplashScreen
12+
import co.yml.ychat.android.router.MainRouter
13+
import co.yml.ychat.android.ui.theme.YChatTheme
14+
15+
class MainActivity : ComponentActivity() {
16+
17+
override fun onCreate(savedInstanceState: Bundle?) {
18+
super.onCreate(savedInstanceState)
19+
setContent { YChatTheme { Navigation() } }
20+
}
21+
22+
@Composable
23+
private fun Navigation() {
24+
val navController = rememberNavController()
25+
NavHost(
26+
navController = navController,
27+
startDestination = MainRouter.SPLASH.name
28+
) {
29+
composable(MainRouter.SPLASH.name) {
30+
SplashScreen(navController)
31+
}
32+
composable(MainRouter.HOME.name) {
33+
HomeScreen()
34+
}
35+
}
36+
}
37+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package co.yml.ychat.android.presentation.audio
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.fillMaxHeight
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.tooling.preview.Preview
10+
import co.yml.ychat.android.presentation.models.ModelsScreen
11+
import co.yml.ychat.android.ui.components.feedback.Feedback
12+
import co.yml.ychat.android.ui.components.feedback.model.FeedbackState
13+
import co.yml.ychat.android.ui.theme.YChatTheme
14+
15+
@Composable
16+
internal fun AudioScreen() {
17+
Column(
18+
modifier = Modifier
19+
.background(YChatTheme.colors.background)
20+
.fillMaxHeight(),
21+
verticalArrangement = Arrangement.Center,
22+
) {
23+
Feedback(feedbackState = FeedbackState.CONSTRUCTION)
24+
}
25+
}
26+
27+
@Preview
28+
@Composable
29+
private fun AudioScreenPreview() {
30+
YChatTheme {
31+
ModelsScreen()
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package co.yml.ychat.android.presentation.completions
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.fillMaxHeight
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.tooling.preview.Preview
10+
import co.yml.ychat.android.presentation.models.ModelsScreen
11+
import co.yml.ychat.android.ui.components.feedback.Feedback
12+
import co.yml.ychat.android.ui.components.feedback.model.FeedbackState
13+
import co.yml.ychat.android.ui.theme.YChatTheme
14+
15+
@Composable
16+
internal fun CompletionsScreen() {
17+
Column(
18+
modifier = Modifier
19+
.background(YChatTheme.colors.background)
20+
.fillMaxHeight(),
21+
verticalArrangement = Arrangement.Center,
22+
) {
23+
Feedback(feedbackState = FeedbackState.CONSTRUCTION)
24+
}
25+
}
26+
27+
@Preview
28+
@Composable
29+
private fun CompletionsScreenPreview() {
30+
YChatTheme {
31+
ModelsScreen()
32+
}
33+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package co.yml.ychat.android.presentation.edits
2+
3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.fillMaxHeight
7+
import androidx.compose.runtime.Composable
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.tooling.preview.Preview
10+
import co.yml.ychat.android.ui.components.feedback.Feedback
11+
import co.yml.ychat.android.ui.components.feedback.model.FeedbackState
12+
import co.yml.ychat.android.ui.theme.YChatTheme
13+
14+
@Composable
15+
internal fun EditsScreen() {
16+
Column(
17+
modifier = Modifier
18+
.background(YChatTheme.colors.background)
19+
.fillMaxHeight(),
20+
verticalArrangement = Arrangement.Center,
21+
) {
22+
Feedback(feedbackState = FeedbackState.CONSTRUCTION)
23+
}
24+
}
25+
26+
@Preview
27+
@Composable
28+
private fun EditsScreenPreview() {
29+
YChatTheme {
30+
EditsScreen()
31+
}
32+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package co.yml.ychat.android.presentation.home.enums
2+
3+
import androidx.annotation.StringRes
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.res.stringResource
6+
import co.yml.ychat.android.R
7+
import co.yml.ychat.android.ui.components.sidemenu.model.MenuItem
8+
import co.yml.ychat.android.ui.theme.Icons
9+
10+
internal enum class HomeMenu(
11+
val id: String,
12+
val icons: Icons,
13+
@StringRes val title: Int,
14+
private val isTopDividerVisible: Boolean,
15+
) {
16+
MODELS(
17+
id = "models",
18+
icons = Icons.Model,
19+
title = R.string.home_models_title,
20+
isTopDividerVisible = false,
21+
),
22+
COMPLETIONS(
23+
id = "completions",
24+
icons = Icons.Text,
25+
title = R.string.home_completions_title,
26+
isTopDividerVisible = false,
27+
),
28+
CHAT_COMPLETIONS(
29+
id = "chat_completions",
30+
icons = Icons.ChatBubbleOutline,
31+
title = R.string.home_chat_completions_title,
32+
isTopDividerVisible = false,
33+
),
34+
EDITS(
35+
id = "edits",
36+
icons = Icons.Edit,
37+
title = R.string.home_chat_edits_title,
38+
isTopDividerVisible = false,
39+
),
40+
IMAGES(
41+
id = "images",
42+
icons = Icons.Image,
43+
title = R.string.home_chat_images_title,
44+
isTopDividerVisible = false,
45+
),
46+
AUDIO(
47+
id = "audio",
48+
icons = Icons.Audio,
49+
title = R.string.home_chat_audio_title,
50+
isTopDividerVisible = false,
51+
),
52+
SETTINGS(
53+
id = "settings",
54+
icons = Icons.Settings,
55+
title = R.string.home_chat_settings_title,
56+
isTopDividerVisible = true,
57+
);
58+
59+
val titleString: String
60+
@Composable get() = stringResource(id = title)
61+
62+
@Composable
63+
fun getMenuItem(): MenuItem {
64+
return MenuItem(id, stringResource(id = title), icons, isTopDividerVisible)
65+
}
66+
67+
companion object {
68+
69+
fun findById(id: String): HomeMenu {
70+
return values().first { it.id == id }
71+
}
72+
73+
@Composable
74+
fun getMenuItems(): List<MenuItem> {
75+
return values().map { it.getMenuItem() }
76+
}
77+
}
78+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package co.yml.ychat.android.presentation.home.screen
2+
3+
import androidx.compose.material.Scaffold
4+
import androidx.compose.material.ScaffoldState
5+
import androidx.compose.material.rememberScaffoldState
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.rememberCoroutineScope
8+
import androidx.compose.ui.tooling.preview.Preview
9+
import co.yml.ychat.android.presentation.audio.AudioScreen
10+
import co.yml.ychat.android.presentation.chatcompletions.screen.ChatCompletionsScreen
11+
import co.yml.ychat.android.presentation.completions.CompletionsScreen
12+
import co.yml.ychat.android.presentation.edits.EditsScreen
13+
import co.yml.ychat.android.presentation.home.enums.HomeMenu
14+
import co.yml.ychat.android.presentation.home.viewmodel.HomeViewModel
15+
import co.yml.ychat.android.presentation.images.ImagesScreen
16+
import co.yml.ychat.android.presentation.models.ModelsScreen
17+
import co.yml.ychat.android.presentation.settings.SettingsScreen
18+
import co.yml.ychat.android.ui.components.sidemenu.SideMenu
19+
import co.yml.ychat.android.ui.components.toolbar.Toolbar
20+
import co.yml.ychat.android.ui.theme.Icons
21+
import co.yml.ychat.android.ui.theme.YChatTheme
22+
import kotlinx.coroutines.launch
23+
import org.koin.androidx.compose.getViewModel
24+
25+
@Composable
26+
internal fun HomeScreen(viewModel: HomeViewModel = getViewModel()) {
27+
val scaffoldState = rememberScaffoldState()
28+
Scaffold(
29+
scaffoldState = scaffoldState,
30+
topBar = { HomeScreenTopBar(scaffoldState, viewModel) },
31+
drawerContent = { HomeScreenSideMenu(scaffoldState, viewModel) },
32+
content = {
33+
when (viewModel.selectedMenuItem.value.id) {
34+
HomeMenu.MODELS.id -> ModelsScreen()
35+
HomeMenu.COMPLETIONS.id -> CompletionsScreen()
36+
HomeMenu.CHAT_COMPLETIONS.id -> ChatCompletionsScreen()
37+
HomeMenu.EDITS.id -> EditsScreen()
38+
HomeMenu.IMAGES.id -> ImagesScreen()
39+
HomeMenu.AUDIO.id -> AudioScreen()
40+
HomeMenu.SETTINGS.id -> SettingsScreen()
41+
}
42+
}
43+
)
44+
}
45+
46+
@Composable
47+
private fun HomeScreenTopBar(
48+
scaffoldState: ScaffoldState,
49+
viewModel: HomeViewModel,
50+
) {
51+
val scope = rememberCoroutineScope()
52+
Toolbar(
53+
title = viewModel.selectedMenuItem.value.titleString,
54+
startIcon = Icons.Menu,
55+
onStartIconClick = { scope.launch { scaffoldState.drawerState.open() } }
56+
)
57+
}
58+
59+
@Composable
60+
private fun HomeScreenSideMenu(
61+
scaffoldState: ScaffoldState,
62+
viewModel: HomeViewModel,
63+
) {
64+
val scope = rememberCoroutineScope()
65+
val items = HomeMenu.getMenuItems()
66+
val selectedItem = viewModel.selectedMenuItem.value.getMenuItem()
67+
SideMenu(items = items, selectedItem = selectedItem) { clickedItem ->
68+
viewModel.setSelectedMenuItem(clickedItem)
69+
scope.launch { scaffoldState.drawerState.close() }
70+
}
71+
}
72+
73+
@Preview
74+
@Composable
75+
private fun HomeScreenPreview() {
76+
YChatTheme(true) {
77+
HomeScreen(HomeViewModel())
78+
}
79+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package co.yml.ychat.android.presentation.home.viewmodel
2+
3+
import androidx.compose.runtime.mutableStateOf
4+
import androidx.lifecycle.ViewModel
5+
import co.yml.ychat.android.presentation.home.enums.HomeMenu
6+
import co.yml.ychat.android.ui.components.sidemenu.model.MenuItem
7+
8+
internal class HomeViewModel : ViewModel() {
9+
10+
val selectedMenuItem = mutableStateOf(HomeMenu.MODELS)
11+
12+
fun setSelectedMenuItem(menuItem: MenuItem) {
13+
selectedMenuItem.value = HomeMenu.findById(menuItem.id)
14+
}
15+
}

0 commit comments

Comments
 (0)