Skip to content

Commit 261df8d

Browse files
committed
Add UI components and ViewModel templates for new screen structure
1 parent 3c05799 commit 261df8d

1 file changed

Lines changed: 150 additions & 3 deletions

File tree

src/main/kotlin/com/github/cnrture/quickprojectwizard/data/SettingsService.kt

Lines changed: 150 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)