| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <v-container class="narrow-container"> | 
					
						
							|  |  |  |     <BasePageTitle divider> | 
					
						
							|  |  |  |       <template #header> | 
					
						
							|  |  |  |         <v-img max-height="200px" max-width="200px" :src="require('~/static/svgs/manage-api-tokens.svg')"></v-img> | 
					
						
							|  |  |  |       </template> | 
					
						
							| 
									
										
										
										
											2023-10-26 15:26:14 +02:00
										 |  |  |       <template #title> {{ $tc("settings.token.api-tokens") }} </template> | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |       {{ $tc('settings.token.you-have-token-count', user.tokens.length) }} | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |     </BasePageTitle> | 
					
						
							|  |  |  |     <section class="d-flex justify-center"> | 
					
						
							|  |  |  |       <v-card class="mt-4" width="500px"> | 
					
						
							|  |  |  |         <v-card-text> | 
					
						
							|  |  |  |           <v-form ref="domNewTokenForm" @submit.prevent> | 
					
						
							|  |  |  |             <v-text-field v-model="name" :label="$t('settings.token.token-name')"> </v-text-field> | 
					
						
							|  |  |  |           </v-form> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           <template v-if="createdToken != ''"> | 
					
						
							|  |  |  |             <v-textarea | 
					
						
							|  |  |  |               v-model="createdToken" | 
					
						
							|  |  |  |               class="mb-0 pb-0" | 
					
						
							|  |  |  |               :label="$t('settings.token.api-token')" | 
					
						
							|  |  |  |               readonly | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |               rows="3" | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |             > | 
					
						
							|  |  |  |             </v-textarea> | 
					
						
							|  |  |  |             <v-subheader class="text-center"> | 
					
						
							|  |  |  |               {{ | 
					
						
							|  |  |  |                 $t( | 
					
						
							|  |  |  |                   "settings.token.copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again" | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |               }} | 
					
						
							|  |  |  |             </v-subheader> | 
					
						
							|  |  |  |           </template> | 
					
						
							|  |  |  |         </v-card-text> | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |         <v-card-actions> | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |           <BaseButton v-if="createdToken" cancel @click="resetCreate()"> {{ $t('general.close') }} </BaseButton> | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |           <v-spacer></v-spacer> | 
					
						
							|  |  |  |           <AppButtonCopy v-if="createdToken" :icon="false" color="info" :copy-text="createdToken"> </AppButtonCopy> | 
					
						
							|  |  |  |           <BaseButton v-else key="generate-button" :disabled="name == ''" @click="createToken(name)"> | 
					
						
							| 
									
										
										
										
											2023-03-21 20:45:27 +01:00
										 |  |  |             {{ $t('settings.token.generate') }} | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |           </BaseButton> | 
					
						
							|  |  |  |         </v-card-actions> | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |       </v-card> | 
					
						
							|  |  |  |     </section> | 
					
						
							| 
									
										
										
										
											2023-10-26 15:26:14 +02:00
										 |  |  |     <BaseCardSectionTitle class="mt-10" :title="$tc('settings.token.active-tokens')"> </BaseCardSectionTitle> | 
					
						
							| 
									
										
										
										
											2023-10-07 21:36:47 +02:00
										 |  |  |     <section class="d-flex flex-column"> | 
					
						
							|  |  |  |       <div v-for="(token, index) in $auth.user.tokens" :key="index"> | 
					
						
							|  |  |  |         <v-card outlined class="mb-2"> | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |           <v-list-item> | 
					
						
							|  |  |  |             <v-list-item-content> | 
					
						
							|  |  |  |               <v-list-item-title> | 
					
						
							|  |  |  |                 {{ token.name }} | 
					
						
							|  |  |  |               </v-list-item-title> | 
					
						
							| 
									
										
										
										
											2024-07-08 16:12:20 -05:00
										 |  |  |               <v-list-item-subtitle> {{ $t('general.created-on-date', [$d(new Date(token.createdAt))]) }} </v-list-item-subtitle> | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |             </v-list-item-content> | 
					
						
							|  |  |  |             <v-list-item-action> | 
					
						
							|  |  |  |               <BaseButton delete small @click="deleteToken(token.id)"></BaseButton> | 
					
						
							|  |  |  |             </v-list-item-action> | 
					
						
							|  |  |  |           </v-list-item> | 
					
						
							|  |  |  |         </v-card> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </section> | 
					
						
							|  |  |  |   </v-container> | 
					
						
							|  |  |  | </template> | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  | <script lang="ts"> | 
					
						
							|  |  |  | import { computed, defineComponent, useContext, ref } from "@nuxtjs/composition-api"; | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  | import { useUserApi } from "~/composables/api"; | 
					
						
							| 
									
										
										
										
											2022-01-09 07:15:23 +01:00
										 |  |  | import { VForm } from "~/types/vuetify"; | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default defineComponent({ | 
					
						
							| 
									
										
										
										
											2024-01-31 15:25:21 +00:00
										 |  |  |   middleware: ["auth", "advanced-only"], | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |   setup() { | 
					
						
							|  |  |  |     const nuxtContext = useContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const user = computed(() => { | 
					
						
							|  |  |  |       return nuxtContext.$auth.user; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-06 11:28:47 -08:00
										 |  |  |     const api = useUserApi(); | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const domNewTokenForm = ref<VForm | null>(null); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const createdToken = ref(""); | 
					
						
							|  |  |  |     const name = ref(""); | 
					
						
							|  |  |  |     const loading = ref(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function resetCreate() { | 
					
						
							|  |  |  |       createdToken.value = ""; | 
					
						
							|  |  |  |       loading.value = false; | 
					
						
							|  |  |  |       name.value = ""; | 
					
						
							|  |  |  |       nuxtContext.$auth.fetchUser(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async function createToken(name: string) { | 
					
						
							|  |  |  |       if (loading.value) { | 
					
						
							|  |  |  |         resetCreate(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       loading.value = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (domNewTokenForm?.value?.validate()) { | 
					
						
							|  |  |  |         console.log("Created"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const { data } = await api.users.createAPIToken({ name }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (data) { | 
					
						
							|  |  |  |         createdToken.value = data.token; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     async function deleteToken(id: number) { | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |       const { data } = await api.users.deleteAPIToken(id); | 
					
						
							|  |  |  |       nuxtContext.$auth.fetchUser(); | 
					
						
							|  |  |  |       return data; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-30 15:46:44 -08:00
										 |  |  |     return { createToken, deleteToken, createdToken, loading, name, user, resetCreate }; | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-10-07 09:39:47 -08:00
										 |  |  |   head() { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       title: this.$t("settings.token.api-tokens") as string, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-09-04 20:24:32 -08:00
										 |  |  | }); | 
					
						
							|  |  |  | </script> |