standardizing no content screen (#675)

* standardizing no content screen

* fixing preview text overlay style
This commit is contained in:
Blake Kaufman
2026-03-13 12:00:59 -04:00
committed by GitHub
parent 29476fb00a
commit 4e65c9b5bf
22 changed files with 365 additions and 178 deletions
@@ -24,6 +24,7 @@ import { useTranslation } from 'react-i18next';
import CustomSettingsTopBar from '../../../../../functions/CustomElements/settingsTopBar';
import { INSET_WINDOW_WIDTH } from '../../../../../constants/theme';
import ThemeIcon from '../../../../../functions/CustomElements/themeIcon';
import NoContentSceen from '../../../../../functions/CustomElements/noContentScreen';
export default function HistoricalGiftCardPurchases() {
const { decodedGiftCards, toggleGlobalAppDataInformation } =
@@ -72,58 +73,61 @@ export default function HistoricalGiftCardPurchases() {
</TouchableOpacity>
);
if (
!decodedGiftCards.purchasedCards ||
decodedGiftCards?.purchasedCards?.length === 0
) {
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar containerStyles={styles.topBar} />
<NoContentSceen
iconName="Receipt"
titleText={t('apps.noPurchaseTitle')}
subTitleText={t('apps.giftCards.historicalPurchasesPage.noPurchases')}
/>
</GlobalThemeView>
);
}
return (
<GlobalThemeView styles={styles.globalContainer} useStandardWidth={true}>
<CustomSettingsTopBar containerStyles={styles.topBar} />
{!decodedGiftCards.purchasedCards ||
decodedGiftCards?.purchasedCards?.length === 0 ? (
<View style={styles.noPurchaseContainer}>
<ThemeText
styles={styles.noPurchaseText}
content={t('apps.giftCards.historicalPurchasesPage.noPurchases')}
/>
</View>
) : (
<>
<FlatList
data={decodedGiftCards.purchasedCards}
renderItem={renderItem}
keyExtractor={item => item.id.toString()} // Assuming each gift card has a unique 'id'
style={{ width: '90%' }}
showsVerticalScrollIndicator={false}
ListFooterComponent={
<View
style={{
height: bottomPadding + 60,
}}
/>
}
/>
<CustomButton
buttonStyles={{
...styles.supportBTN,
bottom: bottomPadding,
<FlatList
data={decodedGiftCards.purchasedCards}
renderItem={renderItem}
keyExtractor={item => item.id.toString()} // Assuming each gift card has a unique 'id'
style={{ width: '90%' }}
showsVerticalScrollIndicator={false}
ListFooterComponent={
<View
style={{
height: bottomPadding + 60,
}}
actionFunction={async () => {
try {
await openComposer({
to: 'support@thebitcoincompany.com',
subject: 'Gift cards payment error',
});
} catch (err) {
copyToClipboard(
'support@thebitcoincompany.com',
showToast,
null,
t('apps.giftCards.historicalPurchasesPage.customCopyMessage'),
);
}
}}
textContent={t('constants.support')}
/>
</>
)}
}
/>
<CustomButton
buttonStyles={{
...styles.supportBTN,
bottom: bottomPadding,
}}
actionFunction={async () => {
try {
await openComposer({
to: 'support@thebitcoincompany.com',
subject: 'Gift cards payment error',
});
} catch (err) {
copyToClipboard(
'support@thebitcoincompany.com',
showToast,
null,
t('apps.giftCards.historicalPurchasesPage.customCopyMessage'),
);
}
}}
textContent={t('constants.support')}
/>
</GlobalThemeView>
);
@@ -22,6 +22,7 @@ import CustomButton from '../../../../../functions/CustomElements/button';
import { useKeysContext } from '../../../../../../context-store/keys';
import { encriptMessage } from '../../../../../functions/messaging/encodingAndDecodingMessages';
import ThemeIcon from '../../../../../functions/CustomElements/themeIcon';
import NoContentSceen from '../../../../../functions/CustomElements/noContentScreen';
const API_ENDPOINTS = {
ORDER_STATUS: 'https://api2.sms4sats.com/orderstatus',
@@ -329,6 +330,23 @@ export default function HistoricalSMSMessagingPage({ route }) {
copyToClipboard('support@sms4sats.com', showToast);
}, [showToast]);
if (!messageElements.length) {
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar
label={t(
`apps.sms4sats.sentPayments.title${selectedPage.toLowerCase()}`,
)}
/>
<NoContentSceen
iconName="Receipt"
titleText={t('apps.noPurchaseTitle')}
subTitleText={t('apps.sms4sats.sentPayments.noPurchasesTitle')}
/>
</GlobalThemeView>
);
}
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar
@@ -338,39 +356,26 @@ export default function HistoricalSMSMessagingPage({ route }) {
/>
<View style={styles.homepage}>
{messageElements.length === 0 ? (
<View style={styles.centered}>
<ThemeText
content={t(
`apps.sms4sats.sentPayments.noPayments${selectedPage.toLowerCase()}`,
)}
styles={styles.emptyStateText}
/>
</View>
) : (
<ScrollView
showsVerticalScrollIndicator={false}
contentContainerStyle={styles.scrollContainer}
>
{messageElements}
</ScrollView>
)}
<ScrollView
showsVerticalScrollIndicator={false}
contentContainerStyle={styles.scrollContainer}
>
{messageElements}
</ScrollView>
{!!messageElements.length && (
<TouchableOpacity
onPress={handleSupportContact}
style={styles.supportContainer}
>
<ThemeText
styles={styles.supportText}
content={t('apps.sms4sats.sentPayments.helpMessage')}
/>
<ThemeText
styles={styles.supportEmail}
content="support@sms4sats.com"
/>
</TouchableOpacity>
)}
<TouchableOpacity
onPress={handleSupportContact}
style={styles.supportContainer}
>
<ThemeText
styles={styles.supportText}
content={t('apps.sms4sats.sentPayments.helpMessage')}
/>
<ThemeText
styles={styles.supportEmail}
content="support@sms4sats.com"
/>
</TouchableOpacity>
</View>
</GlobalThemeView>
);
@@ -22,7 +22,7 @@ import { useTranslation } from 'react-i18next';
import GiftCardItem from './giftCardItem';
import CustomButton from '../../../../functions/CustomElements/button';
import { useGlobalThemeContext } from '../../../../../context-store/theme';
import IconActionCircle from '../../../../functions/CustomElements/actionCircleContainer';
import NoContentSceen from '../../../../functions/CustomElements/noContentScreen';
export default function GiftsOverview() {
const navigate = useNavigation();
@@ -84,17 +84,14 @@ export default function GiftsOverview() {
showsVerticalScrollIndicator={false}
/>
) : (
<ScrollView contentContainerStyle={styles.scrollView}>
<IconActionCircle bottomOffset={32} icon={'Gift'} />
<ThemeText
styles={styles.title}
content={t('screens.inAccount.giftPages.giftsOverview.noGiftsHead')}
/>
<ThemeText
styles={styles.noGiftsDesc}
content={t('screens.inAccount.giftPages.giftsOverview.noGiftsDesc')}
/>
</ScrollView>
<NoContentSceen
containerStyles={{ width: '100%' }}
iconName="Gift"
titleText={t('screens.inAccount.giftPages.giftsOverview.noGiftsHead')}
subTitleText={t(
'screens.inAccount.giftPages.giftsOverview.noGiftsDesc',
)}
/>
)}
<View style={styles.buttonGroup}>
@@ -125,7 +122,7 @@ export default function GiftsOverview() {
}
const styles = StyleSheet.create({
container: { flex: 1, width: WINDOWWIDTH, alignSelf: 'center' },
container: { flex: 1, width: INSET_WINDOW_WIDTH, alignSelf: 'center' },
flatlistStyle: { paddingTop: 0 },
flatListContent: { flexGrow: 1, paddingTop: 20 },
scrollView: {
@@ -10,6 +10,7 @@ import {
} from '../../../../constants/theme';
import {
CustomKeyboardAvoidingView,
GlobalThemeView,
ThemeText,
} from '../../../../functions/CustomElements';
import GetThemeColors from '../../../../hooks/themeColors';
@@ -22,6 +23,7 @@ import CustomSettingsTopBar from '../../../../functions/CustomElements/settingsT
import { useGlobalThemeContext } from '../../../../../context-store/theme';
import CustomSearchInput from '../../../../functions/CustomElements/searchInput';
import IconActionCircle from '../../../../functions/CustomElements/actionCircleContainer';
import NoContentSceen from '../../../../functions/CustomElements/noContentScreen';
export default function ReclaimGift() {
const { theme, darkModeType } = useGlobalThemeContext();
@@ -64,6 +66,30 @@ export default function ReclaimGift() {
navigate.navigate('AdvancedGiftClaim');
};
if (!hasExpiredGift) {
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar
label={t('screens.inAccount.giftPages.claimPage.reclaimButton')}
/>
<NoContentSceen
iconName="RotateCcw"
titleText={t('screens.inAccount.giftPages.reclaimPage.header')}
subTitleText={t(
'screens.inAccount.giftPages.reclaimPage.noReclaimsMessage',
)}
/>
<CustomButton
buttonStyles={{ width: INSET_WINDOW_WIDTH, ...CENTER }}
textContent={t(
'screens.inAccount.giftPages.reclaimPage.advancedModeBTN',
)}
actionFunction={handleAdvancedMode}
/>
</GlobalThemeView>
);
}
return (
<CustomKeyboardAvoidingView
useStandardWidth={true}
@@ -233,6 +259,7 @@ const styles = StyleSheet.create({
marginTop: 8,
},
advancedContainer: {
width: '100%',
backgroundColor: 'unset',
marginBottom: 20,
},
@@ -10,6 +10,7 @@ import PoolCard from './poolCard';
import FullLoadingScreen from '../../../../functions/CustomElements/loadingScreen';
import { useTranslation } from 'react-i18next';
import PoolsInfoCard from './poolsInfoCard';
import NoContentSceen from '../../../../functions/CustomElements/noContentScreen';
export default function PoolManagementScreen() {
const navigate = useNavigation();
@@ -69,12 +70,11 @@ export default function PoolManagementScreen() {
);
const renderEmptyState = () => (
<View style={styles.emptyContainer}>
<ThemeText
styles={styles.emptyText}
content={t('wallet.pools.noPoolsCreated')}
/>
</View>
<NoContentSceen
iconName="PiggyBank"
titleText={t('wallet.pools.noPoolsTitle')}
subTitleText={t('wallet.pools.noPoolsSubTitle')}
/>
);
// Build data array based on what exists
@@ -1,6 +1,7 @@
import { ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native';
import {
CustomKeyboardAvoidingView,
GlobalThemeView,
ThemeText,
} from '../../../../../../functions/CustomElements';
import CustomSettingsTopBar from '../../../../../../functions/CustomElements/settingsTopBar';
@@ -21,6 +22,7 @@ import { useGlobalThemeContext } from '../../../../../../../context-store/theme'
import { useTranslation } from 'react-i18next';
import ThemeIcon from '../../../../../../functions/CustomElements/themeIcon';
import { INSET_WINDOW_WIDTH } from '../../../../../../constants/theme';
import NoContentSceen from '../../../../../../functions/CustomElements/noContentScreen';
export default function AddPOSItemsPage() {
const { masterInfoObject, toggleMasterInfoObject } =
@@ -120,6 +122,31 @@ export default function AddPOSItemsPage() {
.filter(Boolean);
}, [posItemSearch, posItems, currentCurrency, backgroundOffset]);
if (!posItems.length) {
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar
shouldDismissKeyboard={true}
label={t('settings.posPath.items.addPOSItemsPage.title')}
/>
<NoContentSceen
iconName="ShoppingCart"
titleText={t('settings.posPath.items.addPOSItemsPage.noPosTitle')}
subTitleText={t('settings.posPath.items.addPOSItemsPage.noPosSub')}
/>
<CustomButton
buttonStyles={styles.addItemButton}
actionFunction={() =>
navigate.navigate('CustomHalfModal', {
wantedContent: 'addPOSItemsHalfModal',
})
}
textContent={t('settings.posPath.items.addPOSItemsPage.ctaBTN')}
/>
</GlobalThemeView>
);
}
return (
<CustomKeyboardAvoidingView
isKeyboardActive={isKeyboardActive}
@@ -151,11 +178,9 @@ export default function AddPOSItemsPage() {
<View style={styles.emptyState}>
<ThemeText
styles={styles.emptyStateText}
content={
posItems?.length
? t('settings.posPath.items.addPOSItemsPage.noItemsSearch')
: t('settings.posPath.items.addPOSItemsPage.noItemsAdded')
}
content={t(
'settings.posPath.items.addPOSItemsPage.noItemsSearch',
)}
/>
</View>
)}
@@ -220,11 +245,10 @@ const styles = StyleSheet.create({
paddingBottom: CONTENT_KEYBOARD_OFFSET,
},
emptyState: {
marginTop: 24,
alignItems: 'center',
},
emptyStateText: {
width: '90%',
width: '100%',
textAlign: 'center',
},
});
@@ -2,6 +2,7 @@ import { useCallback, useMemo, useState } from 'react';
import { CENTER, ICONS, SIZES } from '../../../../../constants';
import {
CustomKeyboardAvoidingView,
GlobalThemeView,
ThemeText,
} from '../../../../../functions/CustomElements';
import CustomSettingsTopBar from '../../../../../functions/CustomElements/settingsTopBar';
@@ -18,6 +19,7 @@ import { keyboardNavigate } from '../../../../../functions/customNavigation';
import GetThemeColors from '../../../../../hooks/themeColors';
import ThemeIcon from '../../../../../functions/CustomElements/themeIcon';
import { INSET_WINDOW_WIDTH } from '../../../../../constants/theme';
import NoContentSceen from '../../../../../functions/CustomElements/noContentScreen';
export default function ViewPOSTransactions() {
const { groupedTxs } = usePOSTransactions();
@@ -78,6 +80,26 @@ export default function ViewPOSTransactions() {
[backgroundOffset, masterInfoObject, fiatStats, t, navigate],
);
if (!groupedTxs.length) {
return (
<GlobalThemeView useStandardWidth={true}>
<CustomSettingsTopBar
shouldDismissKeyboard={true}
showLeftImage={false}
leftImageBlue={ICONS.receiptIcon}
LeftImageDarkMode={ICONS.receiptWhite}
containerStyles={{ marginBottom: 0 }}
label={t('settings.posPath.transactions.title')}
/>
<NoContentSceen
iconName="Receipt"
titleText={t('settings.posPath.transactions.noEmployeeTitle')}
subTitleText={t('settings.posPath.transactions.noEmployeeSubTitle')}
/>
</GlobalThemeView>
);
}
return (
<CustomKeyboardAvoidingView
styles={styles.globalContainer}
@@ -114,11 +136,7 @@ export default function ViewPOSTransactions() {
) : (
<ThemeText
styles={styles.emptyText}
content={
groupedTxs.length
? t('settings.posPath.transactions.noTips')
: t('settings.posPath.transactions.noEmployees')
}
content={t('settings.posPath.transactions.noTips')}
/>
)}
</View>
@@ -158,7 +176,6 @@ const styles = StyleSheet.create({
marginTop: 2,
},
emptyText: {
marginTop: 24,
textAlign: 'center',
},
});
@@ -76,6 +76,7 @@ import ThemeIcon from '../../../../functions/CustomElements/themeIcon';
import CheckMarkCircle from '../../../../functions/CustomElements/checkMarkCircle';
import { getTimeDisplay } from '../../../../functions/contacts';
import useAdaptiveButtonLayout from '../../../../hooks/useAdaptiveButtonLayout';
import NoContentSceen from '../../../../functions/CustomElements/noContentScreen';
const confirmTxAnimation = require('../../../../assets/confirmTxAnimation.json');
@@ -1472,21 +1473,15 @@ export default function SwapFlowHalfModal({
);
}}
ListEmptyComponent={
<View style={styles.emptyContainer}>
<ThemeIcon iconName={'ArrowUpDown'} />
<ThemeText
styles={styles.emptyTitle}
content={t(
'screens.inAccount.swapHistory.noHisotorytitle',
)}
/>
<ThemeText
styles={styles.emptySubtext}
content={t(
'screens.inAccount.swapHistory.noHisotorydesc',
)}
/>
</View>
<NoContentSceen
iconName="ArrowUpDown"
titleText={t(
'screens.inAccount.swapHistory.noHisotorytitle',
)}
subTitleText={t(
'screens.inAccount.swapHistory.noHisotorydesc',
)}
/>
}
ListFooterComponent={
swapHistory.swaps.length < swapHistory.totalCount ? (
@@ -0,0 +1,55 @@
import { StyleSheet, View } from 'react-native';
import ThemeIcon from './themeIcon';
import { CENTER, ICONS } from '../../constants';
import {
HIDDEN_OPACITY,
INSET_WINDOW_WIDTH,
SIZES,
} from '../../constants/theme';
import ThemeText from './textTheme';
import ThemeImage from './themeImage';
export default function NoContentSceen({
iconName = '',
titleText = '',
subTitleText = '',
containerStyles = {},
}) {
return (
<View style={[styles.container, containerStyles]}>
{iconName === 'Receipt' ? (
<ThemeImage
lightModeIcon={ICONS.receiptIcon}
darkModeIcon={ICONS.receiptIcon}
lightsOutIcon={ICONS.receiptWhite}
/>
) : (
<ThemeIcon iconName={iconName} />
)}
<ThemeText styles={styles.emptyTitle} content={titleText} />
<ThemeText styles={styles.emptySubtext} content={subTitleText} />
</View>
);
}
const styles = StyleSheet.create({
container: {
width: INSET_WINDOW_WIDTH,
flex: 1,
alignItems: 'center',
justifyContent: 'center',
...CENTER,
},
emptyTitle: {
fontSize: SIZES.large,
fontWeight: '500',
marginTop: 16,
marginBottom: 8,
textAlign: 'center',
},
emptySubtext: {
fontSize: SIZES.smedium,
opacity: HIDDEN_OPACITY,
textAlign: 'center',
},
});
@@ -114,6 +114,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
gap: 10,
},
left: {
flexShrink: 1,
@@ -70,6 +70,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
gap: 10,
},
left: {
flexShrink: 1,
@@ -158,6 +158,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
gap: 10,
},
left: {
flexShrink: 1,
@@ -22,7 +22,7 @@ export default function SavingsPreview({ onPress }) {
return (
<WidgetCard onPress={onPress}>
<View style={styles.row}>
<View style={{ flexShrink: 1, marginRight: 10 }}>
<View style={{ flexShrink: 1 }}>
<ThemeText
styles={styles.title}
content={t('savings.preview.title')}
@@ -76,6 +76,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
gap: 10,
},
title: {
fontSize: SIZES.smedium,
+6 -11
View File
@@ -28,6 +28,7 @@ import GetThemeColors from '../../hooks/themeColors';
import { getFilteredTransactions } from '../../functions/spark/transactions';
import customUUID from '../../functions/customUUID';
import ThemeIcon from '../../functions/CustomElements/themeIcon';
import NoContentSceen from '../../functions/CustomElements/noContentScreen';
import { HIDDEN_OPACITY, INSET_WINDOW_WIDTH } from '../../constants/theme';
const FILTER_DEBOUNCE_MS = 500;
@@ -241,17 +242,11 @@ export default function ViewAllTxPage() {
{!txs.length || isLoadingNewTxs ? (
<FullLoadingScreen />
) : doesNotHaveTransactions ? (
<View style={styles.noTxContainer}>
<ThemeIcon iconName={'Clock'} />
<ThemeText
styles={styles.emptyTitle}
content={t('screens.inAccount.viewAllTxPage.noTxHistoryTitle')}
/>
<ThemeText
styles={styles.emptySubtext}
content={t('screens.inAccount.viewAllTxPage.noTxHistorySub')}
/>
</View>
<NoContentSceen
iconName="Clock"
titleText={t('screens.inAccount.viewAllTxPage.noTxHistoryTitle')}
subTitleText={t('screens.inAccount.viewAllTxPage.noTxHistorySub')}
/>
) : (
<FlatList
initialNumToRender={20}
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Keine Einkäufe",
"appList": {
"AI": "KI",
"AIDescription": "Chatten Sie mit den neuesten generativen KI-Modellen.",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Möchten Sie diese Geschenkkarte wirklich entfernen?",
"purchased": "Gekauft am:",
"noPurchases": "Sie haben noch keine Geschenkkarten gekauft.",
"noPurchases": "Sie haben noch keine Geschenkkarten gekauft. Sobald Sie eine kaufen, wird sie hier angezeigt.",
"customCopyMessage": "Support-E-Mail wurde kopiert"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "Die Bestellung wurde erstattet. Die Gelder werden nach 21 Minuten automatisch auf Ihre Wallet zurückgebucht.",
"reclaimComplete": "Wiederholung abgeschlossen. Falls kein Code generiert wird, erhalten Sie nach 21 Minuten automatisch eine Rückerstattung.",
"noCode": "Kein Code",
"rateLimitError": "Zu viele Anfragen. Sie können nur 5 Anfragen alle 30 Sekunden stellen. Bitte warten Sie einen Moment."
"rateLimitError": "Zu viele Anfragen. Sie können nur 5 Anfragen alle 30 Sekunden stellen. Bitte warten Sie einen Moment.",
"noPurchasesTitle": "Sie haben noch keine SMS-Nachrichten gesendet oder empfangen. Sobald Sie das tun, erscheinen sie hier."
},
"receivePage": {
"paymentMemo": "Shop - SMS Empfang",
@@ -944,7 +946,9 @@
"howStep2": "• Teilen Sie den Sparpool-Link, damit andere ihn finden können.",
"howStep3": "• Unterstützer senden Bitcoin direkt an den Pool.",
"howStep4": "• Schließen Sie den Sparpool, wenn Sie bereit sind, die Gelder in Ihr Hauptkonto zu übertragen."
}
},
"noPoolsTitle": "Keine erstellten Pools",
"noPoolsSubTitle": "Sobald du einen Pool erstellt hast, wird er hier als aktiv oder inaktiv angezeigt."
},
"manualInputPage": {
"inputPlaceholder": "Geben Sie eine Liquid- oder Lightning-Adresse bzw. Zahlungsanforderung ein oder fügen Sie sie ein."
@@ -1731,7 +1735,9 @@
"title": "Zu zahlende Trinkgelder an die Mitarbeiter",
"empNamePlaceholder": "Mitarbeitername",
"noEmployees": "Aktuell liegen keine offenen Trinkgelder vor. Sobald Mitarbeiter Trinkgelder über das Zahlungsterminal (POS) erfassen (z. B. per Lightning-Zahlung oder Blitz Wallet), erscheinen die Beträge hier sortiert nach Mitarbeitern und können ausgezahlt werden.",
"noTips": "Der Mitarbeiter hat keine Trinkgelder."
"noTips": "Der Mitarbeiter hat keine Trinkgelder.",
"noEmployeeTitle": "Keine Trinkgelder zu zahlen",
"noEmployeeSubTitle": "Du hast noch keine Trinkgelder zu zahlen. Wenn ein Mitarbeiter ein Trinkgeld erhält, wird es hier angezeigt."
},
"items": {
"addItemHalfModal": {
@@ -1753,7 +1759,9 @@
"itemSearchPlaceholder": "Artikelname...",
"noItemsSearch": "Keine Artikel entsprechen Ihrer Suche.",
"noItemsAdded": "Fügen Sie einen Artikel hinzu, damit er hier angezeigt wird.",
"ctaBTN": "Artikel hinzufügen"
"ctaBTN": "Artikel hinzufügen",
"noPosTitle": "Keine POS-Artikel",
"noPosSub": "Du hast noch keine POS-Artikel gespeichert. Sobald du einen gespeichert hast, wird er hier angezeigt."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "No Purchases",
"appList": {
"AI": "AI",
"AIDescription": "Chat with the latest generative AI models",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Are you sure you want to remove this gift card?",
"purchased": "Purchased:",
"noPurchases": "You have no gift card purchases",
"noPurchases": "You havent purchased any gift cards. Once you do, theyll show up here.",
"customCopyMessage": "Support email copied"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "Order has been refunded, funds will automatically return to your wallet after 21 minutes",
"reclaimComplete": "Retry complete. If no code is generated, you will be auto-refunded after 21 minutes.",
"noCode": "No code",
"rateLimitError": "Too many requests. You can only make 5 requests every 30 seconds. Please wait before trying again."
"rateLimitError": "Too many requests. You can only make 5 requests every 30 seconds. Please wait before trying again.",
"noPurchasesTitle": "You havent sent or received any SMS messages yet. Once you do, theyll show up here."
},
"receivePage": {
"paymentMemo": "Store - SMS Receive",
@@ -943,7 +945,9 @@
"howStep2": "• Share the pool link so others can find it",
"howStep3": "• Contributors send Bitcoin directly to the pool",
"howStep4": "• Close the pool when ready to move funds to your wallet"
}
},
"noPoolsTitle": "No Created Pools",
"noPoolsSubTitle": "Once you create a pool, itll show up here as active or inactive."
},
"manualInputPage": {
"inputPlaceholder": "Enter or paste a Liquid, or Lightning address/invoice"
@@ -1729,7 +1733,9 @@
"title": "Tips to pay",
"empNamePlaceholder": "Employee name",
"noEmployees": "You currently dont have any employees with saved tips. Once an employee uses the point-of-sale, their tips will appear here so you can pay them.",
"noTips": "Employee has no tips"
"noTips": "Employee has no tips",
"noEmployeeTitle": "No Tips To Pay",
"noEmployeeSubTitle": "You dont have any tips to pay yet. When an employee receives a tip, itll show up here."
},
"items": {
"addItemHalfModal": {
@@ -1751,7 +1757,9 @@
"itemSearchPlaceholder": "Item name...",
"noItemsSearch": "No items match your search.",
"noItemsAdded": "Add an item for it to show up here.",
"ctaBTN": "Add Item"
"ctaBTN": "Add Item",
"noPosTitle": "No POS Items",
"noPosSub": "You dont have any POS items saved yet. Once you save one, it will show up here."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Sin Compras",
"appList": {
"AI": "IA",
"AIDescription": "Chatea con los últimos modelos generativos de IA",
@@ -615,7 +616,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "¿Estás seguro de que quieres eliminar esta tarjeta de regalo?",
"purchased": "Comprado:",
"noPurchases": "No tienes compras de tarjetas de regalo",
"noPurchases": "Todavía no has comprado ninguna tarjeta de regalo. Una vez que lo hagas, aparecerá aquí.",
"customCopyMessage": "Correo de soporte copiado"
}
},
@@ -659,7 +660,8 @@
"refundedOrder": "El pedido ha sido reembolsado, los fondos se devolverán automáticamente a tu billetera después de 21 minutos.",
"reclaimComplete": "Rety completo. Si no se genera un código, se te reembolsará automáticamente después de 21 minutos.",
"noCode": "No hay código",
"rateLimitError": "Demasiadas solicitudes. Solo puedes hacer 5 solicitudes cada 30 segundos. Por favor, espera antes de intentar nuevamente."
"rateLimitError": "Demasiadas solicitudes. Solo puedes hacer 5 solicitudes cada 30 segundos. Por favor, espera antes de intentar nuevamente.",
"noPurchasesTitle": "Aún no has enviado ni recibido ningún SMS. Una vez que lo hagas, aparecerán aquí."
},
"receivePage": {
"paymentMemo": "Tienda - Recepción de SMS",
@@ -804,7 +806,9 @@
"howStep2": "• Comparte el enlace del pool para que otros puedan encontrarlo",
"howStep3": "• Los contribuyentes envían Bitcoin directamente al pool",
"howStep4": "• Cierra el pool cuando estés listo para mover los fondos a tu wallet"
}
},
"noPoolsTitle": "Sin Pools Creados",
"noPoolsSubTitle": "Una vez que crees un pool, aparecerá aquí como activo o inactivo."
},
"manualInputPage": {
"inputPlaceholder": "Introduce o pega una dirección/factura de Liquid o Lightning"
@@ -1588,7 +1592,9 @@
"title": "Propinas a pagar",
"empNamePlaceholder": "Nombre del empleado",
"noEmployees": "Actualmente no tienes empleados con propinas guardadas. Cuando un empleado use el punto de venta, sus propinas aparecerán aquí para que puedas pagarlas.",
"noTips": "El empleado no tiene propinas"
"noTips": "El empleado no tiene propinas",
"noEmployeeTitle": "Sin Propinas que Pagar",
"noEmployeeSubTitle": "Aún no tienes propinas que pagar. Cuando un empleado reciba una propina, aparecerá aquí."
},
"items": {
"addItemHalfModal": {
@@ -1610,7 +1616,9 @@
"itemSearchPlaceholder": "Nombre del artículo...",
"noItemsSearch": "Ningún artículo coincide con tu búsqueda.",
"noItemsAdded": "Agrega un artículo para que aparezca aquí.",
"ctaBTN": "Añadir artículo"
"ctaBTN": "Añadir artículo",
"noPosTitle": "Sin Artículos POS",
"noPosSub": "Aún no tienes artículos POS guardados. Una vez que guardes uno, aparecerá aquí."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Aucun Achat",
"appList": {
"AI": "AI",
"AIDescription": "Chat avec les derniers modèles génératifs d'intelligence artificielle",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Êtes-vous sûr de vouloir supprimer cette carte-cadeau ?",
"purchased": "Acheté :",
"noPurchases": "Vous n'avez pas acheté de carte cadeau",
"noPurchases": "Vous n'avez pas encore acheté de carte-cadeau. Une fois que vous le faites, elle apparaîtra ici.",
"customCopyMessage": "Courriel d'assistance copié"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "La commande a été remboursée, les fonds seront automatiquement reversés dans votre portefeuille après 21 minutes.",
"reclaimComplete": "Rety terminé. Si aucun code n'est généré, vous serez automatiquement remboursé après 21 minutes.",
"noCode": "Pas de code",
"rateLimitError": "Trop de demandes. Vous ne pouvez effectuer que 5 demandes toutes les 30 secondes. Veuillez patienter avant de réessayer."
"rateLimitError": "Trop de demandes. Vous ne pouvez effectuer que 5 demandes toutes les 30 secondes. Veuillez patienter avant de réessayer.",
"noPurchasesTitle": "Vous n'avez encore ni envoyé ni reçu de SMS. Une fois que vous le faites, ils apparaîtront ici."
},
"receivePage": {
"paymentMemo": "Stocker - Recevoir des SMS",
@@ -943,7 +945,9 @@
"howStep2": "• Partagez le lien du pool pour que dautres puissent le trouver",
"howStep3": "• Les contributeurs envoient des bitcoins directement au pool",
"howStep4": "• Fermez le pool lorsque vous êtes prêt à transférer les fonds vers votre wallet"
}
},
"noPoolsTitle": "Aucun Pool Créé",
"noPoolsSubTitle": "Une fois que vous avez créé un pool, il apparaîtra ici comme actif ou inactif."
},
"manualInputPage": {
"inputPlaceholder": "Saisir ou coller un liquide, ou une adresse/facture Lightning"
@@ -1729,7 +1733,9 @@
"title": "Conseils pour payer",
"empNamePlaceholder": "Nom de l'employé",
"noEmployees": "Vous navez actuellement aucun employé avec des pourboires enregistrés. Une fois quun employé utilise le point de vente, ses pourboires apparaîtront ici afin que vous puissiez les payer.",
"noTips": "L'employé n'a pas de pourboire"
"noTips": "L'employé n'a pas de pourboire",
"noEmployeeTitle": "Aucun Pourboire à Payer",
"noEmployeeSubTitle": "Vous n'avez pas encore de pourboires à payer. Lorsqu'un employé reçoit un pourboire, il apparaîtra ici."
},
"items": {
"addItemHalfModal": {
@@ -1751,7 +1757,9 @@
"itemSearchPlaceholder": "Nom de l'article...",
"noItemsSearch": "Aucun article ne correspond à votre recherche.",
"noItemsAdded": "Ajoutez un élément pour qu'il apparaisse ici.",
"ctaBTN": "Ajouter un article"
"ctaBTN": "Ajouter un article",
"noPosTitle": "Aucun Article POS",
"noPosSub": "Vous n'avez pas encore d'articles POS enregistrés. Une fois que vous en enregistrez un, il apparaîtra ici."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Nessun Acquisto",
"appList": {
"AI": "IA",
"AIDescription": "Chatta con i più recenti modelli generativi di IA",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Sei sicuro di voler rimuovere questa carta regalo?",
"purchased": "Acquistata:",
"noPurchases": "Non hai acquisti di carte regalo",
"noPurchases": "Non hai ancora acquistato nessuna carta regalo. Una volta che lo fai, apparirà qui.",
"customCopyMessage": "Email di assistenza copiata"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "L'ordine è stato rimborsato, i fondi torneranno automaticamente nel tuo portafoglio dopo 21 minuti.",
"reclaimComplete": "Rety completato. Se non viene generato alcun codice, verrà automaticamente rimborsato dopo 21 minuti.",
"noCode": "Nessun codice",
"rateLimitError": "Troppe richieste. Puoi fare solo 5 richieste ogni 30 secondi. Per favore, aspettati prima di riprovare."
"rateLimitError": "Troppe richieste. Puoi fare solo 5 richieste ogni 30 secondi. Per favore, aspettati prima di riprovare.",
"noPurchasesTitle": "Non hai ancora inviato o ricevuto messaggi SMS. Una volta che lo fai, appariranno qui."
},
"receivePage": {
"paymentMemo": "Negozio - Ricezione SMS",
@@ -943,7 +945,9 @@
"howStep2": "• Condividi il link del pool affinché altri possano trovarlo",
"howStep3": "• I contributori inviano Bitcoin direttamente al pool",
"howStep4": "• Chiudi il pool quando sei pronto a trasferire i fondi al tuo wallet"
}
},
"noPoolsTitle": "Nessun Pool Creato",
"noPoolsSubTitle": "Una volta creato un pool, apparirà qui come attivo o inattivo."
},
"manualInputPage": {
"inputPlaceholder": "Inserisci o incolla un indirizzo o una fattura Liquid o Lightning"
@@ -1729,7 +1733,9 @@
"title": "Mance da pagare",
"empNamePlaceholder": "Nome dipendente",
"noEmployees": "Al momento non hai dipendenti con mance salvate. Una volta che un dipendente utilizza il punto vendita, le sue mance appariranno qui così potrai pagarle.",
"noTips": "Il dipendente non ha mance"
"noTips": "Il dipendente non ha mance",
"noEmployeeTitle": "Nessuna Mancia da Pagare",
"noEmployeeSubTitle": "Non hai ancora mance da pagare. Quando un dipendente riceve una mancia, apparirà qui."
},
"items": {
"addItemHalfModal": {
@@ -1751,7 +1757,9 @@
"itemSearchPlaceholder": "Nome articolo...",
"noItemsSearch": "Nessun articolo corrisponde alla tua ricerca.",
"noItemsAdded": "Aggiungi un articolo perché appaia qui.",
"ctaBTN": "Aggiungi Articolo"
"ctaBTN": "Aggiungi Articolo",
"noPosTitle": "Nessun Articolo POS",
"noPosSub": "Non hai ancora articoli POS salvati. Una volta salvato uno, apparirà qui."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Nenhuma Compra",
"appList": {
"AI": "IA",
"AIDescription": "Converse com os mais recentes modelos de IA generativa",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Tem certeza de que deseja remover este cartão-presente?",
"purchased": "Comprado:",
"noPurchases": "Você não tem compras de cartão-presente",
"noPurchases": "Você ainda não comprou nenhum cartão-presente. Quando comprar, ele aparecerá aqui.",
"customCopyMessage": "E-mail de suporte copiado"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "A ordem foi reembolsada, os fundos retornarão automaticamente para sua carteira após 21 minutos",
"reclaimComplete": "Reenvio concluído. Se nenhum código for gerado, você será reembolsado automaticamente após 21 minutos.",
"noCode": "Sem código",
"rateLimitError": "Excesso de solicitações. Você só pode fazer 5 solicitações a cada 30 segundos. Aguarde antes de tentar novamente."
"rateLimitError": "Excesso de solicitações. Você só pode fazer 5 solicitações a cada 30 segundos. Aguarde antes de tentar novamente.",
"noPurchasesTitle": "Você ainda não enviou nem recebeu nenhuma mensagem SMS. Quando fizer isso, elas aparecerão aqui."
},
"receivePage": {
"paymentMemo": "Loja - Receber SMS",
@@ -943,7 +945,9 @@
"howStep2": "• Compartilhe o link da Vaquinha com outras pessoas",
"howStep3": "• Os contribuidores enviam Bitcoin diretamente para a Vaquinha",
"howStep4": "• Encerre a Vaquinha quando estiver pronto para mover os fundos para sua carteira"
}
},
"noPoolsTitle": "Nenhum Pool Criado",
"noPoolsSubTitle": "Quando você criar um pool, ele aparecerá aqui como ativo ou inativo."
},
"manualInputPage": {
"inputPlaceholder": "Insira ou cole um endereço/fatura Liquid ou Lightning"
@@ -1729,7 +1733,9 @@
"title": "Gorjetas a pagar",
"empNamePlaceholder": "Nome do funcionário",
"noEmployees": "No momento, você não tem funcionários com gorjetas salvas. Assim que um funcionário usar o ponto de venda, suas gorjetas aparecerão aqui para que você possa pagá-las.",
"noTips": "O funcionário não tem gorjetas"
"noTips": "O funcionário não tem gorjetas",
"noEmployeeTitle": "Nenhuma Gorjeta a Pagar",
"noEmployeeSubTitle": "Você ainda não tem gorjetas a pagar. Quando um funcionário receber uma gorjeta, ela aparecerá aqui."
},
"items": {
"addItemHalfModal": {
@@ -1751,7 +1757,9 @@
"itemSearchPlaceholder": "Nome do item...",
"noItemsSearch": "Nenhum item corresponde à sua pesquisa.",
"noItemsAdded": "Adicione um item para que ele apareça aqui.",
"ctaBTN": "Adicionar item"
"ctaBTN": "Adicionar item",
"noPosTitle": "Nenhum Item POS",
"noPosSub": "Você ainda não tem itens POS salvos. Quando salvar um, ele aparecerá aqui."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Нет покупок",
"appList": {
"AI": "ИИ",
"AIDescription": "Чат с новейшими моделями ИИ",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Вы уверены, что хотите удалить эту карту?",
"purchased": "Куплено:",
"noPurchases": "У вас нет купленных карт",
"noPurchases": "Вы ещё не покупали подарочные карты. Как только купите, они появятся здесь.",
"customCopyMessage": "Email поддержки скопирован"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "Заказ отменен, средства вернутся через 21 минуту",
"reclaimComplete": "Повтор завершен. Если код не придет, возврат будет через 21 минуту.",
"noCode": "Нет кода",
"rateLimitError": "Слишком много запросов. Подождите немного."
"rateLimitError": "Слишком много запросов. Подождите немного.",
"noPurchasesTitle": "Вы ещё не отправляли и не получали SMS-сообщения. Как только это произойдет, они появятся здесь."
},
"receivePage": {
"paymentMemo": "Магазин - СМС Прием",
@@ -943,7 +945,9 @@
"howStep2": "• Поделитесь ссылкой на пул, чтобы другие могли его найти",
"howStep3": "• Участники отправляют биткоины напрямую в пул",
"howStep4": "• Закройте пул, когда будете готовы перевести средства в свою wallet"
}
},
"noPoolsTitle": "Нет созданных пулов",
"noPoolsSubTitle": "Как только вы создадите пул, он появится здесь как активный или неактивный."
},
"manualInputPage": {
"inputPlaceholder": "Адрес Liquid, Молнии или инвойс",
@@ -1730,7 +1734,9 @@
"title": "К выплате",
"empNamePlaceholder": "Имя сотрудника",
"noEmployees": "Нет сотрудников с чаевыми.",
"noTips": "Нет чаевых"
"noTips": "Нет чаевых",
"noEmployeeTitle": "Нет чаевых к оплате",
"noEmployeeSubTitle": "У вас пока нет чаевых к оплате. Когда сотрудник получит чаевые, они появятся здесь."
},
"items": {
"addItemHalfModal": {
@@ -1752,7 +1758,9 @@
"itemSearchPlaceholder": "Поиск...",
"noItemsSearch": "Ничего не найдено.",
"noItemsAdded": "Добавьте товар, чтобы он появился здесь.",
"ctaBTN": "Добавить товар"
"ctaBTN": "Добавить товар",
"noPosTitle": "Нет позиций POS",
"noPosSub": "У вас пока нет сохранённых позиций POS. Как только вы сохраните одну, она появится здесь."
}
},
"internalComponents": {
+13 -5
View File
@@ -286,6 +286,7 @@
}
},
"apps": {
"noPurchaseTitle": "Inga Köp",
"appList": {
"AI": "AI",
"AIDescription": "Chatta med de senaste generativa Ai-modellerna",
@@ -755,7 +756,7 @@
"historicalPurchasesPage": {
"confirmRemoval": "Är du säker att du vill ta bort det här presentkortet?",
"purchased": "Köpte:",
"noPurchases": "Du har inga presentkortsköp",
"noPurchases": "Du har inte köpt några presentkort ännu. När du gör det visas de här.",
"customCopyMessage": "Support e-post kopierad"
}
},
@@ -799,7 +800,8 @@
"refundedOrder": "Ordern har återbetalats, pengarna kommer automatiskt tillbaka till din plånbok efter 21 minuter",
"reclaimComplete": "Rety komplett. Om ingen kod genereras kommer du att få en automatisk återbetalning efter 21 minuter.",
"noCode": "Ingen kod",
"rateLimitError": "För många förfrågningar. Du kan bara göra 5 förfrågningar var 30:e sekund. Vänligen vänta innan du försöker igen."
"rateLimitError": "För många förfrågningar. Du kan bara göra 5 förfrågningar var 30:e sekund. Vänligen vänta innan du försöker igen.",
"noPurchasesTitle": "Du har ännu inte skickat eller tagit emot några SMS-meddelanden. När du gör det visas de här."
},
"receivePage": {
"paymentMemo": "Butik - SMS-mottagning",
@@ -943,7 +945,9 @@
"howStep2": "• Dela poolens länk så att andra kan hitta den",
"howStep3": "• Bidragsgivare skickar Bitcoin direkt till poolen",
"howStep4": "• Stäng poolen när du är redo att flytta medlen till din wallet"
}
},
"noPoolsTitle": "Inga skapade pooler",
"noPoolsSubTitle": "När du skapar en pool visas den här som aktiv eller inaktiv."
},
"manualInputPage": {
"inputPlaceholder": "Ange eller klistra in en Liquid- eller Lightning-adress/faktura"
@@ -1729,7 +1733,9 @@
"title": "Tips för att betala",
"empNamePlaceholder": "Anställdas namn",
"noEmployees": "Du har för närvarande inga anställda med sparade dricks. När en anställd använder kassasystemet kommer deras dricks att visas här så att du kan betala ut dem.",
"noTips": "Medarbetaren har inga tips"
"noTips": "Medarbetaren har inga tips",
"noEmployeeTitle": "Inga dricks att betala",
"noEmployeeSubTitle": "Du har inga dricks att betala ännu. När en anställd får ett dricks visas det här."
},
"items": {
"addItemHalfModal": {
@@ -1751,7 +1757,9 @@
"itemSearchPlaceholder": "Artikelns namn...",
"noItemsSearch": "Inga objekt motsvarar din sökning.",
"noItemsAdded": "Lägg till ett objekt för att det ska visas här.",
"ctaBTN": "Lägg till artikel"
"ctaBTN": "Lägg till artikel",
"noPosTitle": "Inga POS-artiklar",
"noPosSub": "Du har inga sparade POS-artiklar ännu. När du sparar en visas den här."
}
},
"internalComponents": {