From df2f3677a0515315a369ae9574097a3efeba3e2f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 2 Oct 2023 14:01:44 +0200 Subject: [PATCH] Remove binary file `file_templates.zip`, and commit its content in the folder `files`. --- tools/templates/file_templates.zip | Bin 6484 -> 0 bytes .../files/IntelliJ IDEA Global Settings | 0 ...mplate Module Feature Build Gradle API.kts | 11 ++++ ...plate Module Feature Build Gradle Impl.kts | 36 +++++++++++ ...Template Module Feature Entry Point API.kt | 21 +++++++ ...te Module Feature Entry Point Flow Impl.kt | 30 +++++++++ .../Template Module Feature Node Flow Impl.kt | 57 ++++++++++++++++++ .../Template Presentation Classes .kt | 22 +++++++ ...mplate Presentation Classes .kt.child.0.kt | 15 +++++ ...mplate Presentation Classes .kt.child.1.kt | 29 +++++++++ ...mplate Presentation Classes .kt.child.2.kt | 42 +++++++++++++ ...mplate Presentation Classes .kt.child.3.kt | 7 +++ ...mplate Presentation Classes .kt.child.4.kt | 6 ++ .../files/options/file.template.settings.xml | 18 ++++++ 14 files changed, 294 insertions(+) delete mode 100644 tools/templates/file_templates.zip create mode 100644 tools/templates/files/IntelliJ IDEA Global Settings create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Build Gradle API.kts create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Build Gradle Impl.kts create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Entry Point API.kt create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Entry Point Flow Impl.kt create mode 100644 tools/templates/files/fileTemplates/Template Module Feature Node Flow Impl.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.0.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.1.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.2.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.3.kt create mode 100644 tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.4.kt create mode 100644 tools/templates/files/options/file.template.settings.xml diff --git a/tools/templates/file_templates.zip b/tools/templates/file_templates.zip deleted file mode 100644 index 7352ac307453a53d853bbdb03c3c643c6ed0939d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6484 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 + + return object : ${FEATURE_NAME}EntryPoint.NodeBuilder { + + override fun callback(callback: ${FEATURE_NAME}EntryPoint.Callback): ${FEATURE_NAME}EntryPoint.NodeBuilder { + plugins += callback + return this + } + + override fun build(): Node { + return parentNode.createNode<${FEATURE_NAME}FlowNode>(buildContext, plugins) + } + } + } +} diff --git a/tools/templates/files/fileTemplates/Template Module Feature Node Flow Impl.kt b/tools/templates/files/fileTemplates/Template Module Feature Node Flow Impl.kt new file mode 100644 index 0000000000..299239f142 --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Module Feature Node Flow Impl.kt @@ -0,0 +1,57 @@ +package io.element.android.features.${MODULE_NAME}.impl + +import android.os.Parcelable +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.composable.Children +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.push +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.architecture.BackstackNode +import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler +import io.element.android.libraries.architecture.createNode +import io.element.android.libraries.di.AppScope +import kotlinx.parcelize.Parcelize + +// CHANGE THE SCOPE +@ContributesNode(AppScope::class) +class ${FEATURE_NAME}FlowNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, +) : BackstackNode<${FEATURE_NAME}FlowNode.NavTarget>( + backstack = BackStack( + initialElement = NavTarget.Root, + savedStateMap = buildContext.savedStateMap, + ), + buildContext = buildContext, + plugins = plugins, +) { + + sealed interface NavTarget : Parcelable { + @Parcelize + object Root : NavTarget + } + + override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + return when (navTarget) { + NavTarget.Root -> { + //Give your root node or completely delete this FlowNode if you have only one node. + createNode<>(buildContext) + } + } + } + + @Composable + override fun View(modifier: Modifier) { + Children( + navModel = backstack, + modifier = modifier, + transitionHandler = rememberDefaultTransitionHandler(), + ) + } +} \ No newline at end of file diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt new file mode 100644 index 0000000000..a095220199 --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt @@ -0,0 +1,22 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +import androidx.compose.runtime.Composable +import io.element.android.libraries.architecture.Presenter +import javax.inject.Inject + +class ${NAME}Presenter @Inject constructor() : Presenter<${NAME}State> { + + @Composable + override fun present(): ${NAME}State { + + fun handleEvents(event: ${NAME}Events) { + when (event) { + ${NAME}Events.MyEvent -> Unit + } + } + + return ${NAME}State( + eventSink = ::handleEvents + ) + } +} \ No newline at end of file diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.0.kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.0.kt new file mode 100644 index 0000000000..26372fc970 --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.0.kt @@ -0,0 +1,15 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +open class ${NAME}StateProvider : PreviewParameterProvider<${NAME}State> { + override val values: Sequence<${NAME}State> + get() = sequenceOf( + a${NAME}State(), + // Add other states here + ) +} + +fun a${NAME}State() = ${NAME}State( + eventSink = {} +) diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.1.kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.1.kt new file mode 100644 index 0000000000..9c3f7842b9 --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.1.kt @@ -0,0 +1,29 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.di.AppScope + +// CHANGE THE SCOPE +@ContributesNode(AppScope::class) +class ${NAME}Node @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val presenter: ${NAME}Presenter, +) : Node(buildContext, plugins = plugins) { + + @Composable + override fun View(modifier: Modifier) { + val state = presenter.present() + ${NAME}View( + state = state, + modifier = modifier + ) + } +} \ No newline at end of file diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.2.kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.2.kt new file mode 100644 index 0000000000..b19f3e728e --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.2.kt @@ -0,0 +1,42 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +import androidx.compose.foundation.layout.Box +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Text + +@Composable +fun ${NAME}View( + state: ${NAME}State, + modifier: Modifier = Modifier, +) { + Box(modifier, contentAlignment = Alignment.Center) { + Text( + "${NAME} feature view", + color = MaterialTheme.colorScheme.primary, + ) + } +} + +@Preview +@Composable +fun ${NAME}ViewLightPreview(@PreviewParameter(${NAME}StateProvider::class) state: ${NAME}State) = + ElementPreviewLight { ContentToPreview(state) } + +@Preview +@Composable +fun ${NAME}ViewDarkPreview(@PreviewParameter(${NAME}StateProvider::class) state: ${NAME}State) = + ElementPreviewDark { ContentToPreview(state) } + +@Composable +private fun ContentToPreview(state: ${NAME}State) { + ${NAME}View( + state = state, + ) +} \ No newline at end of file diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.3.kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.3.kt new file mode 100644 index 0000000000..3fcdd7f219 --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.3.kt @@ -0,0 +1,7 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +// TODO add your ui models. Remove the eventSink if you don't have events. +// Do not use default value, so no member get forgotten in the presenters. +data class ${NAME}State( + val eventSink: (${NAME}Events) -> Unit +) diff --git a/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.4.kt b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.4.kt new file mode 100644 index 0000000000..6ce6d089ee --- /dev/null +++ b/tools/templates/files/fileTemplates/Template Presentation Classes .kt.child.4.kt @@ -0,0 +1,6 @@ +#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end + +// TODO Add your events or remove the file completely if no events +sealed interface ${NAME}Events { + object MyEvent: ${NAME}Events +} diff --git a/tools/templates/files/options/file.template.settings.xml b/tools/templates/files/options/file.template.settings.xml new file mode 100644 index 0000000000..d577903b92 --- /dev/null +++ b/tools/templates/files/options/file.template.settings.xml @@ -0,0 +1,18 @@ + + + +