159 lines
4.5 KiB
Vue
159 lines
4.5 KiB
Vue
<script>
|
|
import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
|
|
import { isEmpty } from 'lodash';
|
|
import { mapState, mapMutations, mapActions } from 'vuex';
|
|
import { retrieveAlert } from '~/jira_connect/subscriptions/utils';
|
|
import AccessorUtilities from '~/lib/utils/accessor';
|
|
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
|
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '../constants';
|
|
import { SET_ALERT } from '../store/mutation_types';
|
|
import SignInPage from '../pages/sign_in/sign_in_page.vue';
|
|
import SubscriptionsPage from '../pages/subscriptions_page.vue';
|
|
import UserLink from './user_link.vue';
|
|
import CompatibilityAlert from './compatibility_alert.vue';
|
|
import BrowserSupportAlert from './browser_support_alert.vue';
|
|
|
|
export default {
|
|
name: 'JiraConnectApp',
|
|
components: {
|
|
GlAlert,
|
|
GlLink,
|
|
GlSprintf,
|
|
UserLink,
|
|
CompatibilityAlert,
|
|
BrowserSupportAlert,
|
|
SignInPage,
|
|
SubscriptionsPage,
|
|
},
|
|
mixins: [glFeatureFlagMixin()],
|
|
inject: {
|
|
usersPath: {
|
|
default: '',
|
|
},
|
|
subscriptionsPath: {
|
|
default: '',
|
|
},
|
|
},
|
|
computed: {
|
|
...mapState(['currentUser']),
|
|
...mapState(['alert', 'subscriptions']),
|
|
shouldShowAlert() {
|
|
return Boolean(this.alert?.message);
|
|
},
|
|
hasSubscriptions() {
|
|
return !isEmpty(this.subscriptions);
|
|
},
|
|
userSignedIn() {
|
|
if (this.isOauthEnabled) {
|
|
return Boolean(this.currentUser);
|
|
}
|
|
|
|
return Boolean(!this.usersPath);
|
|
},
|
|
isOauthEnabled() {
|
|
return this.glFeatures.jiraConnectOauth;
|
|
},
|
|
/**
|
|
* Returns false if the GitLab for Jira app doesn't support the user's browser.
|
|
* Any web API that the GitLab for Jira app depends on should be checked here.
|
|
*/
|
|
isBrowserSupported() {
|
|
return !this.isOauthEnabled || AccessorUtilities.canUseCrypto();
|
|
},
|
|
gitlabUrl() {
|
|
return gon.gitlab_url;
|
|
},
|
|
gitlabLogo() {
|
|
return gon.gitlab_logo;
|
|
},
|
|
},
|
|
created() {
|
|
this.setInitialAlert();
|
|
},
|
|
mounted() {
|
|
this.fetchSubscriptionsOauth();
|
|
},
|
|
methods: {
|
|
...mapMutations({
|
|
setAlert: SET_ALERT,
|
|
}),
|
|
...mapActions(['fetchSubscriptions']),
|
|
/**
|
|
* Fetch subscriptions from the REST API,
|
|
* if the jiraConnectOauth flag is enabled.
|
|
*/
|
|
fetchSubscriptionsOauth() {
|
|
if (!this.isOauthEnabled) return;
|
|
|
|
this.fetchSubscriptions(this.subscriptionsPath);
|
|
},
|
|
setInitialAlert() {
|
|
const { linkUrl, title, message, variant } = retrieveAlert() || {};
|
|
this.setAlert({ linkUrl, title, message, variant });
|
|
},
|
|
onSignInOauth() {
|
|
this.fetchSubscriptionsOauth();
|
|
},
|
|
onSignInError() {
|
|
this.setAlert({
|
|
message: I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE,
|
|
variant: 'danger',
|
|
});
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<header
|
|
class="jira-connect-header gl-display-flex gl-align-items-center gl-justify-content-center gl-px-5 gl-border-b-solid gl-border-b-gray-100 gl-border-b-1 gl-bg-white"
|
|
>
|
|
<gl-link :href="gitlabUrl" target="_blank">
|
|
<img :src="gitlabLogo" class="gl-h-6" :alt="__('GitLab')" />
|
|
</gl-link>
|
|
<user-link
|
|
:user-signed-in="userSignedIn"
|
|
:has-subscriptions="hasSubscriptions"
|
|
:user="currentUser"
|
|
class="gl-fixed gl-right-4"
|
|
/>
|
|
</header>
|
|
|
|
<main class="jira-connect-app gl-px-5 gl-pt-7 gl-mx-auto">
|
|
<browser-support-alert v-if="!isBrowserSupported" class="gl-mb-7" />
|
|
<div v-else data-testid="jira-connect-app">
|
|
<compatibility-alert class="gl-mb-7" />
|
|
|
|
<gl-alert
|
|
v-if="shouldShowAlert"
|
|
:variant="alert.variant"
|
|
:title="alert.title"
|
|
class="gl-mb-5"
|
|
data-testid="jira-connect-persisted-alert"
|
|
@dismiss="setAlert"
|
|
>
|
|
<gl-sprintf v-if="alert.linkUrl" :message="alert.message">
|
|
<template #link="{ content }">
|
|
<gl-link :href="alert.linkUrl" target="_blank">{{ content }}</gl-link>
|
|
</template>
|
|
</gl-sprintf>
|
|
|
|
<template v-else>
|
|
{{ alert.message }}
|
|
</template>
|
|
</gl-alert>
|
|
|
|
<div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
|
|
<sign-in-page
|
|
v-if="!userSignedIn"
|
|
:has-subscriptions="hasSubscriptions"
|
|
@sign-in-oauth="onSignInOauth"
|
|
@error="onSignInError"
|
|
/>
|
|
<subscriptions-page v-else :has-subscriptions="hasSubscriptions" />
|
|
</div>
|
|
</div>
|
|
</main>
|
|
</div>
|
|
</template>
|