lock-screen-modal.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <script setup lang="ts">
  2. import { computed, reactive } from 'vue';
  3. import { useVbenModal } from '@vben-core/popup-ui';
  4. import {
  5. VbenAvatar,
  6. VbenButton,
  7. VbenInputPassword,
  8. } from '@vben-core/shadcn-ui';
  9. interface Props {
  10. avatar?: string;
  11. text?: string;
  12. }
  13. interface LockAndRegisterParams {
  14. lockScreenPassword: string;
  15. }
  16. interface RegisterEmits {
  17. submit: [LockAndRegisterParams];
  18. }
  19. defineOptions({
  20. name: 'LockScreenModal',
  21. });
  22. withDefaults(defineProps<Props>(), {
  23. avatar: '',
  24. text: '',
  25. });
  26. const emit = defineEmits<{
  27. submit: RegisterEmits['submit'];
  28. }>();
  29. const formState = reactive({
  30. lockScreenPassword: '',
  31. submitted: false,
  32. });
  33. const [Modal] = useVbenModal({
  34. onConfirm() {
  35. handleSubmit();
  36. },
  37. onOpenChange(isOpen) {
  38. if (isOpen) {
  39. // reset value reopen
  40. formState.submitted = false;
  41. formState.lockScreenPassword = '';
  42. }
  43. },
  44. });
  45. const passwordStatus = computed(() => {
  46. return formState.submitted && !formState.lockScreenPassword
  47. ? 'error'
  48. : 'default';
  49. });
  50. function handleSubmit() {
  51. formState.submitted = true;
  52. if (passwordStatus.value !== 'default') {
  53. return;
  54. }
  55. emit('submit', {
  56. lockScreenPassword: formState.lockScreenPassword,
  57. });
  58. }
  59. </script>
  60. <template>
  61. <Modal
  62. :footer="false"
  63. :fullscreen-button="false"
  64. :title="$t('widgets.lockScreen.title')"
  65. >
  66. <div
  67. class="mb-10 flex w-full flex-col items-center px-10"
  68. @keydown.enter.prevent="handleSubmit"
  69. >
  70. <div class="w-full">
  71. <div class="ml-2 flex w-full flex-col items-center">
  72. <VbenAvatar
  73. :src="avatar"
  74. class="size-20"
  75. dot-class="bottom-0 right-1 border-2 size-4 bg-green-500"
  76. />
  77. <div class="text-foreground my-6 flex items-center font-medium">
  78. {{ text }}
  79. </div>
  80. </div>
  81. <VbenInputPassword
  82. v-model="formState.lockScreenPassword"
  83. :error-tip="$t('widgets.lockScreen.placeholder')"
  84. :label="$t('widgets.lockScreen.password')"
  85. :placeholder="$t('widgets.lockScreen.placeholder')"
  86. :status="passwordStatus"
  87. name="password"
  88. required
  89. type="password"
  90. />
  91. <VbenButton class="w-full" @click="handleSubmit">
  92. {{ $t('widgets.lockScreen.screenButton') }}
  93. </VbenButton>
  94. </div>
  95. </div>
  96. </Modal>
  97. </template>