profile.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <div>
  3. <div class="container">
  4. <div class="py-8 px-4">
  5. <div v-if="currentUser === null">
  6. <ButtonPrimary
  7. :label="$t('auth.login')"
  8. @click.native="showLogin = true"
  9. />
  10. </div>
  11. <div v-else class="space-y-4">
  12. <div class="flex px-4 items-center">
  13. <img
  14. v-if="currentUser.photoURL"
  15. :src="currentUser.photoURL"
  16. class="rounded-full h-16 w-16"
  17. />
  18. <SmartIcon v-else name="user" class="svg-icons" />
  19. <div class="ml-4">
  20. <label class="heading">
  21. {{ currentUser.displayName || $t("state.nothing_found") }}
  22. </label>
  23. <p class="flex text-secondaryLight items-center">
  24. {{ currentUser.email || $t("state.nothing_found") }}
  25. <SmartIcon
  26. v-if="currentUser.emailVerified"
  27. name="verified"
  28. class="ml-2 text-green-500 svg-icons"
  29. />
  30. </p>
  31. </div>
  32. </div>
  33. <SmartTabs styles="sticky bg-primary z-10 top-0">
  34. <SmartTab
  35. :id="'sync'"
  36. :label="$t('settings.account')"
  37. :selected="true"
  38. >
  39. <section class="p-4">
  40. <h4 class="font-semibold text-secondaryDark">
  41. {{ $t("settings.sync") }}
  42. </h4>
  43. <div class="mt-1 text-secondaryLight">
  44. {{ $t("settings.sync_description") }}
  45. </div>
  46. <div class="space-y-4 py-4">
  47. <div class="flex items-center">
  48. <SmartToggle
  49. :on="SYNC_COLLECTIONS"
  50. @change="
  51. toggleSettings('syncCollections', !SYNC_COLLECTIONS)
  52. "
  53. >
  54. {{ $t("settings.sync_collections") }}
  55. </SmartToggle>
  56. </div>
  57. <div class="flex items-center">
  58. <SmartToggle
  59. :on="SYNC_ENVIRONMENTS"
  60. @change="
  61. toggleSettings('syncEnvironments', !SYNC_ENVIRONMENTS)
  62. "
  63. >
  64. {{ $t("settings.sync_environments") }}
  65. </SmartToggle>
  66. </div>
  67. <div class="flex items-center">
  68. <SmartToggle
  69. :on="SYNC_HISTORY"
  70. @change="toggleSettings('syncHistory', !SYNC_HISTORY)"
  71. >
  72. {{ $t("settings.sync_history") }}
  73. </SmartToggle>
  74. </div>
  75. </div>
  76. </section>
  77. </SmartTab>
  78. <SmartTab
  79. v-if="currentBackendUser && currentBackendUser.eaInvited"
  80. :id="'teams'"
  81. :label="$t('team.title')"
  82. >
  83. <AppSection label="teams">
  84. <Teams />
  85. </AppSection>
  86. </SmartTab>
  87. </SmartTabs>
  88. </div>
  89. </div>
  90. <FirebaseLogin :show="showLogin" @hide-modal="showLogin = false" />
  91. </div>
  92. </div>
  93. </template>
  94. <script lang="ts">
  95. import { defineComponent } from "@nuxtjs/composition-api"
  96. import { currentUserInfo$ } from "~/helpers/teams/BackendUserInfo"
  97. import { currentUser$ } from "~/helpers/fb/auth"
  98. import { useReadonlyStream } from "~/helpers/utils/composables"
  99. import { applySetting, SettingsType, useSetting } from "~/newstore/settings"
  100. import { KeysMatching } from "~/types/ts-utils"
  101. export default defineComponent({
  102. setup() {
  103. return {
  104. SYNC_COLLECTIONS: useSetting("syncCollections"),
  105. SYNC_ENVIRONMENTS: useSetting("syncEnvironments"),
  106. SYNC_HISTORY: useSetting("syncHistory"),
  107. currentUser: useReadonlyStream(currentUser$, currentUser$.value),
  108. currentBackendUser: useReadonlyStream(
  109. currentUserInfo$,
  110. currentUserInfo$.value
  111. ),
  112. }
  113. },
  114. data() {
  115. return {
  116. showLogin: false,
  117. }
  118. },
  119. head() {
  120. return {
  121. title: `${this.$t("navigation.profile")} • Hoppscotch`,
  122. }
  123. },
  124. methods: {
  125. applySetting<K extends keyof SettingsType>(key: K, value: SettingsType[K]) {
  126. applySetting(key, value)
  127. },
  128. toggleSettings<K extends KeysMatching<SettingsType, boolean>>(
  129. name: K,
  130. value: SettingsType[K]
  131. ) {
  132. this.applySetting(name, value)
  133. },
  134. },
  135. })
  136. </script>