All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.eygraber.portal.compose.PortalTransitionProvider.kt Maven / Gradle / Ivy

package com.eygraber.portal.compose

import com.eygraber.portal.PortalRendererState

public fun interface PortalTransitionProvider {
  public fun provideTransitions(
    compositionState: PortalRendererState,
    isForBackstack: Boolean
  ): PortalTransition

  public companion object {
    public val None: PortalTransitionProvider = PortalTransitionProvider { _, _ ->
      PortalTransition.None
    }

    public val Default: PortalTransitionProvider =
      PortalTransitionProvider { compositionState, isForBackstack ->
        when(compositionState) {
          PortalRendererState.Added, PortalRendererState.Removed -> when {
            isForBackstack -> PortalTransition(
              enter = PortalTransition.defaultEnterForBackstack,
              exit = PortalTransition.defaultExitForBackstack
            )

            else -> PortalTransition(
              enter = PortalTransition.defaultEnter,
              exit = PortalTransition.defaultExit
            )
          }

          PortalRendererState.Attached, PortalRendererState.Detached -> when {
            isForBackstack -> PortalTransition(
              enter = PortalTransition.defaultAttachForBackstack,
              exit = PortalTransition.defaultDetachForBackstack
            )

            else -> PortalTransition(
              enter = PortalTransition.defaultAttach,
              exit = PortalTransition.defaultDetach
            )
          }
        }
      }

    public fun provideTransitions(
      state: PortalRendererState,
      isForBackstack: Boolean
    ): PortalTransition = Default.provideTransitions(state, isForBackstack)
  }
}

public interface SimplePortalTransitionProvider : PortalTransitionProvider {
  public fun enterExitTransition(): PortalTransition

  public fun attachDetachTransition(): PortalTransition = enterExitTransition()

  public fun popEnterExitTransition(): PortalTransition = enterExitTransition()

  public fun popAttachDetachTransition(): PortalTransition = popEnterExitTransition()

  override fun provideTransitions(
    compositionState: PortalRendererState,
    isForBackstack: Boolean
  ): PortalTransition = when(compositionState) {
    PortalRendererState.Added, PortalRendererState.Removed -> when {
      isForBackstack -> popEnterExitTransition()

      else -> enterExitTransition()
    }

    PortalRendererState.Attached, PortalRendererState.Detached -> when {
      isForBackstack -> popAttachDetachTransition()

      else -> attachDetachTransition()
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy