Files
DiceCloud/app/imports/client/ui/user/InviteDialog.vue
2026-01-23 13:40:22 +11:00

105 lines
2.1 KiB
Vue

<template lang="html">
<dialog-base>
<template slot="toolbar">
<v-toolbar-title>
Invite
</v-toolbar-title>
</template>
<div
v-if="invite.invitee"
class="layout column align-center"
>
{{ username || invite.invitee }}
<div>
<v-btn
color="primary"
@click="revokeInvite"
>
Revoke Invite
</v-btn>
</div>
</div>
<div
v-else
class="layout column align-center"
>
<p>This invite is available</p>
<v-fade-transition mode="out-in">
<v-btn
v-if="!inviteLink"
color="primary"
:loading="loading"
:disabled="loading"
@click="getInviteLink"
>
Get Invite Link
</v-btn>
<h3 v-else>
{{ inviteLink }}
</h3>
</v-fade-transition>
</div>
</dialog-base>
</template>
<script lang="js">
import DialogBase from '/imports/client/ui/dialogStack/DialogBase.vue';
import Invites, { getInviteToken, revokeInvite } from '/imports/api/users/Invites';
export default {
components: {
DialogBase,
},
props: {
inviteId: {
type: String,
required: true,
},
},
data() {
return {
inviteToken: '',
error: '',
loading: false,
}
},
meteor: {
invite() {
return Invites.findOne(this.inviteId);
},
username() {
if (!this.invite) return;
let user = Meteor.users.findOne(this.invite.invitee);
return user && user.username;
}
},
computed: {
inviteLink() {
let token = this.inviteToken;
return token && `https://dicecloud.com/invite/${token}`;
},
},
methods: {
getInviteLink() {
this.loading = true;
getInviteToken.call({ inviteId: this.inviteId }, (error, result) => {
this.loading = false;
if (error) {
this.error = error.message || error;
} else {
this.error = '',
this.inviteToken = result;
}
});
},
revokeInvite() {
revokeInvite.call({ inviteId: this.inviteId });
},
},
}
</script>
<style lang="css" scoped>
</style>