Skip to content

EpSignIn

INFO

This component does not use props, events, slots.

Component Code

vue
<template>
  <div class="ep-sign-in">
    <ep-container
      :style="{
        '--ep-container-width': '400px',
        '--ep-container-height': '475px',
        '--ep-container-bg-color': 'var(--interface-surface)',
        '--ep-container-content-padding': '0 3rem 6rem 3rem',
      }"
      style="box-shadow: var(--drop-shadow);"
    >
      <template #header>
        <div class="ep-sign-in__header">
          <epicenter-logo style="width: 50px;" />
        </div>
      </template>
      <div class="ep-sign-in__form">
        <ep-loading-state
          v-if="state === 'loading'"
          background-color="var(--interface-surface)"
          :messages="loadingMessages"
        />
        <div
          v-if="state === 'message'"
          class="ep-sign-in__form__message copy-block"
        >
          mail icon
          <p class="text-align--center">
            Please check your email for password<br> reset instructions
          </p>
        </div>
        <form
          v-else
          @submit.prevent="signin"
        >
          <ep-input
            id="email"
            v-model="email"
            type="email"
            size="xlarge"
            placeholder="Email"
            data-1p-ignore
            @clear="email = ''"
          />
          <ep-input
            v-if="state != 'reset'"
            id="password"
            v-model="password"
            type="password"
            size="xlarge"
            placeholder="Password"
            :icon-right="{ name: 'f-eye' }"
            data-1p-ignore
            @clear="password = ''"
          />
          <ep-button
            class="ep-button-var--primary"
            type="submit"
            size="large"
            @click="onButtonClick"
          >
            {{ buttonLabel }}
          </ep-button>
        </form>
      </div>
      <template #footer>
        <div class="ep-sign-in__footer">
          <p
            class="text--link"
            @click="onFooterClick"
          >
            {{ footerText }}
          </p>
        </div>
      </template>
    </ep-container>
  </div>
</template>

<script setup>
  import { computed, ref } from 'vue'

  import EpButton from '../button/EpButton.vue'
  import EpContainer from '../container/EpContainer.vue'
  import EpInput from '../input/EpInput.vue'
  import EpLoadingState from '../loading-state/EpLoadingState.vue'
  import EpicenterLogo from '../logo/EpicenterLogo.vue'

  const email = ref('')
  const password = ref('')
  const state = ref('signin')
  const loadingMessages = ref([
    {
      icon: 'oval',
      message: 'Signing in…'
    }
  ])

  const buttonLabel = computed(() => {
    return state.value === 'signin' ? 'Sign in' : 'Send reset email'
  })

  const footerText = computed(() => {
    switch (state.value) {
      case 'signin':
        return 'Reset your password'
      case 'loading':
        return 'Signing in…'
      case 'message':
        return '< Back to Sign In'
      case 'reset':
        return '< Back to Sign In'
      default:
        return ''
    }
  })

  const signin = () => {
    console.log('signin')
  }

  const onButtonClick = () => {
    if (state.value === 'signin') {
      console.log('signin')
      state.value = 'loading'
      setTimeout(() => {
        state.value = 'signin'
      }, 2000)
    } else {
      console.log('reset')
      state.value = 'message'
    }
  }

  const onFooterClick = () => {
    state.value = state.value === 'signin' ? 'reset' : 'signin'
  }

  // const validateEmail = (email) => {
  //   const emailRegex = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
  //   return emailRegex.test(email)
  // }
</script>

<style lang="scss" scoped>
  .ep-sign-in {
    &__header {
      display: flex;
      justify-content: center;
      align-items: center;
      padding: 6rem;
    }

    &__form {
      display: flex;
      flex-direction: column;

      & > form {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;

        & > * + * {
          margin-top: 2rem;
        }
      }

      &__message {
        display: flex;
        flex-direction: column;
        align-items: center;
      }
    }

    &__footer {
      height: 56px;
      display: flex;
      justify-content: center;
      align-items: center;
      border-top: 1px solid var(--border-color);
      padding: 2rem;
    }
  }
</style>