cherry-studio/src/renderer/src/utils/oauth.ts
kangfenmao 0edc62286d feat: enhance OAuth provider settings with new functionality
- Added a new ProviderOAuth component to manage OAuth authentication and billing for providers.
- Updated existing components to integrate the new ProviderOAuth functionality.
- Enhanced internationalization support for OAuth-related texts across multiple languages.
- Introduced new utility functions for handling provider billing.
2025-04-25 16:55:36 +08:00

106 lines
3.2 KiB
TypeScript

import { SILICON_CLIENT_ID } from '@renderer/config/constant'
import { getLanguageCode } from '@renderer/i18n'
import i18n from '@renderer/i18n'
export const oauthWithSiliconFlow = async (setKey) => {
const authUrl = `https://account.siliconflow.cn/oauth?client_id=${SILICON_CLIENT_ID}`
const popup = window.open(
authUrl,
'oauth',
'width=720,height=720,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes'
)
const messageHandler = (event) => {
if (event.data.length > 0 && event.data[0]['secretKey'] !== undefined) {
setKey(event.data[0]['secretKey'])
popup?.close()
window.removeEventListener('message', messageHandler)
}
}
window.removeEventListener('message', messageHandler)
window.addEventListener('message', messageHandler)
}
export const oauthWithAihubmix = async (setKey) => {
const authUrl = ` https://aihubmix.com/token?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh`
const popup = window.open(
authUrl,
'oauth',
'width=720,height=720,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes'
)
const messageHandler = async (event) => {
const data = event.data
if (data && data.key === 'cherry_studio_oauth_callback') {
const { iv, encryptedData } = data.data
try {
const secret = import.meta.env.RENDERER_VITE_AIHUBMIX_SECRET || ''
const decryptedData: any = await window.api.aes.decrypt(encryptedData, iv, secret)
const { api_keys } = JSON.parse(decryptedData)
if (api_keys && api_keys.length > 0) {
setKey(api_keys[0].value)
popup?.close()
window.removeEventListener('message', messageHandler)
}
} catch (error) {
console.error('[oauthWithAihubmix] error', error)
popup?.close()
window.message.error(i18n.t('oauth.error'))
}
}
}
window.removeEventListener('message', messageHandler)
window.addEventListener('message', messageHandler)
}
export const providerCharge = async (provider: string) => {
const chargeUrlMap = {
silicon: {
url: 'https://cloud.siliconflow.cn/expensebill',
width: 900,
height: 700
},
aihubmix: {
url: `https://aihubmix.com/topup?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh`,
width: 720,
height: 900
}
}
const { url, width, height } = chargeUrlMap[provider]
window.open(
url,
'oauth',
`width=${width},height=${height},toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes`
)
}
export const providerBills = async (provider: string) => {
const billsUrlMap = {
silicon: {
url: 'https://cloud.siliconflow.cn/bills',
width: 900,
height: 700
},
aihubmix: {
url: `https://aihubmix.com/statistics?client_id=cherry_studio_oauth&lang=${getLanguageCode()}&aff=SJyh`,
width: 900,
height: 700
}
}
const { url, width, height } = billsUrlMap[provider]
window.open(
url,
'oauth',
`width=${width},height=${height},toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,alwaysOnTop=yes,alwaysRaised=yes`
)
}