opnform-host-nginx/client/stores/oauth_providers.js

133 lines
3.3 KiB
JavaScript

import { defineStore } from "pinia"
import { useContentStore } from "~/composables/stores/useContentStore.js"
import { useFeatureFlagsStore } from '~/stores/featureFlags'
export const providersEndpoint = "/open/providers"
export const useOAuthProvidersStore = defineStore("oauth_providers", () => {
const contentStore = useContentStore()
const featureFlagsStore = useFeatureFlagsStore()
const alert = useAlert()
const googleDrivePermission = 'https://www.googleapis.com/auth/drive.file'
const services = computed(() => {
return [
{
name: 'google',
title: 'Google',
icon: 'mdi:google',
enabled: featureFlagsStore.getFlag('services.google.auth', false),
auth_type: 'redirect'
},
{
name: 'stripe',
title: 'Stripe',
icon: 'cib:stripe',
enabled: true
},
{
name: 'telegram',
title: 'Telegram',
icon: 'mdi:telegram',
enabled: featureFlagsStore.getFlag('services.telegram.bot_id', false),
auth_type: 'widget',
widget_file: 'TelegramWidget'
}
]
})
const getService = (service) => {
return services.value.find((item) => item.name === service)
}
const fetchOAuthProviders = () => {
contentStore.resetState()
contentStore.startLoading()
return opnFetch(providersEndpoint).then(
(data) => {
contentStore.save(data)
contentStore.stopLoading()
},
)
}
const connect = (service, redirect = false, newtab = false, autoClose = false) => {
contentStore.resetState()
const serviceConfig = getService(service)
if (serviceConfig && serviceConfig.auth_type !== 'redirect') {
return
}
contentStore.startLoading()
const intention = redirect ? new URL(window.location.href).pathname : undefined
opnFetch(`/settings/providers/connect/${service}`, {
method: 'POST',
body: {
...(intention && { intention }),
autoClose: autoClose
}
})
.then((data) => {
if (newtab) {
window.open(data.url, '_blank')
} else {
window.location.href = data.url
}
})
.catch((error) => {
try {
alert.error(error.data.message)
} catch (e) {
alert.error("An error occurred while connecting an account")
}
})
.finally(() => {
contentStore.stopLoading()
})
}
const guestConnect = (service, redirect = false) => {
contentStore.resetState()
contentStore.startLoading()
const intention = new URL(window.location.href).pathname
opnFetch(`/oauth/connect/${service}`, {
method: 'POST',
body: {
...redirect ? { intention } : {},
}
})
.then((data) => {
window.open(data.url, '_blank')
})
.catch((error) => {
try {
alert.error(error.data.message)
} catch (e) {
alert.error("An error occurred while connecting an account")
}
})
.finally(() => {
contentStore.stopLoading()
})
}
const providers = computed(() => contentStore.getAll.value)
return {
...contentStore,
googleDrivePermission,
services,
getService,
fetchOAuthProviders,
providers,
connect,
guestConnect
}
})