@@ -146,9 +146,156 @@ fun getDefaultModuleTemplates(): List<ModuleTemplate> {
146146 name = " Candroid's Module" ,
147147 fileTemplates = listOf (
148148 FileTemplate (
149- fileName = " Repository.kt" ,
150- filePath = " domain/repository" ,
151- fileContent = " interface {NAME}Repository {\n // Define methods here\n }" ,
149+ fileName = " {NAME}Screen.kt" ,
150+ filePath = " ui" ,
151+ fileContent = """
152+ package {FILE_PACKAGE}
153+
154+ import androidx.compose.foundation.layout.Box
155+ import androidx.compose.foundation.layout.fillMaxSize
156+ import androidx.compose.material3.Text
157+ import androidx.compose.runtime.Composable
158+ import androidx.compose.ui.Alignment
159+ import androidx.compose.ui.Modifier
160+ import androidx.compose.ui.Modifier
161+ import androidx.compose.ui.tooling.preview.Preview
162+ import androidx.compose.ui.tooling.preview.PreviewParameter
163+ import androidx.compose.ui.unit.sp
164+ import {PACKAGE}.{NAME}Contract.UiState
165+ import {PACKAGE}.{NAME}Contract.UiEffect
166+ import {PACKAGE}.{NAME}Contract.UiAction
167+ import kotlinx.coroutines.flow.Flow
168+ import kotlinx.coroutines.flow.emptyFlow
169+
170+ @Composable
171+ fun {NAME}Screen(
172+ uiState: UiState,
173+ uiEffect: Flow<UiEffect>,
174+ onAction: (UiAction) -> Unit
175+ ) {
176+ {NAME}Content(
177+ modifier = Modifier.fillMaxSize(),
178+ uiState = uiState,
179+ onAction = onAction,
180+ )
181+ }
182+
183+ @Composable
184+ private fun {NAME}Content(
185+ modifier: Modifier = Modifier,
186+ uiState: UiState,
187+ onAction: (UiAction) -> Unit,
188+ ) {
189+ Box(
190+ modifier = modifier,
191+ contentAlignment = Alignment.Center,
192+ ) {
193+ Text(
194+ text = "{NAME} Content",
195+ fontSize = 24.sp,
196+ )
197+ }
198+ }
199+
200+ @Preview(showBackground = true)
201+ @Composable
202+ fun {NAME}ScreenPreview(
203+ @PreviewParameter({NAME}ScreenPreviewProvider::class) uiState: UiState,
204+ ) {
205+ {NAME}Screen(
206+ uiState = uiState,
207+ uiEffect = emptyFlow(),
208+ onAction = {},
209+ )
210+ }
211+ """ .trimIndent(),
212+ ),
213+ FileTemplate (
214+ fileName = " {NAME}ViewModel.kt" ,
215+ filePath = " ui" ,
216+ fileContent = """
217+ package {FILE_PACKAGE}
218+
219+ import androidx.lifecycle.ViewModel
220+ import {PACKAGE}.{NAME}Contract.UiState
221+ import {PACKAGE}.{NAME}Contract.UiEffect
222+ import {PACKAGE}.{NAME}Contract.UiAction
223+ import dagger.hilt.android.lifecycle.HiltViewModel
224+ import kotlinx.coroutines.channels.Channel
225+ import kotlinx.coroutines.flow.Flow
226+ import kotlinx.coroutines.flow.MutableStateFlow
227+ import kotlinx.coroutines.flow.StateFlow
228+ import kotlinx.coroutines.flow.asStateFlow
229+ import kotlinx.coroutines.flow.receiveAsFlow
230+ import kotlinx.coroutines.flow.update
231+ import javax.inject.Inject
232+
233+ @HiltViewModel
234+ class {NAME}ViewModel @Inject constructor() : ViewModel() {
235+
236+ private val _uiState = MutableStateFlow(UiState())
237+ val uiState: StateFlow<UiState> = _uiState.asStateFlow()
238+
239+ private val _uiEffect by lazy { Channel<UiEffect>() }
240+ val uiEffect: Flow<UiEffect> by lazy { _uiEffect.receiveAsFlow() }
241+
242+ fun onAction(uiAction: UiAction) {
243+ }
244+
245+ private fun updateUiState(block: UiState.() -> UiState) {
246+ _uiState.update(block)
247+ }
248+
249+ private suspend fun emitUiEffect(uiEffect: UiEffect) {
250+ _uiEffect.send(uiEffect)
251+ }
252+ }
253+ """ .trimIndent(),
254+ ),
255+ FileTemplate (
256+ fileName = " {NAME}Contract.kt" ,
257+ filePath = " ui" ,
258+ fileContent = """
259+ package {FILE_PACKAGE}
260+
261+ object {NAME}Contract {
262+ data class UiState(
263+ val isLoading: Boolean = false,
264+ val list: List<String> = emptyList(),
265+ )
266+
267+ sealed interface UiAction
268+
269+ sealed interface UiEffect
270+ }
271+ """ .trimIndent(),
272+ ),
273+ FileTemplate (
274+ fileName = " {NAME}ComponentKey.kt" ,
275+ filePath = " ui" ,
276+ fileContent = """
277+ package {FILE_PACKAGE}
278+
279+ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
280+
281+ class {NAME}ScreenPreviewProvider : PreviewParameterProvider<{NAME}Contract.UiState> {
282+ override val values: Sequence<{NAME}Contract.UiState>
283+ get() = sequenceOf(
284+ {NAME}Contract.UiState(
285+ isLoading = true,
286+ list = emptyList(),
287+ ),
288+ {NAME}Contract.UiState(
289+ isLoading = false,
290+ list = emptyList(),
291+ ),
292+ {NAME}Contract.UiState(
293+ isLoading = false,
294+ list = listOf("Item 1", "Item 2", "Item 3")
295+ ),
296+ )
297+ }
298+ """ .trimIndent(),
152299 ),
153300 ),
154301 isDefault = true ,
0 commit comments