Files
SuhailandGitHub ac773a2c53 refactor(signup): Redesign the signup flow (#2674)
* refactor(signup): Redesign the signup flow

* refactor: remove unnecessary setup wizard data collection

* fix: handle invitation

* refactor: extract spinner component

* fix: set country on signup

* fix: uncomment code

* fix: loader message on revisit

* fix: setup account validation

* fix: remove site_defaults

* refactor: move around code

* chore: correct comment

* fix: padding below buttons
2025-05-21 09:17:31 +05:30

133 lines
3.1 KiB
Vue

<template>
<div
class="px-5 py-10"
v-if="$team?.doc"
:class="{
'h-max min-h-full ':
!$team.doc.onboarding.is_saas_user &&
!$team.doc.onboarding.site_created,
}"
>
<LoginBox
title="Select an app to get started"
subtitle="Select the app you need to configure them effortlessly"
>
<div v-if="$resources.availableApps.loading">
<div class="flex h-40 justify-center">
<LoadingText />
</div>
</div>
<div v-else>
<div
class="flex h-full max-h-96 flex-col items-center justify-center space-y-2 overflow-auto py-2"
>
<div
v-for="app in $resources.availableApps.data"
:key="app.name"
class="w-full"
>
<div
class="flex cursor-pointer items-center rounded border border-gray-100 p-2"
:class="{
'bg-gray-100': selectedApp?.name === app.name,
'border-gray-100 hover:bg-gray-50':
selectedApp?.name !== app.name,
}"
@click="selectedApp = app"
>
<img
:src="app.image"
:alt="app.title"
class="mr-2 h-8 w-8 rounded"
/>
<div class="space-y-1">
<p class="text-lg font-medium">{{ app.title }}</p>
<p class="line-clamp-1 text-sm text-gray-600">
{{ app.description }}
</p>
</div>
</div>
</div>
</div>
<Button
class="mt-4 w-full"
:label="selectedApp ? `Install ${selectedApp.title}` : 'Install app'"
variant="solid"
:disabled="!selectedApp"
@click="openInstallAppPage(selectedApp)"
/>
</div>
<template #footer>
<span class="ml-4 text-base font-normal text-gray-600">
{{ 'Skip creating a site? ' }}
</span>
<router-link
class="text-base font-normal text-gray-900 underline hover:text-gray-700"
:to="{
name: 'Site List',
}"
>
Go to Dashboard
</router-link>
</template>
</LoginBox>
</div>
</template>
<script>
import { getTeam } from '../../data/team';
import OnboardingAppSelector from './../../components/OnboardingAppSelector.vue';
import LoginBox from './../../components/auth/LoginBox.vue';
export default {
name: 'Welcome',
components: {
OnboardingAppSelector,
LoginBox,
},
data() {
return {
selectedApp: null,
};
},
resources: {
availableApps() {
return {
url: 'press.api.marketplace.get_marketplace_apps_for_onboarding',
auto: true,
};
},
getAccountRequestForProductSignup() {
return {
url: 'press.api.product_trial.get_account_request_for_product_signup',
};
},
},
beforeRouteEnter(to, from, next) {
let $team = getTeam();
window.$team = $team;
if ($team.doc.onboarding.complete && $team.doc.onboarding.site_created) {
next({ name: 'Site List' });
} else if (to.query.is_redirect && $team.doc.onboarding.site_created) {
next({ name: 'Site List' });
} else {
next();
}
},
methods: {
openInstallAppPage(app) {
this.$resources.getAccountRequestForProductSignup
.submit()
.then((account_request) =>
this.$router.push({
name: 'SignupSetup',
params: { productId: app.name },
query: {
account_request: account_request,
},
}),
);
},
},
};
</script>