210 lines
7.9 KiB
TypeScript
Vendored
210 lines
7.9 KiB
TypeScript
Vendored
/*
|
|
Copyright (C) 2023-2026 modelstoken
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
For commercial licensing, please contact admin@modelstoken.com
|
|
*/
|
|
import { parseCurrencyDisplayType } from '@/lib/currency'
|
|
import { CheckinSettingsSection } from '../general/checkin-settings-section'
|
|
import { PricingSection } from '../general/pricing-section'
|
|
import { QuotaSettingsSection } from '../general/quota-settings-section'
|
|
import { PaymentSettingsSection } from '../integrations/payment-settings-section'
|
|
import { RatioSettingsCard } from '../models/ratio-settings-card'
|
|
import type { BillingSettings } from '../types'
|
|
import { createSectionRegistry } from '../utils/section-registry'
|
|
|
|
const getModelDefaults = (settings: BillingSettings) => ({
|
|
ModelPrice: settings.ModelPrice,
|
|
ModelRatio: settings.ModelRatio,
|
|
CacheRatio: settings.CacheRatio,
|
|
CreateCacheRatio: settings.CreateCacheRatio,
|
|
CompletionRatio: settings.CompletionRatio,
|
|
ImageRatio: settings.ImageRatio,
|
|
AudioRatio: settings.AudioRatio,
|
|
AudioCompletionRatio: settings.AudioCompletionRatio,
|
|
ExposeRatioEnabled: settings.ExposeRatioEnabled,
|
|
BillingMode: settings['billing_setting.billing_mode'],
|
|
BillingExpr: settings['billing_setting.billing_expr'],
|
|
})
|
|
|
|
const getGroupDefaults = (settings: BillingSettings) => ({
|
|
TopupGroupRatio: settings.TopupGroupRatio,
|
|
GroupRatio: settings.GroupRatio,
|
|
UserUsableGroups: settings.UserUsableGroups,
|
|
GroupGroupRatio: settings.GroupGroupRatio,
|
|
AutoGroups: settings.AutoGroups,
|
|
DefaultUseAutoGroup: settings.DefaultUseAutoGroup,
|
|
GroupSpecialUsableGroup:
|
|
settings['group_ratio_setting.group_special_usable_group'],
|
|
})
|
|
|
|
const BILLING_SECTIONS = [
|
|
{
|
|
id: 'quota',
|
|
titleKey: 'Quota Settings',
|
|
build: (settings: BillingSettings) => (
|
|
<QuotaSettingsSection
|
|
defaultValues={{
|
|
QuotaForNewUser: settings.QuotaForNewUser,
|
|
PreConsumedQuota: settings.PreConsumedQuota,
|
|
QuotaForInviter: settings.QuotaForInviter,
|
|
QuotaForInvitee: settings.QuotaForInvitee,
|
|
TopUpLink: settings.TopUpLink,
|
|
general_setting: {
|
|
docs_link: settings['general_setting.docs_link'],
|
|
},
|
|
quota_setting: {
|
|
enable_free_model_pre_consume:
|
|
settings['quota_setting.enable_free_model_pre_consume'],
|
|
},
|
|
}}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'currency',
|
|
titleKey: 'Currency & Display',
|
|
build: (settings: BillingSettings) => (
|
|
<PricingSection
|
|
defaultValues={{
|
|
QuotaPerUnit: settings.QuotaPerUnit,
|
|
USDExchangeRate: settings.USDExchangeRate,
|
|
DisplayInCurrencyEnabled: settings.DisplayInCurrencyEnabled,
|
|
DisplayTokenStatEnabled: settings.DisplayTokenStatEnabled,
|
|
general_setting: {
|
|
quota_display_type: parseCurrencyDisplayType(
|
|
settings['general_setting.quota_display_type']
|
|
),
|
|
custom_currency_symbol:
|
|
settings['general_setting.custom_currency_symbol'] ?? '¤',
|
|
custom_currency_exchange_rate:
|
|
settings['general_setting.custom_currency_exchange_rate'] ?? 1,
|
|
},
|
|
}}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'model-pricing',
|
|
titleKey: 'Model Pricing',
|
|
build: (settings: BillingSettings) => (
|
|
<RatioSettingsCard
|
|
titleKey='Model Pricing'
|
|
modelDefaults={getModelDefaults(settings)}
|
|
groupDefaults={getGroupDefaults(settings)}
|
|
toolPricesDefault={settings['tool_price_setting.prices']}
|
|
visibleTabs={['models', 'tool-prices', 'upstream-sync']}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'group-pricing',
|
|
titleKey: 'Group Pricing',
|
|
build: (settings: BillingSettings) => (
|
|
<RatioSettingsCard
|
|
titleKey='Group Pricing'
|
|
modelDefaults={getModelDefaults(settings)}
|
|
groupDefaults={getGroupDefaults(settings)}
|
|
toolPricesDefault={settings['tool_price_setting.prices']}
|
|
visibleTabs={['groups']}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'payment',
|
|
titleKey: 'Payment Gateway',
|
|
build: (settings: BillingSettings) => (
|
|
<PaymentSettingsSection
|
|
defaultValues={{
|
|
PayAddress: settings.PayAddress,
|
|
EpayId: settings.EpayId,
|
|
EpayKey: settings.EpayKey,
|
|
Price: settings.Price,
|
|
MinTopUp: settings.MinTopUp,
|
|
CustomCallbackAddress: settings.CustomCallbackAddress,
|
|
PayMethods: settings.PayMethods,
|
|
AmountOptions: settings['payment_setting.amount_options'],
|
|
AmountDiscount: settings['payment_setting.amount_discount'],
|
|
StripeApiSecret: settings.StripeApiSecret,
|
|
StripeWebhookSecret: settings.StripeWebhookSecret,
|
|
StripePriceId: settings.StripePriceId,
|
|
StripeUnitPrice: settings.StripeUnitPrice,
|
|
StripeMinTopUp: settings.StripeMinTopUp,
|
|
StripePromotionCodesEnabled: settings.StripePromotionCodesEnabled,
|
|
CreemApiKey: settings.CreemApiKey,
|
|
CreemWebhookSecret: settings.CreemWebhookSecret,
|
|
CreemTestMode: settings.CreemTestMode,
|
|
CreemProducts: settings.CreemProducts,
|
|
}}
|
|
waffoDefaultValues={{
|
|
WaffoEnabled: settings.WaffoEnabled ?? false,
|
|
WaffoApiKey: settings.WaffoApiKey ?? '',
|
|
WaffoPrivateKey: settings.WaffoPrivateKey ?? '',
|
|
WaffoPublicCert: settings.WaffoPublicCert ?? '',
|
|
WaffoSandboxPublicCert: settings.WaffoSandboxPublicCert ?? '',
|
|
WaffoSandboxApiKey: settings.WaffoSandboxApiKey ?? '',
|
|
WaffoSandboxPrivateKey: settings.WaffoSandboxPrivateKey ?? '',
|
|
WaffoSandbox: settings.WaffoSandbox ?? false,
|
|
WaffoMerchantId: settings.WaffoMerchantId ?? '',
|
|
WaffoCurrency: settings.WaffoCurrency ?? 'USD',
|
|
WaffoUnitPrice: settings.WaffoUnitPrice ?? 1,
|
|
WaffoMinTopUp: settings.WaffoMinTopUp ?? 1,
|
|
WaffoNotifyUrl: settings.WaffoNotifyUrl ?? '',
|
|
WaffoReturnUrl: settings.WaffoReturnUrl ?? '',
|
|
WaffoPayMethods: settings.WaffoPayMethods ?? '[]',
|
|
}}
|
|
waffoPancakeDefaultValues={{
|
|
WaffoPancakeMerchantID: settings.WaffoPancakeMerchantID ?? '',
|
|
WaffoPancakePrivateKey: settings.WaffoPancakePrivateKey ?? '',
|
|
WaffoPancakeReturnURL: settings.WaffoPancakeReturnURL ?? '',
|
|
}}
|
|
waffoPancakeProvisionedStoreID={settings.WaffoPancakeStoreID ?? ''}
|
|
waffoPancakeProvisionedProductID={settings.WaffoPancakeProductID ?? ''}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'checkin',
|
|
titleKey: 'Check-in Rewards',
|
|
build: (settings: BillingSettings) => (
|
|
<CheckinSettingsSection
|
|
defaultValues={{
|
|
enabled: settings['checkin_setting.enabled'],
|
|
minQuota: settings['checkin_setting.min_quota'],
|
|
maxQuota: settings['checkin_setting.max_quota'],
|
|
}}
|
|
/>
|
|
),
|
|
},
|
|
] as const
|
|
|
|
export type BillingSectionId = (typeof BILLING_SECTIONS)[number]['id']
|
|
|
|
const billingRegistry = createSectionRegistry<
|
|
BillingSectionId,
|
|
BillingSettings
|
|
>({
|
|
sections: BILLING_SECTIONS,
|
|
defaultSection: 'quota',
|
|
basePath: '/system-settings/billing',
|
|
urlStyle: 'path',
|
|
})
|
|
|
|
export const BILLING_SECTION_IDS = billingRegistry.sectionIds
|
|
export const BILLING_DEFAULT_SECTION = billingRegistry.defaultSection
|
|
export const getBillingSectionNavItems = billingRegistry.getSectionNavItems
|
|
export const getBillingSectionContent = billingRegistry.getSectionContent
|
|
export const getBillingSectionMeta = billingRegistry.getSectionMeta
|