agree.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <main class="user--main">
  3. <div class="join--container">
  4. <div class="join--step--wrap">
  5. <div class="step--txt">
  6. <span class="color--blue">1 / 3</span> 약관 동<span class="color--blue">의</span>
  7. </div>
  8. <div class="step--bar">
  9. <span class="active"></span>
  10. <span></span>
  11. <span></span>
  12. </div>
  13. </div>
  14. <div class="join--step1 mt--22">
  15. <div class="title--wrap">
  16. <h2>약관에 동의해주세요</h2>
  17. </div>
  18. <div class="join--wrap mt--26">
  19. <div class="all--check--wrap">
  20. <label>
  21. <input type="checkbox" v-model="allAgree">
  22. 약관 전체 동의
  23. </label>
  24. </div>
  25. <div class="each--check--wrap mt--20">
  26. <div class="each--wrap">
  27. <label>
  28. <input type="checkbox" v-model="termsAgree">
  29. 이용약관 <span class="color--blue">(필수)</span>
  30. </label>
  31. <button type="button">›</button>
  32. </div>
  33. <div class="each--wrap">
  34. <label>
  35. <input type="checkbox" v-model="privacyAgree">
  36. 개인정보 수집 및 이용 안내 <span class="color--blue">(필수)</span>
  37. </label>
  38. <button type="button">›</button>
  39. </div>
  40. <div class="each--wrap">
  41. <label>
  42. <input type="checkbox" v-model="marketingAgree">
  43. 이벤트 및 SMS 등 수신 <span>(선택)</span>
  44. </label>
  45. <button type="button">›</button>
  46. </div>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. <div class="float--btn--wrap">
  52. <a
  53. href="#"
  54. :class="{ disabled: !canProceed }"
  55. @click.prevent="goNext"
  56. >다음</a>
  57. </div>
  58. <AppAlertModal
  59. v-model="showErrorModal"
  60. icon-type="error"
  61. title="약관 동의 필요"
  62. message="필수 약관에 동의해주세요."
  63. />
  64. </main>
  65. </template>
  66. <script setup>
  67. import { ref, computed } from 'vue'
  68. import { useRouter } from 'vue-router'
  69. import AppAlertModal from '~/components/AppAlertModal.vue'
  70. const router = useRouter()
  71. const termsAgree = ref(false) // 이용약관 (필수)
  72. const privacyAgree = ref(false) // 개인정보 (필수)
  73. const marketingAgree = ref(false) // 이벤트/SMS (선택)
  74. const showErrorModal = ref(false)
  75. // 전체 동의 — 양방향 동기화
  76. const allAgree = computed({
  77. get: () => termsAgree.value && privacyAgree.value && marketingAgree.value,
  78. set: (val) => {
  79. termsAgree.value = val
  80. privacyAgree.value = val
  81. marketingAgree.value = val
  82. }
  83. })
  84. // 필수 2개 체크되면 다음 활성화
  85. const canProceed = computed(() => termsAgree.value && privacyAgree.value)
  86. const goNext = () => {
  87. if (!canProceed.value) {
  88. showErrorModal.value = true
  89. return
  90. }
  91. // 마케팅 동의 여부를 sessionStorage로 전달
  92. sessionStorage.setItem('signup_marketing', marketingAgree.value ? 'Y' : 'N')
  93. router.push('/login/join')
  94. }
  95. </script>