feat(premium): let self-hosted instances sell premium and gifts (#3025)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-28 21:21:51 +02:00
1 parent 192cec689a
commit 3736d94d73
159 files changed
+15802 -9067

No files matched your search

@@ -1,7 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
import * as PremiumModalCommands from '@app/features/premium/commands/PremiumModalCommands';
import {useCanSendGift} from '@app/features/premium/hooks/useCanSendGift';
import * as ModalCommands from '@app/features/ui/commands/ModalCommands';
import {MenuBottomSheet, type MenuGroupType} from '@app/features/ui/menu_bottom_sheet/MenuBottomSheet';
import {msg} from '@lingui/core/macro';
@@ -34,7 +34,7 @@ interface MobileTextareaPlusBottomSheetProps {
export const MobileTextareaPlusBottomSheet = observer(
({isOpen, onClose, onUploadFile, textareaValue, onUploadAsFile}: MobileTextareaPlusBottomSheetProps) => {
const {i18n} = useLingui();
const isSelfHosted = RuntimeConfig.isSelfHosted();
const canSendGift = useCanSendGift(isOpen);
const groups: Array<MenuGroupType> = useMemo(() => {
const items = [
{
@@ -64,7 +64,7 @@ export const MobileTextareaPlusBottomSheet = observer(
},
});
}
if (!isSelfHosted) {
if (canSendGift) {
items.push({
icon: <GiftIcon data-flx="channel.textarea.mobile-textarea-plus-bottom-sheet.groups.gift-icon" />,
label: i18n._(SEND_GIFT_DESCRIPTOR),
@@ -74,7 +74,7 @@ export const MobileTextareaPlusBottomSheet = observer(
});
}
return [{items}];
}, [isSelfHosted, onClose, onUploadFile, textareaValue, onUploadAsFile, i18n.locale]);
}, [canSendGift, onClose, onUploadFile, textareaValue, onUploadAsFile, i18n.locale]);
return (
<MenuBottomSheet
isOpen={isOpen}
@@ -2,10 +2,10 @@
import * as AccessibilityCommands from '@app/features/accessibility/commands/AccessibilityCommands';
import Accessibility from '@app/features/accessibility/state/Accessibility';
import RuntimeConfig from '@app/features/app/state/RuntimeConfig';
import {CANNOT_SEND_MESSAGES_IN_CHANNEL_DESCRIPTOR} from '@app/features/i18n/utils/CommonMessageDescriptors';
import Keybind from '@app/features/input/state/InputKeybind';
import * as PremiumModalCommands from '@app/features/premium/commands/PremiumModalCommands';
import {useCanSendGift} from '@app/features/premium/hooks/useCanSendGift';
import {CheckboxItem} from '@app/features/ui/action_menu/ContextMenu';
import {MenuGroup} from '@app/features/ui/action_menu/MenuGroup';
import {MenuItem} from '@app/features/ui/action_menu/MenuItem';
@@ -87,7 +87,7 @@ export const TextareaPlusMenu = observer(
const showStickersButton = Accessibility.showStickersButton;
const showEmojiButton = Accessibility.showEmojiButton;
const showMessageSendButton = Accessibility.showMessageSendButton;
const isSelfHosted = RuntimeConfig.isSelfHosted();
const canSendGift = useCanSendGift();
const hasTextContent = textareaValue && textareaValue.trim().length > 0;
const cannotSendMessagesHint = i18n._(CANNOT_SEND_MESSAGES_IN_CHANNEL_DESCRIPTOR);
const cannotUploadFilesHint = i18n._(YOU_DO_NOT_HAVE_PERMISSION_TO_UPLOAD_FILES_DESCRIPTOR);
@@ -133,7 +133,7 @@ export const TextareaPlusMenu = observer(
{i18n._(UPLOAD_YOUR_MESSAGE_AS_A_FILE_DESCRIPTOR)}
</MenuItem>
)}
{!isSelfHosted && (
{canSendGift && (
<MenuItem
icon={<GiftIcon data-flx="channel.textarea.textarea-plus-menu.gift-icon" />}
onClick={() => PremiumModalCommands.open(true)}