mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-06-24 00:21:22 +00:00
Merge pull request #84 from nbenaglia/feature/next-promotion-info
Minting stats: add next promotion info
This commit is contained in:
commit
5197f2584c
24
src/App.tsx
24
src/App.tsx
@ -1906,7 +1906,7 @@ function App() {
|
||||
textTransform: 'uppercase',
|
||||
}}
|
||||
>
|
||||
{t('core:minting_status')}
|
||||
{t('core:minting.status_title')}
|
||||
</span>
|
||||
}
|
||||
placement="left"
|
||||
@ -2370,11 +2370,7 @@ function App() {
|
||||
count: requestBuyOrder?.crosschainAtInfo?.length || 0,
|
||||
}}
|
||||
tOptions={{ postProcess: ['capitalizeFirstChar'] }}
|
||||
>
|
||||
The Application <br />
|
||||
<italic>{{ hostname }}</italic> <br />
|
||||
<span>is requesting {{ count }} buy order</span>
|
||||
</Trans>
|
||||
></Trans>
|
||||
</TextP>
|
||||
|
||||
<Spacer height="10px" />
|
||||
@ -2481,11 +2477,7 @@ function App() {
|
||||
count: requestBuyOrder?.crosschainAtInfo?.length || 0,
|
||||
}}
|
||||
tOptions={{ postProcess: ['capitalizeFirstChar'] }}
|
||||
>
|
||||
The Application <br />
|
||||
<italic>{{ hostname }}</italic> <br />
|
||||
<span>is requesting {{ count }} a payment</span>
|
||||
</Trans>
|
||||
></Trans>
|
||||
</TextP>
|
||||
|
||||
<Spacer height="10px" />
|
||||
@ -2964,10 +2956,7 @@ function App() {
|
||||
),
|
||||
}}
|
||||
tOptions={{ postProcess: ['capitalizeFirstChar'] }}
|
||||
>
|
||||
A <seed>SEEDPHRASE</seed> has been randomly generated in
|
||||
the background.
|
||||
</Trans>
|
||||
></Trans>
|
||||
</Typography>
|
||||
|
||||
<Typography
|
||||
@ -3001,10 +2990,7 @@ function App() {
|
||||
),
|
||||
}}
|
||||
tOptions={{ postProcess: ['capitalizeFirstChar'] }}
|
||||
>
|
||||
Create your Qortal account by clicking <next>NEXT</next>{' '}
|
||||
below.
|
||||
</Trans>
|
||||
></Trans>
|
||||
</Typography>
|
||||
|
||||
<Spacer height="17px" />
|
||||
|
@ -135,6 +135,10 @@ export const BoundedNumericTextField = ({
|
||||
<IconButton
|
||||
size="small"
|
||||
onClick={() => changeValueWithIncDecButton(1)}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<AddIcon
|
||||
sx={{
|
||||
@ -145,6 +149,10 @@ export const BoundedNumericTextField = ({
|
||||
<IconButton
|
||||
size="small"
|
||||
onClick={() => changeValueWithIncDecButton(-1)}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<RemoveIcon
|
||||
sx={{
|
||||
|
12
src/common/Transitions.tsx
Normal file
12
src/common/Transitions.tsx
Normal file
@ -0,0 +1,12 @@
|
||||
import { Slide } from '@mui/material';
|
||||
import { TransitionProps } from '@mui/material/transitions';
|
||||
import { forwardRef, ReactElement, Ref } from 'react';
|
||||
|
||||
export const TransitionUp = forwardRef(function Transition(
|
||||
props: TransitionProps & {
|
||||
children: ReactElement;
|
||||
},
|
||||
ref: Ref<unknown>
|
||||
) {
|
||||
return <Slide direction="up" ref={ref} {...props} />;
|
||||
});
|
@ -108,13 +108,10 @@ export const AppsDevModeNavBar = () => {
|
||||
<Tabs
|
||||
orientation="vertical"
|
||||
ref={tabsRef}
|
||||
aria-label={t('core:basic_tabs_example', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
variant="scrollable" // Make tabs scrollable
|
||||
scrollButtons={true}
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.text.primary,
|
||||
},
|
||||
maxHeight: `275px`, // Ensure the tabs container fits within the available space
|
||||
|
@ -190,11 +190,10 @@ export const AppsNavBarDesktop = ({ disableBack }) => {
|
||||
<Tabs
|
||||
orientation="vertical"
|
||||
ref={tabsRef}
|
||||
aria-label={t('core:basic_tabs_example')}
|
||||
variant="scrollable" // Make tabs scrollable
|
||||
scrollButtons={true}
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
maxHeight: `275px`, // Ensure the tabs container fits within the available space
|
||||
|
@ -1,4 +1,5 @@
|
||||
import React, {
|
||||
import {
|
||||
SyntheticEvent,
|
||||
useCallback,
|
||||
useContext,
|
||||
useEffect,
|
||||
@ -265,7 +266,7 @@ export const AppsPrivate = ({ myName, myAddress }) => {
|
||||
}
|
||||
};
|
||||
|
||||
const handleChange = (event: React.SyntheticEvent, newValue: number) => {
|
||||
const handleChange = (event: SyntheticEvent, newValue: number) => {
|
||||
setValueTabPrivateApp(newValue);
|
||||
};
|
||||
|
||||
@ -353,13 +354,10 @@ export const AppsPrivate = ({ myName, myAddress }) => {
|
||||
<Tabs
|
||||
value={valueTabPrivateApp}
|
||||
onChange={handleChange}
|
||||
aria-label={t('core:basic_tabs_example', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
variant={'fullWidth'}
|
||||
scrollButtons="auto"
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
}}
|
||||
|
@ -546,7 +546,7 @@ export const ChatDirect = ({
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div
|
||||
<Box
|
||||
style={{
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
@ -615,7 +615,7 @@ export const ChatDirect = ({
|
||||
tempChatReferences={tempChatReferences}
|
||||
/>
|
||||
|
||||
<div
|
||||
<Box
|
||||
style={{
|
||||
backgroundColor: theme.palette.background.default,
|
||||
bottom: isFocusedParent ? '0px' : 'unset',
|
||||
@ -632,7 +632,7 @@ export const ChatDirect = ({
|
||||
zIndex: isFocusedParent ? 5 : 'unset',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
<Box
|
||||
style={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -720,7 +720,7 @@ export const ChatDirect = ({
|
||||
</Typography>
|
||||
</Box>
|
||||
)}
|
||||
</div>
|
||||
</Box>
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
@ -766,7 +766,7 @@ export const ChatDirect = ({
|
||||
{` Send`}
|
||||
</CustomButton>
|
||||
</Box>
|
||||
</div>
|
||||
</Box>
|
||||
|
||||
<LoadingSnackbar
|
||||
open={isLoading}
|
||||
@ -783,6 +783,6 @@ export const ChatDirect = ({
|
||||
info={infoSnack}
|
||||
setInfo={setInfoSnack}
|
||||
/>
|
||||
</div>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
@ -206,7 +206,7 @@ export const ChatList = ({
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
<Box
|
||||
style={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -215,9 +215,8 @@ export const ChatList = ({
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
<Box
|
||||
ref={parentRef}
|
||||
className="List"
|
||||
style={{
|
||||
display: 'flex',
|
||||
flexGrow: 1,
|
||||
@ -226,14 +225,14 @@ export const ChatList = ({
|
||||
position: 'relative',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
height: rowVirtualizer.getTotalSize(),
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
left: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
@ -325,9 +324,9 @@ export const ChatList = ({
|
||||
// Render fallback if message is null
|
||||
if (!message) {
|
||||
return (
|
||||
<div
|
||||
<Box
|
||||
key={virtualRow.index}
|
||||
style={{
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -345,16 +344,16 @@ export const ChatList = ({
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
</div>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
<Box
|
||||
data-index={virtualRow.index} //needed for dynamic row height measurement
|
||||
ref={rowVirtualizer.measureElement} //measure dynamic row height
|
||||
key={message.signature}
|
||||
style={{
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -395,17 +394,17 @@ export const ChatList = ({
|
||||
scrollToItem={goToMessage}
|
||||
/>
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
</Box>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
{showScrollButton && (
|
||||
<Button
|
||||
onClick={() => scrollToBottom()}
|
||||
style={{
|
||||
sx={{
|
||||
backgroundColor: theme.palette.other.unread,
|
||||
border: 'none',
|
||||
borderRadius: '20px',
|
||||
@ -428,15 +427,15 @@ export const ChatList = ({
|
||||
{showScrollDownButton && !showScrollButton && (
|
||||
<Button
|
||||
onClick={() => scrollToBottom()}
|
||||
style={{
|
||||
sx={{
|
||||
backgroundColor: theme.palette.background.paper,
|
||||
outline: `1px solid ${theme.palette.primary.light}`,
|
||||
border: 'none',
|
||||
borderRadius: '20px',
|
||||
bottom: 20,
|
||||
color: theme.palette.text.primary,
|
||||
cursor: 'pointer',
|
||||
fontSize: '16px',
|
||||
outline: `1px solid ${theme.palette.primary.light}`,
|
||||
padding: '10px 20px',
|
||||
position: 'absolute',
|
||||
right: 20,
|
||||
@ -449,7 +448,7 @@ export const ChatList = ({
|
||||
})}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
</Box>
|
||||
|
||||
{enableMentions && (hasSecretKey || isPrivate === false) && (
|
||||
<ChatOptions
|
||||
|
@ -786,6 +786,7 @@ const ShowMessage = ({ message, goToMessage, messages }) => {
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
background: theme.palette.background.surface,
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
width: '100%',
|
||||
|
@ -213,7 +213,7 @@ export const CreateCommonSecret = ({
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
background: theme.palette.background.paper,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '25px',
|
||||
|
@ -228,8 +228,8 @@ export const MessageItemComponent = ({
|
||||
isLast={isLast}
|
||||
onSeen={onSeenFunc}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
backgroundColor: theme.palette.background.paper,
|
||||
borderRadius: '7px',
|
||||
display: 'flex',
|
||||
@ -664,7 +664,7 @@ export const MessageItemComponent = ({
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
</div>
|
||||
</Box>
|
||||
</MessageWragger>
|
||||
</>
|
||||
);
|
||||
|
@ -185,4 +185,4 @@ export const ContextMenu = ({ children, groupId, getUserSettings }) => {
|
||||
</CustomStyledMenu>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
}; // TODO translate
|
||||
|
@ -4,7 +4,7 @@ import syncedMintingImg from '../assets/syncStatus/synced_minting.webp';
|
||||
import syncingImg from '../assets/syncStatus/syncing.webp';
|
||||
import { getBaseApiReact } from '../App';
|
||||
import '../styles/CoreSyncStatus.css';
|
||||
import { useTheme } from '@mui/material';
|
||||
import { Box, useTheme } from '@mui/material';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { manifestData } from './NotAuthenticated';
|
||||
|
||||
@ -82,31 +82,31 @@ export const CoreSyncStatus = () => {
|
||||
: '';
|
||||
|
||||
let imagePath = syncingImg;
|
||||
let message = t('core:message.status.synchronizing', {
|
||||
let message = t('core:minting.status.synchronizing', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
});
|
||||
|
||||
if (isMintingPossible && !isUsingGateway) {
|
||||
imagePath = syncedMintingImg;
|
||||
message = `${t(`core:message.status.${isSynchronizing ? 'synchronizing' : 'synchronized'}`, { postProcess: 'capitalizeFirstChar' })} ${t('core:message.status.minting')}`;
|
||||
message = `${t(`core:minting.status.${isSynchronizing ? 'synchronizing' : 'synchronized'}`, { postProcess: 'capitalizeFirstChar' })} ${t('core:minting.status.minting')}`;
|
||||
} else if (isSynchronizing === true && syncPercent === 99) {
|
||||
imagePath = syncingImg;
|
||||
} else if (isSynchronizing && !isMintingPossible && syncPercent === 100) {
|
||||
imagePath = syncingImg;
|
||||
message = `${t('core:message.status.synchronizing', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:message.status.not_minting') : ''}`;
|
||||
message = `${t('core:minting.status.synchronizing', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:minting.status.not_minting') : ''}`;
|
||||
} else if (!isSynchronizing && !isMintingPossible && syncPercent === 100) {
|
||||
imagePath = syncedImg;
|
||||
message = `${t('core:message.status.synchronized', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:message.status.not_minting') : ''}`;
|
||||
message = `${t('core:minting.status.synchronized', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:minting.status.not_minting') : ''}`;
|
||||
} else if (isSynchronizing && isMintingPossible && syncPercent === 100) {
|
||||
imagePath = syncingImg;
|
||||
message = `${t('core:message.status.synchronizing', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:message.status.minting') : ''}`;
|
||||
message = `${t('core:minting.status.synchronizing', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:minting.status.minting') : ''}`;
|
||||
} else if (!isSynchronizing && isMintingPossible && syncPercent === 100) {
|
||||
imagePath = syncedMintingImg;
|
||||
message = `${t('core:message.status.synchronized', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:message.status.minting') : ''}`;
|
||||
message = `${t('core:minting.status.synchronized', { postProcess: 'capitalizeFirstChar' })} ${!isUsingGateway ? t('core:minting.status.minting') : ''}`;
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
<Box
|
||||
className="tooltip"
|
||||
data-theme={theme.palette.mode}
|
||||
style={{ display: 'inline' }}
|
||||
@ -119,7 +119,7 @@ export const CoreSyncStatus = () => {
|
||||
/>
|
||||
</span>
|
||||
|
||||
<div
|
||||
<Box
|
||||
className="core-panel"
|
||||
style={{
|
||||
right: 'unset',
|
||||
@ -166,10 +166,10 @@ export const CoreSyncStatus = () => {
|
||||
{t('core:ui.version', { postProcess: 'capitalizeFirstChar' })}:{' '}
|
||||
<span style={{ color: '#03a9f4' }}>{manifestData.version}</span>
|
||||
</h4>
|
||||
</div>
|
||||
</div>
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
return <div id="core-sync-status-id">{renderSyncStatusIcon()}</div>;
|
||||
return <Box id="core-sync-status-id">{renderSyncStatusIcon()}</Box>;
|
||||
};
|
||||
|
@ -269,11 +269,12 @@ export function ImageViewer({ src = null, alt = '' }) {
|
||||
<IconButton
|
||||
onClick={handleCloseFullscreen}
|
||||
sx={{
|
||||
position: 'absolute',
|
||||
top: 8,
|
||||
right: 8,
|
||||
zIndex: 10,
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
position: 'absolute',
|
||||
right: 8,
|
||||
top: 8,
|
||||
zIndex: 10,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
|
@ -57,27 +57,27 @@ const ControlsContainer = styled(Box)`
|
||||
`;
|
||||
|
||||
interface VideoPlayerProps {
|
||||
src?: string;
|
||||
poster?: string;
|
||||
name?: string;
|
||||
identifier?: string;
|
||||
service?: string;
|
||||
autoplay?: boolean;
|
||||
from?: string | null;
|
||||
customStyle?: any;
|
||||
from?: string | null;
|
||||
identifier?: string;
|
||||
name?: string;
|
||||
poster?: string;
|
||||
service?: string;
|
||||
src?: string | null;
|
||||
user?: string;
|
||||
}
|
||||
|
||||
// TODO translate and theme (optional)
|
||||
export const VideoPlayer: FC<VideoPlayerProps> = ({
|
||||
poster,
|
||||
name,
|
||||
identifier,
|
||||
service,
|
||||
autoplay = true,
|
||||
from = null,
|
||||
customStyle = {},
|
||||
from = null,
|
||||
identifier,
|
||||
name,
|
||||
node,
|
||||
poster,
|
||||
service,
|
||||
}) => {
|
||||
const keyIdentifier = useMemo(() => {
|
||||
if (name && identifier && service) {
|
||||
@ -549,22 +549,22 @@ export const VideoPlayer: FC<VideoPlayerProps> = ({
|
||||
)}
|
||||
{((!src && !isLoading) || !startPlay) && (
|
||||
<Box
|
||||
position="absolute"
|
||||
top={0}
|
||||
left={0}
|
||||
right={0}
|
||||
alignItems="center"
|
||||
bgcolor="rgba(0, 0, 0, 0.6)"
|
||||
bottom={0}
|
||||
display="flex"
|
||||
justifyContent="center"
|
||||
alignItems="center"
|
||||
zIndex={500}
|
||||
bgcolor="rgba(0, 0, 0, 0.6)"
|
||||
left={0}
|
||||
onClick={() => {
|
||||
togglePlay();
|
||||
}}
|
||||
position="absolute"
|
||||
right={0}
|
||||
sx={{
|
||||
cursor: 'pointer',
|
||||
}}
|
||||
top={0}
|
||||
zIndex={500}
|
||||
>
|
||||
<PlayArrow
|
||||
sx={{
|
||||
@ -587,7 +587,9 @@ export const VideoPlayer: FC<VideoPlayerProps> = ({
|
||||
<VideoElement
|
||||
id={identifier}
|
||||
ref={videoRef}
|
||||
src={!startPlay ? '' : resourceStatus?.status === 'READY' ? src : ''}
|
||||
src={
|
||||
!startPlay ? null : resourceStatus?.status === 'READY' ? src : null
|
||||
}
|
||||
poster={!startPlay ? poster : ''}
|
||||
onTimeUpdate={updateProgress}
|
||||
autoPlay={autoplay}
|
||||
|
@ -1,8 +1,5 @@
|
||||
import {
|
||||
forwardRef,
|
||||
Fragment,
|
||||
ReactElement,
|
||||
Ref,
|
||||
SyntheticEvent,
|
||||
useContext,
|
||||
useEffect,
|
||||
@ -17,8 +14,6 @@ import Typography from '@mui/material/Typography';
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
import ExpandLess from '@mui/icons-material/ExpandLess';
|
||||
import ExpandMore from '@mui/icons-material/ExpandMore';
|
||||
import Slide from '@mui/material/Slide';
|
||||
import { TransitionProps } from '@mui/material/transitions';
|
||||
import {
|
||||
Box,
|
||||
Collapse,
|
||||
@ -40,7 +35,7 @@ import { subscribeToEvent, unsubscribeFromEvent } from '../../utils/events';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { txListAtom } from '../../atoms/global';
|
||||
import { ErrorRounded } from '@mui/icons-material';
|
||||
import { TransitionUp } from '../../common/Transitions.tsx';
|
||||
|
||||
export const Label = styled('label')`
|
||||
display: block;
|
||||
@ -50,15 +45,6 @@ export const Label = styled('label')`
|
||||
margin-bottom: 4px;
|
||||
`;
|
||||
|
||||
const Transition = forwardRef(function Transition(
|
||||
props: TransitionProps & {
|
||||
children: ReactElement;
|
||||
},
|
||||
ref: Ref<unknown>
|
||||
) {
|
||||
return <Slide direction="up" ref={ref} {...props} />;
|
||||
});
|
||||
|
||||
export const AddGroup = ({ address, open, setOpen }) => {
|
||||
const { show } = useContext(QORTAL_APP_CONTEXT);
|
||||
const setTxList = useSetAtom(txListAtom);
|
||||
@ -229,13 +215,12 @@ export const AddGroup = ({ address, open, setOpen }) => {
|
||||
open={open}
|
||||
onClose={handleClose}
|
||||
slots={{
|
||||
transition: Transition,
|
||||
transition: TransitionUp,
|
||||
}}
|
||||
>
|
||||
<AppBar
|
||||
sx={{
|
||||
position: 'relative',
|
||||
bgcolor: theme.palette.background.default,
|
||||
}}
|
||||
>
|
||||
<Toolbar>
|
||||
@ -252,6 +237,10 @@ export const AddGroup = ({ address, open, setOpen }) => {
|
||||
color="inherit"
|
||||
edge="start"
|
||||
onClick={handleClose}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
@ -274,14 +263,11 @@ export const AddGroup = ({ address, open, setOpen }) => {
|
||||
<Tabs
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
aria-label={t('core:basic_tabs_example', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
variant={'fullWidth'}
|
||||
scrollButtons="auto"
|
||||
allowScrollButtonsMobile
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
}}
|
||||
@ -421,10 +407,10 @@ export const AddGroup = ({ address, open, setOpen }) => {
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
gap: '15px',
|
||||
alignItems: 'center',
|
||||
cursor: 'pointer',
|
||||
display: 'flex',
|
||||
gap: '15px',
|
||||
}}
|
||||
onClick={() => setOpenAdvance((prev) => !prev)}
|
||||
>
|
||||
|
@ -406,10 +406,11 @@ export const BlockedUsersModal = () => {
|
||||
})}
|
||||
onClick={onCancel}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
position: 'absolute',
|
||||
right: 8,
|
||||
top: 8,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
|
@ -1632,10 +1632,10 @@ export const Group = ({
|
||||
|
||||
const renderDirects = () => {
|
||||
return (
|
||||
<div
|
||||
<Box
|
||||
style={{
|
||||
alignItems: 'flex-start',
|
||||
background: theme.palette.background.default,
|
||||
background: theme.palette.background.surface,
|
||||
borderRadius: '0px 15px 15px 0px',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -1718,8 +1718,8 @@ export const Group = ({
|
||||
</ButtonBase>
|
||||
</Box>
|
||||
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'flex-start',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -1763,7 +1763,7 @@ export const Group = ({
|
||||
sx={{
|
||||
background:
|
||||
direct?.address === selectedDirect?.address &&
|
||||
theme.palette.background.default,
|
||||
theme.palette.background.surface,
|
||||
borderRadius: '2px',
|
||||
cursor: 'pointer',
|
||||
display: 'flex',
|
||||
@ -1782,7 +1782,7 @@ export const Group = ({
|
||||
<ListItemAvatar>
|
||||
<Avatar
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
background: theme.palette.background.surface,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
alt={direct?.name || direct?.address}
|
||||
@ -1803,22 +1803,24 @@ export const Group = ({
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})
|
||||
}
|
||||
primaryTypographyProps={{
|
||||
style: {
|
||||
color:
|
||||
direct?.address === selectedDirect?.address &&
|
||||
theme.palette.text.primary,
|
||||
textWrap: 'wrap',
|
||||
overflow: 'hidden',
|
||||
fontSize: '16px',
|
||||
slotProps={{
|
||||
primary: {
|
||||
style: {
|
||||
color:
|
||||
direct?.address === selectedDirect?.address &&
|
||||
theme.palette.text.primary,
|
||||
textWrap: 'wrap',
|
||||
overflow: 'hidden',
|
||||
fontSize: '16px',
|
||||
},
|
||||
},
|
||||
}} // Change the color of the primary text
|
||||
secondaryTypographyProps={{
|
||||
style: {
|
||||
color:
|
||||
direct?.address === selectedDirect?.address &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '12px',
|
||||
secondary: {
|
||||
style: {
|
||||
color:
|
||||
direct?.address === selectedDirect?.address &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '12px',
|
||||
},
|
||||
},
|
||||
}}
|
||||
sx={{
|
||||
@ -1827,6 +1829,7 @@ export const Group = ({
|
||||
fontSize: '16px',
|
||||
}}
|
||||
/>
|
||||
|
||||
{direct?.sender !== myAddress &&
|
||||
direct?.timestamp &&
|
||||
((!timestampEnterData[direct?.address] &&
|
||||
@ -1844,10 +1847,10 @@ export const Group = ({
|
||||
</ListItem>
|
||||
</List>
|
||||
))}
|
||||
</div>
|
||||
</Box>
|
||||
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
width: '100%',
|
||||
gap: '10px',
|
||||
@ -1871,6 +1874,7 @@ export const Group = ({
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</CustomButton>
|
||||
|
||||
{!isRunningPublicNode && (
|
||||
<CustomButton
|
||||
onClick={() => {
|
||||
@ -1888,8 +1892,8 @@ export const Group = ({
|
||||
/>
|
||||
</CustomButton>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@ -1936,7 +1940,7 @@ export const Group = ({
|
||||
setInfo={setInfoSnack}
|
||||
/>
|
||||
|
||||
<div // TODO use Box
|
||||
<Box
|
||||
style={{
|
||||
alignItems: 'flex-start',
|
||||
display: 'flex',
|
||||
@ -2004,7 +2008,7 @@ export const Group = ({
|
||||
<>
|
||||
<Box
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
background: theme.palette.background.surface,
|
||||
bottom: !(desktopViewMode === 'chat') ? 'unset' : '0px',
|
||||
left: !(desktopViewMode === 'chat') ? '-100000px' : '0px',
|
||||
opacity: !(desktopViewMode === 'chat') ? 0 : 1,
|
||||
@ -2458,7 +2462,7 @@ export const Group = ({
|
||||
}}
|
||||
/>
|
||||
<WalletsAppWrapper />
|
||||
</div>
|
||||
</Box>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -173,6 +173,10 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
|
||||
aria-label={t('core:comment_other', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<GroupAddIcon
|
||||
sx={{
|
||||
|
@ -256,6 +256,10 @@ export const GroupJoinRequests = ({
|
||||
aria-label={t('core:comment_other', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<GroupAddIcon
|
||||
sx={{
|
||||
|
@ -59,8 +59,8 @@ export const GroupList = ({
|
||||
const [isRunningPublicNode] = useAtom(isRunningPublicNodeAtom);
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'flex-start',
|
||||
background: theme.palette.background.surface,
|
||||
borderRadius: '0px 15px 15px 0px',
|
||||
@ -145,8 +145,8 @@ export const GroupList = ({
|
||||
</ButtonBase>
|
||||
</Box>
|
||||
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'flex-start',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
@ -176,10 +176,10 @@ export const GroupList = ({
|
||||
/>
|
||||
))}
|
||||
</List>
|
||||
</div>
|
||||
</Box>
|
||||
|
||||
<div
|
||||
style={{
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
justifyContent: 'center',
|
||||
@ -195,7 +195,7 @@ export const GroupList = ({
|
||||
>
|
||||
<AddCircleOutlineIcon
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
color: theme.palette.text.secondary,
|
||||
}}
|
||||
/>
|
||||
{t('group:group.group', { postProcess: 'capitalizeFirstChar' })}
|
||||
@ -213,14 +213,14 @@ export const GroupList = ({
|
||||
>
|
||||
<PersonOffIcon
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
color: theme.palette.text.secondary,
|
||||
}}
|
||||
/>
|
||||
</CustomButton>
|
||||
)}
|
||||
</>
|
||||
</div>
|
||||
</div>
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@ -294,20 +294,22 @@ const GroupItem = React.memo(
|
||||
? 'no messages'
|
||||
: `last message: ${formatEmailDate(group?.timestamp)}`
|
||||
}
|
||||
primaryTypographyProps={{
|
||||
style: {
|
||||
color:
|
||||
group?.groupId === selectedGroup?.groupId &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '16px',
|
||||
slotProps={{
|
||||
primary: {
|
||||
style: {
|
||||
color:
|
||||
group?.groupId === selectedGroup?.groupId &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '16px',
|
||||
},
|
||||
},
|
||||
}}
|
||||
secondaryTypographyProps={{
|
||||
style: {
|
||||
color:
|
||||
group?.groupId === selectedGroup?.groupId &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '12px',
|
||||
secondary: {
|
||||
style: {
|
||||
color:
|
||||
group?.groupId === selectedGroup?.groupId &&
|
||||
theme.palette.text.primary,
|
||||
fontSize: '12px',
|
||||
},
|
||||
},
|
||||
}}
|
||||
sx={{
|
||||
|
@ -5,7 +5,7 @@ import ListItemButton from '@mui/material/ListItemButton';
|
||||
import ListItemText from '@mui/material/ListItemText';
|
||||
import IconButton from '@mui/material/IconButton';
|
||||
import { executeEvent } from '../../utils/events';
|
||||
import { Box, Typography } from '@mui/material';
|
||||
import { Box, Typography, useTheme } from '@mui/material';
|
||||
import { Spacer } from '../../common/Spacer';
|
||||
import { CustomLoader } from '../../common/CustomLoader';
|
||||
import VisibilityIcon from '@mui/icons-material/Visibility';
|
||||
@ -14,6 +14,7 @@ import { useTranslation } from 'react-i18next';
|
||||
export const ListOfThreadPostsWatched = () => {
|
||||
const [posts, setPosts] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const theme = useTheme();
|
||||
const { t } = useTranslation([
|
||||
'auth',
|
||||
'core',
|
||||
@ -175,6 +176,10 @@ export const ListOfThreadPostsWatched = () => {
|
||||
aria-label={t('core:comment_other', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<VisibilityIcon
|
||||
sx={{
|
||||
|
@ -229,6 +229,10 @@ export const ManageMembers = ({
|
||||
color="inherit"
|
||||
edge="start"
|
||||
onClick={handleClose}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
@ -247,14 +251,11 @@ export const ManageMembers = ({
|
||||
<Tabs
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
aria-label={t('core:basic_tabs_example', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
variant="scrollable" // Make tabs scrollable
|
||||
scrollButtons="auto" // Show scroll buttons automatically
|
||||
allowScrollButtonsMobile // Show scroll buttons on mobile as well
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
maxWidth: '100%', // Ensure the tabs container fits within the available space
|
||||
|
@ -40,6 +40,7 @@ import { walletVersion } from '../../background/background.ts';
|
||||
import Base58 from '../../encryption/Base58.ts';
|
||||
import { QORTAL_APP_CONTEXT } from '../../App';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { TransitionUp } from '../../common/Transitions.tsx';
|
||||
|
||||
const LocalNodeSwitch = styled(Switch)(({ theme }) => ({
|
||||
padding: 8,
|
||||
@ -74,15 +75,6 @@ const LocalNodeSwitch = styled(Switch)(({ theme }) => ({
|
||||
},
|
||||
}));
|
||||
|
||||
const Transition = forwardRef(function Transition(
|
||||
props: TransitionProps & {
|
||||
children: ReactElement;
|
||||
},
|
||||
ref: Ref<unknown>
|
||||
) {
|
||||
return <Slide direction="up" ref={ref} {...props} />;
|
||||
});
|
||||
|
||||
export const Settings = ({ open, setOpen, rawWallet }) => {
|
||||
const [checked, setChecked] = useState(false);
|
||||
const [isEnabledDevMode, setIsEnabledDevMode] = useAtom(enabledDevModeAtom);
|
||||
@ -163,7 +155,7 @@ export const Settings = ({ open, setOpen, rawWallet }) => {
|
||||
open={open}
|
||||
onClose={handleClose}
|
||||
slots={{
|
||||
transition: Transition,
|
||||
transition: TransitionUp,
|
||||
}}
|
||||
>
|
||||
<AppBar sx={{ position: 'relative' }}>
|
||||
@ -181,6 +173,10 @@ export const Settings = ({ open, setOpen, rawWallet }) => {
|
||||
aria-label={t('core:action.close', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
|
@ -30,25 +30,18 @@ const LanguageSelector = () => {
|
||||
return (
|
||||
<Box ref={selectorRef}>
|
||||
{!showSelect && (
|
||||
<Tooltip
|
||||
key={currentLang}
|
||||
title={t('core:action.change_language', {
|
||||
<Button
|
||||
onClick={() => setShowSelect(true)}
|
||||
style={{
|
||||
fontSize: '1.3rem',
|
||||
}}
|
||||
aria-label={t('core:current_language', {
|
||||
language: name,
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
>
|
||||
<Button
|
||||
onClick={() => setShowSelect(true)}
|
||||
style={{
|
||||
fontSize: '1.3rem',
|
||||
}}
|
||||
aria-label={t('core:current_language', {
|
||||
language: name,
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
>
|
||||
{flag}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
{flag}
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{showSelect && (
|
||||
|
File diff suppressed because it is too large
Load Diff
467
src/components/Minting/MintingStats.tsx
Normal file
467
src/components/Minting/MintingStats.tsx
Normal file
@ -0,0 +1,467 @@
|
||||
import i18n from '../../i18n/i18n';
|
||||
import { AddressLevelEntry } from './Minting';
|
||||
|
||||
const accountTargetBlocks = (level: number): number | undefined => {
|
||||
if (level === 0) {
|
||||
return 7200;
|
||||
} else if (level === 1) {
|
||||
return 72000;
|
||||
} else if (level === 2) {
|
||||
return 201600;
|
||||
} else if (level === 3) {
|
||||
return 374400;
|
||||
} else if (level === 4) {
|
||||
return 618400;
|
||||
} else if (level === 5) {
|
||||
return 964000;
|
||||
} else if (level === 6) {
|
||||
return 1482400;
|
||||
} else if (level === 7) {
|
||||
return 2173600;
|
||||
} else if (level === 8) {
|
||||
return 3037600;
|
||||
} else if (level === 9) {
|
||||
return 4074400;
|
||||
} else {
|
||||
return undefined; // fallback: should never reach this point
|
||||
}
|
||||
};
|
||||
|
||||
export const nextLevel = (level: number): number | undefined => {
|
||||
if (level === 0) {
|
||||
return 1;
|
||||
} else if (level === 1) {
|
||||
return 2;
|
||||
} else if (level === 2) {
|
||||
return 3;
|
||||
} else if (level === 3) {
|
||||
return 4;
|
||||
} else if (level === 4) {
|
||||
return 5;
|
||||
} else if (level === 5) {
|
||||
return 6;
|
||||
} else if (level === 6) {
|
||||
return 7;
|
||||
} else if (level === 7) {
|
||||
return 8;
|
||||
} else if (level === 8) {
|
||||
return 9;
|
||||
} else if (level === 9) {
|
||||
return 10;
|
||||
} else {
|
||||
return undefined; // fallback: should never reach this point
|
||||
}
|
||||
};
|
||||
|
||||
export const blockReward = (nodeStatus): number => {
|
||||
if (nodeStatus.height < 259201) {
|
||||
return 5.0;
|
||||
} else if (nodeStatus.height < 518401) {
|
||||
return 4.75;
|
||||
} else if (nodeStatus.height < 777601) {
|
||||
return 4.5;
|
||||
} else if (nodeStatus.height < 1036801) {
|
||||
return 4.25;
|
||||
} else if (nodeStatus.height < 1296001) {
|
||||
return 4.0;
|
||||
} else if (nodeStatus.height < 1555201) {
|
||||
return 3.75;
|
||||
} else if (nodeStatus.height < 1814401) {
|
||||
return 3.5;
|
||||
} else if (nodeStatus.height < 2073601) {
|
||||
return 3.25;
|
||||
} else if (nodeStatus.height < 2332801) {
|
||||
return 3.0;
|
||||
} else if (nodeStatus.height < 2592001) {
|
||||
return 2.75;
|
||||
} else if (nodeStatus.height < 2851201) {
|
||||
return 2.5;
|
||||
} else if (nodeStatus.height < 3110401) {
|
||||
return 2.25;
|
||||
} else {
|
||||
return 2.0;
|
||||
}
|
||||
};
|
||||
|
||||
export const currentTier = (level): [string, string] | undefined => {
|
||||
if (level === 0) {
|
||||
return ['0', '0'];
|
||||
} else if (level === 1 || level === 2) {
|
||||
return ['1', '1 + 2'];
|
||||
} else if (level === 3 || level === 4) {
|
||||
return ['2', '3 + 4'];
|
||||
} else if (level === 5 || level === 6) {
|
||||
return ['3', '5 + 6'];
|
||||
} else if (level === 7 || level === 8) {
|
||||
return ['4', '7 + 8'];
|
||||
} else if (level === 9 || level === 10) {
|
||||
return ['5', '9 + 10'];
|
||||
} else {
|
||||
return undefined; // fallback: should never reach this point
|
||||
}
|
||||
};
|
||||
|
||||
export const tierPercent = (accountInfo, tier4Online): number => {
|
||||
if (accountInfo !== null) {
|
||||
const level = accountInfo.level;
|
||||
if (level === 0) {
|
||||
return 0;
|
||||
} else if (level === 1 || level === 2) {
|
||||
return 6;
|
||||
} else if (level === 3 || level === 4) {
|
||||
return 13;
|
||||
} else if (level === 5 || level === 6) {
|
||||
if (tier4Online < 30) {
|
||||
return 45;
|
||||
} else {
|
||||
return 19;
|
||||
}
|
||||
} else if (level === 7 || level === 8) {
|
||||
if (tier4Online < 30) {
|
||||
return 45;
|
||||
} else {
|
||||
return 26;
|
||||
}
|
||||
} else if (level === 9 || level === 10) {
|
||||
return 32;
|
||||
}
|
||||
}
|
||||
return 0; // fallback: should never reach this point
|
||||
};
|
||||
|
||||
export const countMintersInLevel = (
|
||||
level: number,
|
||||
addressLevel: AddressLevelEntry[],
|
||||
tier4Online: number
|
||||
): number | undefined => {
|
||||
if (addressLevel && addressLevel.length > 0) {
|
||||
if (level === 0) {
|
||||
const countTier0 = addressLevel[0].count;
|
||||
return countTier0;
|
||||
} else if (level === 1 || level === 2) {
|
||||
const countTier1 = addressLevel[1].count + addressLevel[2].count;
|
||||
return countTier1;
|
||||
} else if (level === 3 || level === 4) {
|
||||
const countTier2 = addressLevel[3].count + addressLevel[4].count;
|
||||
return countTier2;
|
||||
} else if (level === 5 || level === 6) {
|
||||
if (tier4Online < 30) {
|
||||
const countTier3 =
|
||||
addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count;
|
||||
return countTier3;
|
||||
} else {
|
||||
const countTier3 = addressLevel[5].count + addressLevel[6].count;
|
||||
return countTier3;
|
||||
}
|
||||
} else if (level === 7 || level === 8) {
|
||||
if (tier4Online < 30) {
|
||||
const countTier4 =
|
||||
addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count;
|
||||
return countTier4;
|
||||
} else {
|
||||
const countTier4 = addressLevel[7].count + addressLevel[8].count;
|
||||
return countTier4;
|
||||
}
|
||||
} else if (level === 9 || level === 10) {
|
||||
const countTier5 = addressLevel[9].count + addressLevel[10].count;
|
||||
return countTier5;
|
||||
}
|
||||
}
|
||||
|
||||
return undefined; // fallback: should never reach this point
|
||||
};
|
||||
|
||||
export const countReward = (
|
||||
accountInfo,
|
||||
addressLevel: AddressLevelEntry[],
|
||||
nodeStatus,
|
||||
tier4Online: number
|
||||
): number => {
|
||||
if (accountInfo != null && addressLevel && addressLevel.length > 0) {
|
||||
const level = accountInfo.level;
|
||||
if (level === 0) {
|
||||
return 0;
|
||||
} else if (level === 1 || level === 2) {
|
||||
const countReward12: number = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[1].count + addressLevel[2].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward12;
|
||||
} else if (level === 3 || level === 4) {
|
||||
const countReward34 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[3].count + addressLevel[4].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward34;
|
||||
} else if (level === 5 || level === 6) {
|
||||
if (tier4Online < 30) {
|
||||
const countReward56 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward56;
|
||||
} else {
|
||||
const countReward56 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count + addressLevel[6].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward56;
|
||||
}
|
||||
} else if (level === 7 || level === 8) {
|
||||
if (tier4Online < 30) {
|
||||
const countReward78 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward78;
|
||||
} else {
|
||||
const countReward78 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[7].count + addressLevel[8].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward78;
|
||||
}
|
||||
} else if (level === 9 || level === 10) {
|
||||
const countReward910 = parseFloat(
|
||||
(
|
||||
((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[9].count + addressLevel[10].count)
|
||||
).toFixed(8)
|
||||
);
|
||||
return countReward910;
|
||||
}
|
||||
}
|
||||
return 0; // fallback: should never reach this point
|
||||
};
|
||||
|
||||
export const countRewardDay = (
|
||||
accountInfo,
|
||||
addressLevel: AddressLevelEntry[],
|
||||
adminInfo,
|
||||
nodeHeightBlock,
|
||||
nodeStatus,
|
||||
tier4Online: number
|
||||
): number => {
|
||||
if (accountInfo != null && addressLevel && addressLevel.length > 0) {
|
||||
const level = accountInfo.level;
|
||||
const timeCalc = averageBlockDay(adminInfo, nodeHeightBlock);
|
||||
if (level === 0) {
|
||||
return 0;
|
||||
} else if (level === 1 || level === 2) {
|
||||
const countRewardDay12 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[1].count + addressLevel[2].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay12;
|
||||
} else if (level === 3 || level === 4) {
|
||||
const countRewardDay34 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[3].count + addressLevel[4].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay34;
|
||||
} else if (level === 5 || level === 6) {
|
||||
if (this.tier4Online < 30) {
|
||||
const countRewardDay56 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay56;
|
||||
} else {
|
||||
const countRewardDay56 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count + addressLevel[6].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay56;
|
||||
}
|
||||
} else if (level === 7 || level === 8) {
|
||||
if (this.tier4Online < 30) {
|
||||
const countRewardDay78 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[5].count +
|
||||
addressLevel[6].count +
|
||||
addressLevel[7].count +
|
||||
addressLevel[8].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay78;
|
||||
} else {
|
||||
const countRewardDay78 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[7].count + addressLevel[8].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay78;
|
||||
}
|
||||
} else if (level === 9 || level === 10) {
|
||||
const countRewardDay910 = parseFloat(
|
||||
(
|
||||
(((blockReward(nodeStatus) / 100) *
|
||||
tierPercent(accountInfo, tier4Online)) /
|
||||
(addressLevel[9].count + addressLevel[10].count)) *
|
||||
timeCalc
|
||||
).toFixed(8)
|
||||
);
|
||||
return countRewardDay910;
|
||||
}
|
||||
}
|
||||
return 0; // fallback: should never reach this point
|
||||
};
|
||||
|
||||
export const mintingStatus = (nodeStatus): string => {
|
||||
if (
|
||||
nodeStatus.isMintingPossible === true &&
|
||||
nodeStatus.isSynchronizing === true
|
||||
) {
|
||||
// this.cssMinting = 'blue';
|
||||
return i18n.t('core:minting.status.minting', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
});
|
||||
} else if (
|
||||
nodeStatus.isMintingPossible === true &&
|
||||
nodeStatus.isSynchronizing === false
|
||||
) {
|
||||
// this.cssMinting = 'blue';
|
||||
return i18n.t('core:minting.status.minting', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
});
|
||||
} else if (
|
||||
nodeStatus.isMintingPossible === false &&
|
||||
nodeStatus.isSynchronizing === true
|
||||
) {
|
||||
// this.cssMinting = 'red';
|
||||
return i18n.t('core:minting.status.synchronizing', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
}) +
|
||||
nodeStatus.syncPercent !==
|
||||
undefined
|
||||
? nodeStatus.syncPercent + '%'
|
||||
: '';
|
||||
} else if (
|
||||
nodeStatus.isMintingPossible === false &&
|
||||
nodeStatus.isSynchronizing === false
|
||||
) {
|
||||
// this.cssMinting = 'red';
|
||||
return i18n.t('core:minting.status.not_minting', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
});
|
||||
} else {
|
||||
return i18n.t('core:minting.status.no_status', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const averageBlockTime = (adminInfo, nodeHeightBlock) => {
|
||||
const avgBlock = adminInfo.currentTimestamp - nodeHeightBlock.timestamp;
|
||||
const averageTime = avgBlock / 1000 / 1440;
|
||||
return averageTime;
|
||||
};
|
||||
|
||||
export const averageBlockDay = (adminInfo, nodeHeightBlock) => {
|
||||
const averageBlockDay = 86400 / averageBlockTime(adminInfo, nodeHeightBlock);
|
||||
return averageBlockDay;
|
||||
};
|
||||
|
||||
export const levelUpBlocks = (accountInfo, nodeStatus): number => {
|
||||
if (
|
||||
accountInfo?.blocksMinted === undefined ||
|
||||
nodeStatus?.height === undefined ||
|
||||
accountTargetBlocks(accountInfo?.level) == undefined
|
||||
)
|
||||
return 0;
|
||||
|
||||
const nextBatch = 1000 - (nodeStatus.height % 1000);
|
||||
const countBlocks =
|
||||
accountTargetBlocks(accountInfo?.level)! -
|
||||
(accountInfo?.blocksMinted + accountInfo?.blocksMintedAdjustment) +
|
||||
1000;
|
||||
const countBlocksActual = countBlocks + nextBatch - (countBlocks % 1000);
|
||||
return countBlocksActual;
|
||||
};
|
||||
|
||||
export const levelUpDays = (
|
||||
accountInfo,
|
||||
adminInfo,
|
||||
nodeHeightBlock,
|
||||
nodeStatus
|
||||
): number | undefined => {
|
||||
if (
|
||||
accountInfo?.blocksMinted === undefined ||
|
||||
nodeStatus?.height === undefined ||
|
||||
accountTargetBlocks(accountInfo?.level) == undefined
|
||||
)
|
||||
return undefined;
|
||||
|
||||
const nextBatch = 1000 - (nodeStatus.height % 1000);
|
||||
const countBlocks =
|
||||
accountTargetBlocks(accountInfo?.level)! -
|
||||
(accountInfo?.blocksMinted + accountInfo?.blocksMintedAdjustment) +
|
||||
1000;
|
||||
|
||||
const countBlocksActual = countBlocks + nextBatch - (countBlocks % 1000);
|
||||
const countDays =
|
||||
countBlocksActual / averageBlockDay(adminInfo, nodeHeightBlock);
|
||||
return countDays;
|
||||
};
|
||||
|
||||
export const dayReward = (adminInfo, nodeHeightBlock, nodeStatus) => {
|
||||
const reward =
|
||||
averageBlockDay(adminInfo, nodeHeightBlock) * blockReward(nodeStatus);
|
||||
return reward;
|
||||
};
|
@ -73,7 +73,6 @@ export const NotAuthenticated = ({
|
||||
const [mode, setMode] = useState('list');
|
||||
const [customNodes, setCustomNodes] = useState(null);
|
||||
const [importedApiKey, setImportedApiKey] = useState(null);
|
||||
//add and edit states
|
||||
const [url, setUrl] = useState('https://');
|
||||
const [customApikey, setCustomApiKey] = useState('');
|
||||
const [showSelectApiKey, setShowSelectApiKey] = useState(false);
|
||||
@ -82,7 +81,13 @@ export const NotAuthenticated = ({
|
||||
const { showTutorial, hasSeenGettingStarted } =
|
||||
useContext(QORTAL_APP_CONTEXT);
|
||||
const theme = useTheme();
|
||||
const { t } = useTranslation(['auth', 'core']);
|
||||
const { t } = useTranslation([
|
||||
'auth',
|
||||
'core',
|
||||
'group',
|
||||
'question',
|
||||
'tutorial',
|
||||
]);
|
||||
|
||||
const importedApiKeyRef = useRef(null);
|
||||
const currentNodeRef = useRef(null);
|
||||
@ -515,9 +520,9 @@ export const NotAuthenticated = ({
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<HtmlTooltip
|
||||
@ -550,9 +555,9 @@ export const NotAuthenticated = ({
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<HtmlTooltip
|
||||
@ -628,18 +633,14 @@ export const NotAuthenticated = ({
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
alignItems: 'center',
|
||||
flexDirection: 'column',
|
||||
outlineWidth: '0.5px',
|
||||
outlineStyle: 'solid',
|
||||
outlineColor:
|
||||
theme.palette.mode === 'dark'
|
||||
? 'rgba(255, 255, 255, 0.5)'
|
||||
: 'rgba(0, 0, 0, 0.3)',
|
||||
padding: '20px 30px',
|
||||
borderRadius: '8px',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '10px',
|
||||
outlineStyle: 'solid',
|
||||
outlineWidth: '0.5px',
|
||||
padding: '20px 30px',
|
||||
}}
|
||||
>
|
||||
<>
|
||||
@ -782,24 +783,22 @@ export const NotAuthenticated = ({
|
||||
<DialogTitle
|
||||
id="alert-dialog-title"
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
color: theme.palette.text.primary,
|
||||
fontWeight: 'bold',
|
||||
opacity: 1,
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
{t('auth:node.custom_many', { postProcess: 'capitalizeFirstChar' })}
|
||||
:
|
||||
{t('auth:node.custom_many', { postProcess: 'capitalizeAll' })}
|
||||
</DialogTitle>
|
||||
|
||||
<DialogContent>
|
||||
<Box
|
||||
sx={{
|
||||
width: '100% !important',
|
||||
overflow: 'auto',
|
||||
height: '60vh',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
height: '60vh',
|
||||
overflow: 'auto',
|
||||
width: '100% !important',
|
||||
}}
|
||||
>
|
||||
{mode === 'list' && (
|
||||
@ -819,7 +818,6 @@ export const NotAuthenticated = ({
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
}}
|
||||
>
|
||||
@ -828,10 +826,10 @@ export const NotAuthenticated = ({
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<Button
|
||||
@ -885,7 +883,6 @@ export const NotAuthenticated = ({
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
}}
|
||||
>
|
||||
@ -894,10 +891,10 @@ export const NotAuthenticated = ({
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<Button
|
||||
@ -978,10 +975,10 @@ export const NotAuthenticated = ({
|
||||
{mode === 'add-node' && (
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '10px',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<Input
|
||||
@ -1071,7 +1068,6 @@ export const NotAuthenticated = ({
|
||||
id="alert-dialog-title"
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
color: theme.palette.text.primary,
|
||||
fontWeight: 'bold',
|
||||
opacity: 1,
|
||||
}}
|
||||
|
@ -4,6 +4,7 @@ import { Box, Tooltip, Typography, useTheme } from '@mui/material';
|
||||
import { BarSpinner } from '../common/Spinners/BarSpinner/BarSpinner';
|
||||
import { formatDate } from '../utils/time';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import i18next from 'i18next';
|
||||
|
||||
function getAverageLtcPerQort(trades) {
|
||||
let totalQort = 0;
|
||||
@ -30,14 +31,15 @@ function getTwoWeeksAgoTimestamp() {
|
||||
return now.getTime(); // Get timestamp in milliseconds
|
||||
}
|
||||
|
||||
function formatWithCommasAndDecimals(number) {
|
||||
return Number(number).toLocaleString();
|
||||
function formatWithCommasAndDecimals(number: number) {
|
||||
const locale = i18next.language;
|
||||
return Number(number).toLocaleString(locale);
|
||||
}
|
||||
|
||||
export const QortPrice = () => {
|
||||
const [ltcPerQort, setLtcPerQort] = useState(null);
|
||||
const [supply, setSupply] = useState(null);
|
||||
const [lastBlock, setLastBlock] = useState(null);
|
||||
const [supply, setSupply] = useState<string>('');
|
||||
const [lastBlock, setLastBlock] = useState<string>('');
|
||||
const [loading, setLoading] = useState(true);
|
||||
const { t } = useTranslation(['core', 'tutorial']);
|
||||
const theme = useTheme();
|
||||
@ -45,12 +47,10 @@ export const QortPrice = () => {
|
||||
const getPrice = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
|
||||
const response = await fetch(
|
||||
`${getBaseApiReact()}/crosschain/trades?foreignBlockchain=LITECOIN&minimumTimestamp=${getTwoWeeksAgoTimestamp()}&limit=20&reverse=true`
|
||||
);
|
||||
const data = await response.json();
|
||||
|
||||
setLtcPerQort(getAverageLtcPerQort(data));
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
@ -62,10 +62,8 @@ export const QortPrice = () => {
|
||||
const getLastBlock = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
|
||||
const response = await fetch(`${getBaseApiReact()}/blocks/last`);
|
||||
const data = await response.json();
|
||||
|
||||
setLastBlock(data);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
@ -77,13 +75,11 @@ export const QortPrice = () => {
|
||||
const getSupplyInCirculation = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
|
||||
const response = await fetch(
|
||||
`${getBaseApiReact()}/stats/supply/circulating`
|
||||
);
|
||||
const data = await response.text();
|
||||
formatWithCommasAndDecimals(data);
|
||||
setSupply(formatWithCommasAndDecimals(data));
|
||||
setSupply(formatWithCommasAndDecimals(parseFloat(data)));
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
} finally {
|
||||
@ -249,7 +245,7 @@ export const QortPrice = () => {
|
||||
fontSize: '1rem',
|
||||
}}
|
||||
>
|
||||
{lastBlock?.height}
|
||||
{formatWithCommasAndDecimals(lastBlock?.height)}
|
||||
</Typography>
|
||||
)}
|
||||
</Box>
|
||||
|
@ -293,9 +293,9 @@ export const RegisterName = ({
|
||||
{isNameAvailable === Availability.AVAILABLE && (
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '5px',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<CheckIcon
|
||||
|
@ -16,15 +16,21 @@ import { getBaseApiReact } from '../../App';
|
||||
import { executeEvent } from '../../utils/events';
|
||||
import { useAtom } from 'jotai';
|
||||
import { memberGroupsAtom, txListAtom } from '../../atoms/global';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
export const TaskManager = ({ getUserInfo }) => {
|
||||
const [memberGroups] = useAtom(memberGroupsAtom);
|
||||
|
||||
const [txList, setTxList] = useAtom(txListAtom);
|
||||
|
||||
const [open, setOpen] = React.useState(false);
|
||||
const intervals = useRef({});
|
||||
const theme = useTheme();
|
||||
const { t } = useTranslation([
|
||||
'auth',
|
||||
'core',
|
||||
'group',
|
||||
'question',
|
||||
'tutorial',
|
||||
]);
|
||||
|
||||
const handleClick = () => {
|
||||
setOpen((prev) => !prev);
|
||||
@ -199,7 +205,11 @@ export const TaskManager = ({ getUserInfo }) => {
|
||||
)}
|
||||
</ListItemIcon>
|
||||
|
||||
<ListItemText primary="Ongoing Transactions" />
|
||||
<ListItemText
|
||||
primary={t('core:message.generic.ongoing_transactions', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
/>
|
||||
{open ? <ExpandLess /> : <ExpandMore />}
|
||||
</ListItemButton>
|
||||
|
||||
|
@ -41,21 +41,16 @@ export const ThemeProvider = ({ children }) => {
|
||||
userThemes.find((theme) => theme.id === currentThemeId) || defaultTheme;
|
||||
|
||||
const muiTheme = useMemo(() => {
|
||||
if (themeMode === 'light') {
|
||||
return createTheme({
|
||||
...lightThemeOptions,
|
||||
palette: {
|
||||
...currentTheme.light,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
return createTheme({
|
||||
...lightThemeOptions,
|
||||
palette: {
|
||||
...currentTheme.dark,
|
||||
},
|
||||
});
|
||||
}
|
||||
const baseThemeOptions =
|
||||
themeMode === 'light' ? lightThemeOptions : darkThemeOptions;
|
||||
|
||||
const palette =
|
||||
themeMode === 'light' ? currentTheme.light : currentTheme.dark;
|
||||
|
||||
return createTheme({
|
||||
...baseThemeOptions,
|
||||
palette,
|
||||
});
|
||||
}, [themeMode, currentTheme]);
|
||||
|
||||
const saveSettings = (
|
||||
|
@ -306,7 +306,6 @@ export default function ThemeManager() {
|
||||
<DialogTitle
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
color: theme.palette.text.primary,
|
||||
fontWeight: 'bold',
|
||||
opacity: 1,
|
||||
}}
|
||||
|
@ -19,26 +19,15 @@ const ThemeSelector = () => {
|
||||
|
||||
return (
|
||||
<Box ref={selectorRef}>
|
||||
<Tooltip
|
||||
title={
|
||||
themeMode === 'dark'
|
||||
? t('core:theme.light_mode', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})
|
||||
: t('core:theme.dark_mode', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})
|
||||
}
|
||||
<IconButton
|
||||
onClick={toggleTheme}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<IconButton
|
||||
onClick={toggleTheme}
|
||||
sx={{
|
||||
color: theme.palette.text.secondary,
|
||||
}}
|
||||
>
|
||||
{themeMode === 'dark' ? <LightModeIcon /> : <DarkModeIcon />}
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
{themeMode === 'dark' ? <LightModeIcon /> : <DarkModeIcon />}
|
||||
</IconButton>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
@ -41,15 +41,12 @@ export const Tutorials = () => {
|
||||
>
|
||||
<Tabs
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': {
|
||||
'&.MuiTabs-indicator': {
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
}}
|
||||
value={multiNumber}
|
||||
onChange={(e, value) => setMultiNumber(value)}
|
||||
aria-label={t('core:basic_tabs_example', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
>
|
||||
{openTutorialModal?.multi?.map((item, index) => {
|
||||
return (
|
||||
@ -75,10 +72,11 @@ export const Tutorials = () => {
|
||||
})}
|
||||
onClick={handleClose}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
position: 'absolute',
|
||||
right: 8,
|
||||
top: 8,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
@ -123,10 +121,11 @@ export const Tutorials = () => {
|
||||
})}
|
||||
onClick={handleClose}
|
||||
sx={{
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
position: 'absolute',
|
||||
right: 8,
|
||||
top: 8,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
>
|
||||
<CloseIcon />
|
||||
|
@ -18,6 +18,8 @@ import {
|
||||
CircularProgress,
|
||||
useTheme,
|
||||
Autocomplete,
|
||||
IconButton,
|
||||
ClickAwayListener,
|
||||
} from '@mui/material';
|
||||
import {
|
||||
getAddressInfo,
|
||||
@ -28,7 +30,7 @@ import { getNameInfo } from '../Group/Group';
|
||||
import AccountCircleIcon from '@mui/icons-material/AccountCircle';
|
||||
import { Spacer } from '../../common/Spacer';
|
||||
import { formatTimestamp } from '../../utils/time';
|
||||
import CloseFullscreenIcon from '@mui/icons-material/CloseFullscreen';
|
||||
import CloseIcon from '@mui/icons-material/Close';
|
||||
import {
|
||||
executeEvent,
|
||||
subscribeToEvent,
|
||||
@ -160,489 +162,481 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
|
||||
|
||||
return (
|
||||
<DrawerUserLookup open={isOpenDrawerLookup} setOpen={setIsOpenDrawerLookup}>
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
height: '100vh',
|
||||
overflow: 'hidden',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
flexShrink: 0,
|
||||
gap: '5px',
|
||||
}}
|
||||
>
|
||||
<Autocomplete
|
||||
value={nameOrAddress}
|
||||
onChange={(event: any, newValue: string | null) => {
|
||||
if (!newValue) {
|
||||
setNameOrAddress('');
|
||||
return;
|
||||
}
|
||||
setNameOrAddress(newValue);
|
||||
lookupFunc(newValue);
|
||||
}}
|
||||
inputValue={inputValue}
|
||||
onInputChange={(event, newInputValue) => {
|
||||
setInputValue(newInputValue);
|
||||
}}
|
||||
id="controllable-states-demo"
|
||||
loading={isLoading}
|
||||
noOptionsText={t('core:option_no', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
options={options}
|
||||
sx={{ width: 300 }}
|
||||
renderInput={(params) => (
|
||||
<TextField
|
||||
autoFocus
|
||||
autoComplete="off"
|
||||
{...params}
|
||||
label={t('auth:address_name', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' && nameOrAddress) {
|
||||
lookupFunc(inputValue);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
|
||||
<ButtonBase
|
||||
sx={{
|
||||
marginLeft: 'auto',
|
||||
}}
|
||||
onClick={() => {
|
||||
onClose();
|
||||
}}
|
||||
>
|
||||
<CloseFullscreenIcon
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
/>
|
||||
</ButtonBase>
|
||||
</Box>
|
||||
|
||||
<ClickAwayListener onClickAway={onClose}>
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
flexGrow: 1,
|
||||
overflow: 'auto',
|
||||
height: '100vh',
|
||||
overflow: 'hidden',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
{!isLoadingUser && errorMessage && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
marginTop: '40px',
|
||||
width: '100%',
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
display: 'flex',
|
||||
gap: '5px',
|
||||
}}
|
||||
>
|
||||
<Autocomplete
|
||||
value={nameOrAddress}
|
||||
onChange={(event: any, newValue: string | null) => {
|
||||
if (!newValue) {
|
||||
setNameOrAddress('');
|
||||
return;
|
||||
}
|
||||
setNameOrAddress(newValue);
|
||||
lookupFunc(newValue);
|
||||
}}
|
||||
>
|
||||
<Typography>{errorMessage}</Typography>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{isLoadingUser && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
marginTop: '40px',
|
||||
width: '100%',
|
||||
inputValue={inputValue}
|
||||
onInputChange={(event, newInputValue) => {
|
||||
setInputValue(newInputValue);
|
||||
}}
|
||||
>
|
||||
<CircularProgress
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
id="controllable-states-demo"
|
||||
loading={isLoading}
|
||||
noOptionsText={t('core:option_no', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
options={options}
|
||||
sx={{ flexGrow: 1 }}
|
||||
renderInput={(params) => (
|
||||
<TextField
|
||||
autoFocus
|
||||
autoComplete="off"
|
||||
{...params}
|
||||
label={t('auth:address_name', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' && nameOrAddress) {
|
||||
lookupFunc(inputValue);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
{!isLoadingUser && addressInfo && (
|
||||
<>
|
||||
<Spacer height="30px" />
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
flexGrow: 1,
|
||||
overflow: 'auto',
|
||||
}}
|
||||
>
|
||||
{!isLoadingUser && errorMessage && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
flexWrap: 'wrap',
|
||||
gap: '20px',
|
||||
justifyContent: 'center',
|
||||
marginTop: '40px',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Card
|
||||
<Typography>{errorMessage}</Typography>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{isLoadingUser && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
marginTop: '40px',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<CircularProgress
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{!isLoadingUser && addressInfo && (
|
||||
<>
|
||||
<Spacer height="30px" />
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: 'center',
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
minHeight: '200px',
|
||||
minWidth: '320px',
|
||||
padding: '15px',
|
||||
flexDirection: 'row',
|
||||
flexWrap: 'wrap',
|
||||
gap: '20px',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
<Card
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
alignItems: 'center',
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
minHeight: '200px',
|
||||
minWidth: '320px',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
{addressInfo?.name ??
|
||||
t('auth:message.error.name_not_registered', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
<Typography
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
{addressInfo?.name ??
|
||||
t('auth:message.error.name_not_registered', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
<Spacer height="20px" />
|
||||
<Spacer height="20px" />
|
||||
|
||||
<Divider>
|
||||
{addressInfo?.name ? (
|
||||
<Avatar
|
||||
sx={{
|
||||
height: '50px',
|
||||
width: '50px',
|
||||
'& img': {
|
||||
objectFit: 'fill',
|
||||
},
|
||||
}}
|
||||
alt={addressInfo?.name}
|
||||
src={`${getBaseApiReact()}/arbitrary/THUMBNAIL/${
|
||||
addressInfo?.name
|
||||
}/qortal_avatar?async=true`}
|
||||
>
|
||||
<Divider>
|
||||
{addressInfo?.name ? (
|
||||
<Avatar
|
||||
sx={{
|
||||
height: '50px',
|
||||
width: '50px',
|
||||
'& img': {
|
||||
objectFit: 'fill',
|
||||
},
|
||||
}}
|
||||
alt={addressInfo?.name}
|
||||
src={`${getBaseApiReact()}/arbitrary/THUMBNAIL/${
|
||||
addressInfo?.name
|
||||
}/qortal_avatar?async=true`}
|
||||
>
|
||||
<AccountCircleIcon
|
||||
sx={{
|
||||
fontSize: '50px',
|
||||
}}
|
||||
/>
|
||||
</Avatar>
|
||||
) : (
|
||||
<AccountCircleIcon
|
||||
sx={{
|
||||
fontSize: '50px',
|
||||
}}
|
||||
/>
|
||||
</Avatar>
|
||||
) : (
|
||||
<AccountCircleIcon
|
||||
sx={{
|
||||
fontSize: '50px',
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Divider>
|
||||
)}
|
||||
</Divider>
|
||||
|
||||
<Spacer height="20px" />
|
||||
<Spacer height="20px" />
|
||||
|
||||
<Typography
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
{t('core:level', { postProcess: 'capitalizeFirstChar' })}{' '}
|
||||
{addressInfo?.level}
|
||||
</Typography>
|
||||
</Card>
|
||||
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '20px',
|
||||
minHeight: '200px',
|
||||
minWidth: '320px',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
<Typography
|
||||
sx={{
|
||||
textAlign: 'center',
|
||||
}}
|
||||
>
|
||||
{t('core:level', { postProcess: 'capitalizeFirstChar' })}{' '}
|
||||
{addressInfo?.level}
|
||||
</Typography>
|
||||
</Card>
|
||||
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '20px',
|
||||
justifyContent: 'space-between',
|
||||
width: '100%',
|
||||
minHeight: '200px',
|
||||
minWidth: '320px',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexShrink: 0,
|
||||
gap: '20px',
|
||||
justifyContent: 'space-between',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
flexShrink: 0,
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('auth:address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
</Box>
|
||||
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(addressInfo?.address);
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
textAlign: 'end',
|
||||
}}
|
||||
>
|
||||
{addressInfo?.address}
|
||||
</Typography>
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
</Box>
|
||||
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
gap: '20px',
|
||||
justifyContent: 'space-between',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('auth:address', {
|
||||
{t('core:balance', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
<Typography>{addressInfo?.balance}</Typography>
|
||||
</Box>
|
||||
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor: theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
<Spacer height="20px" />
|
||||
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={() => {
|
||||
executeEvent('openPaymentInternal', {
|
||||
address: addressInfo?.address,
|
||||
name: addressInfo?.name,
|
||||
});
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(addressInfo?.address);
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
textAlign: 'end',
|
||||
}}
|
||||
>
|
||||
{addressInfo?.address}
|
||||
</Typography>
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
</Box>
|
||||
{t('core:action.send_qort', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Button>
|
||||
</Card>
|
||||
</Box>
|
||||
</>
|
||||
)}
|
||||
|
||||
<Spacer height="40px" />
|
||||
|
||||
{isLoadingPayments && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<CircularProgress
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{!isLoadingPayments && addressInfo && (
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
overflow: 'auto',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('core:message.generic.most_recent_payment', {
|
||||
count: 20,
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
<Spacer height="20px" />
|
||||
|
||||
{!isLoadingPayments && payments?.length === 0 && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
gap: '20px',
|
||||
justifyContent: 'space-between',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('core:balance', {
|
||||
{t('core:message.generic.no_payments', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
<Typography>{addressInfo?.balance}</Typography>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
<Spacer height="20px" />
|
||||
|
||||
<Button
|
||||
variant="contained"
|
||||
onClick={() => {
|
||||
executeEvent('openPaymentInternal', {
|
||||
address: addressInfo?.address,
|
||||
name: addressInfo?.name,
|
||||
});
|
||||
}}
|
||||
>
|
||||
{t('core:action.send_qort', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Button>
|
||||
</Card>
|
||||
</Box>
|
||||
</>
|
||||
)}
|
||||
|
||||
<Spacer height="40px" />
|
||||
|
||||
{isLoadingPayments && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<CircularProgress
|
||||
sx={{
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{!isLoadingPayments && addressInfo && (
|
||||
<Card
|
||||
sx={{
|
||||
background: theme.palette.background.default,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
overflow: 'auto',
|
||||
padding: '15px',
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('core:message.generic.most_recent_payment', {
|
||||
count: 20,
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
|
||||
<Spacer height="20px" />
|
||||
|
||||
{!isLoadingPayments && payments?.length === 0 && (
|
||||
<Box
|
||||
sx={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<Typography>
|
||||
{t('core:message.generic.no_payments', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</Typography>
|
||||
</Box>
|
||||
)}
|
||||
|
||||
<Table>
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
{t('core:sender', { postProcess: 'capitalizeFirstChar' })}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{t('core:receiver', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{t('core:amount', { postProcess: 'capitalizeFirstChar' })}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{t('core:time.time', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
|
||||
<TableBody>
|
||||
{payments.map((payment, index) => (
|
||||
<TableRow key={payment?.signature}>
|
||||
<Table>
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor:
|
||||
theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(
|
||||
payment?.creatorAddress
|
||||
);
|
||||
}}
|
||||
>
|
||||
{formatAddress(payment?.creatorAddress)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
{t('core:sender', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
|
||||
<TableCell>
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor:
|
||||
theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(payment?.recipient);
|
||||
}}
|
||||
>
|
||||
{formatAddress(payment?.recipient)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
{t('core:receiver', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
|
||||
<TableCell>{payment?.amount}</TableCell>
|
||||
|
||||
<TableCell>
|
||||
{formatTimestamp(payment?.timestamp)}
|
||||
{t('core:amount', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{t('core:time.time', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
</TableBody>
|
||||
</Table>
|
||||
</Card>
|
||||
)}
|
||||
</TableHead>
|
||||
|
||||
<TableBody>
|
||||
{payments.map((payment, index) => (
|
||||
<TableRow key={payment?.signature}>
|
||||
<TableCell>
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor:
|
||||
theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(
|
||||
payment?.creatorAddress
|
||||
);
|
||||
}}
|
||||
>
|
||||
{formatAddress(payment?.creatorAddress)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
</TableCell>
|
||||
|
||||
<TableCell>
|
||||
<Tooltip
|
||||
title={
|
||||
<span
|
||||
style={{
|
||||
color: theme.palette.text.primary,
|
||||
fontSize: '14px',
|
||||
fontWeight: 700,
|
||||
}}
|
||||
>
|
||||
{t('auth:action.copy_address', {
|
||||
postProcess: 'capitalizeFirstChar',
|
||||
})}
|
||||
</span>
|
||||
}
|
||||
placement="bottom"
|
||||
arrow
|
||||
sx={{ fontSize: '24' }}
|
||||
slotProps={{
|
||||
tooltip: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
backgroundColor:
|
||||
theme.palette.background.default,
|
||||
},
|
||||
},
|
||||
arrow: {
|
||||
sx: {
|
||||
color: theme.palette.text.primary,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
navigator.clipboard.writeText(
|
||||
payment?.recipient
|
||||
);
|
||||
}}
|
||||
>
|
||||
{formatAddress(payment?.recipient)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
</TableCell>
|
||||
|
||||
<TableCell>{payment?.amount}</TableCell>
|
||||
|
||||
<TableCell>
|
||||
{formatTimestamp(payment?.timestamp)}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
</TableBody>
|
||||
</Table>
|
||||
</Card>
|
||||
)}
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
</ClickAwayListener>
|
||||
</DrawerUserLookup>
|
||||
);
|
||||
};
|
||||
|
@ -207,7 +207,7 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => {
|
||||
if (isLoading) return null;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Box>
|
||||
{wallets?.length === 0 || !wallets ? (
|
||||
<>
|
||||
<Typography>
|
||||
@ -469,7 +469,7 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => {
|
||||
</Typography>
|
||||
</DialogActions>
|
||||
</Dialog>
|
||||
</div>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
@ -562,6 +562,8 @@ const WalletItem = ({ wallet, updateWalletItem, idx, setSelectedWallet }) => {
|
||||
<IconButton
|
||||
sx={{
|
||||
alignSelf: 'flex-start',
|
||||
bgcolor: theme.palette.background.default,
|
||||
color: theme.palette.text.primary,
|
||||
}}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
|
@ -4,6 +4,7 @@ import HttpBackend from 'i18next-http-backend';
|
||||
import LanguageDetector from 'i18next-browser-languagedetector';
|
||||
import {
|
||||
capitalizeAll,
|
||||
capitalizeEachFirstChar,
|
||||
capitalizeFirstChar,
|
||||
capitalizeFirstWord,
|
||||
} from './processors';
|
||||
@ -42,6 +43,7 @@ i18n
|
||||
.use(initReactI18next)
|
||||
.use(LanguageDetector)
|
||||
.use(capitalizeAll as any)
|
||||
.use(capitalizeEachFirstChar as any)
|
||||
.use(capitalizeFirstChar as any)
|
||||
.use(capitalizeFirstWord as any)
|
||||
.init({
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "offizielle Apps",
|
||||
"attachment": "Anhang",
|
||||
"balance": "Gleichgewicht:",
|
||||
"basic_tabs_example": "Basic Tabs Beispiel",
|
||||
"category": "Kategorie",
|
||||
"category_other": "Kategorien",
|
||||
"chat": "Chat",
|
||||
@ -256,6 +255,7 @@
|
||||
"no_pinned_changes": "Sie haben derzeit keine Änderungen an Ihren angestellten Apps",
|
||||
"no_results": "Keine Ergebnisse",
|
||||
"one_app_per_name": "Hinweis: Derzeit ist pro Namen nur eine App und Website zulässig.",
|
||||
"ongoing_transactions": "laufende Transaktionen",
|
||||
"opened": "geöffnet",
|
||||
"overwrite_qdn": "überschreibt zu QDN",
|
||||
"password_confirm": "Bitte bestätigen Sie ein Passwort",
|
||||
@ -280,8 +280,9 @@
|
||||
"settings": "Sie verwenden den Export-/Import -Weg zum Speichern von Einstellungen.",
|
||||
"space_for_admins": "Entschuldigung, dieser Raum gilt nur für Administratoren.",
|
||||
"unread_messages": "ungelesene Nachrichten unten",
|
||||
"unsaved_changes": "Sie haben nicht gespeicherte Änderungen an Ihren angestellten Apps. Speichern Sie sie bei QDN.",
|
||||
"updating": "Aktualisierung"
|
||||
"unsaved_changes": "sie haben nicht gespeicherte Änderungen an Ihren angestellten Apps. Speichern Sie sie bei QDN.",
|
||||
"updating": "aktualisierung",
|
||||
"wait": "bitte warten"
|
||||
},
|
||||
"message": "Nachricht",
|
||||
"promotion_text": "Promotionstext",
|
||||
@ -302,12 +303,6 @@
|
||||
"reset_qdn": "Mögen Sie Ihre aktuellen lokalen Änderungen nicht? Möchten Sie auf Ihre gespeicherten QDN -Apps zurücksetzen?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(Prägung)",
|
||||
"not_minting": "(nicht punktieren)",
|
||||
"synchronized": "synchronisiert",
|
||||
"synchronizing": "Synchronisierung"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "Ihre Kaufbestellung wurde eingereicht",
|
||||
"published": "erfolgreich veröffentlicht. Bitte warten Sie ein paar Minuten, bis das Netzwerk die Änderungen vorschreibt.",
|
||||
@ -318,7 +313,34 @@
|
||||
"voted": "erfolgreich abgestimmt. Bitte warten Sie ein paar Minuten, bis das Netzwerk die Änderungen vorschreibt."
|
||||
}
|
||||
},
|
||||
"minting_status": "Münzstatus",
|
||||
"minting": {
|
||||
"account_details": "Minting-Kontodetails",
|
||||
"actions": "Minting-Aktionen",
|
||||
"average_blocktime": "durchschnittliche Qortal-Blockzeit",
|
||||
"average_blocks_per_day": "durchschnittliche Blöcke pro Tag",
|
||||
"average_created_qorts_per_day": "durchschnittlich erstellte QORTs pro Tag",
|
||||
"blockchain_statistics": "Blockchain-Statistiken",
|
||||
"blocks_next_level": "Blöcke bis zum nächsten Level",
|
||||
"current_level": "aktuelles Level",
|
||||
"current_status": "aktueller Status",
|
||||
"current_tier": "aktuelle Stufe",
|
||||
"current_tier_content": "{{ tier }} (Stufe {{ levels }})",
|
||||
"details": "Minting-Details",
|
||||
"next_level": "Mit 24/7-Minting erreichst du <strong>Level {{ level }}</strong> in <strong>{{ count }} Tagen</strong>",
|
||||
"rewards_info": "Informationen zu Minting-Belohnungen",
|
||||
"reward_per_block": "geschätzte Belohnung pro Block",
|
||||
"reward_per_day": "geschätzte Belohnung pro Tag",
|
||||
"status": {
|
||||
"minting": "(Prägung)",
|
||||
"not_minting": "(nicht punktieren)",
|
||||
"no_status": "kein Status",
|
||||
"synchronized": "synchronisiert",
|
||||
"synchronizing": "Synchronisierung..."
|
||||
},
|
||||
"status_title": "Münzstatus",
|
||||
"tier_share_per_block": "Stufenanteil pro Block",
|
||||
"total_minter_in_tier": "Gesamtanzahl der Minter in dieser Stufe"
|
||||
},
|
||||
"name": "Name",
|
||||
"name_app": "Name/App",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "Minting-Konto:",
|
||||
"minting_keys_per_node": "Nur 2 Minting-Schlüssel pro Node erlaubt. Bitte entferne einen.",
|
||||
"minting_keys_per_node_different": "Nur 2 Minting-Schlüssel pro Node erlaubt. Entferne einen, um einen anderen hinzuzufügen.",
|
||||
"next_level": "Verbleibende Blöcke bis zum nächsten Level:",
|
||||
"node_minting": "Dieser Node mintet:",
|
||||
"node_minting_account": "Minting-Konten dieses Nodes",
|
||||
"node_minting_key": "Du hast bereits einen Minting-Schlüssel für dieses Konto auf diesem Node",
|
||||
"no_announcement": "Keine Ankündigungen",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "official Apps",
|
||||
"attachment": "attachment",
|
||||
"balance": "balance:",
|
||||
"basic_tabs_example": "basic tabs example",
|
||||
"category": "category",
|
||||
"category_other": "categories",
|
||||
"chat": "chat",
|
||||
@ -218,25 +217,26 @@
|
||||
"already_voted": "you've already voted.",
|
||||
"avatar_size": "{{ size }} KB max. for GIFS",
|
||||
"benefits_qort": "benefits of having QORT",
|
||||
"building": "building",
|
||||
"building_app": "building app",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"building": "building",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
"confirmed": "confirmed",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"devmode_local_node": "please use your local node for dev mode! Logout and use Local node.",
|
||||
"downloading": "downloading",
|
||||
"downloading_decrypting_app": "downloading and decrypting private app.",
|
||||
"downloading": "downloading",
|
||||
"edited": "edited",
|
||||
"editing_message": "editing message",
|
||||
"encrypted": "encrypted",
|
||||
"encrypted_not": "not encrypted",
|
||||
"encrypted": "encrypted",
|
||||
"fee_qort": "fee: {{ message }} QORT",
|
||||
"fetching_data": "fetching app data",
|
||||
"foreign_fee": "foreign fee: {{ message }}",
|
||||
"get_qort_trade_portal": "get QORT using Qortal's crosschain trade portal",
|
||||
"minimal_qort_balance": "having at least {{ quantity }} QORT in your balance (4 qort balance for chat, 1.25 for name, 0.75 for some transactions)",
|
||||
"mentioned": "mentioned",
|
||||
"message_with_image": "this message already has an image",
|
||||
"minimal_qort_balance": "having at least {{ quantity }} QORT in your balance (4 qort balance for chat, 1.25 for name, 0.75 for some transactions)",
|
||||
"most_recent_payment": "{{ count }} most recent payment",
|
||||
"name_available": "{{ name }} is available",
|
||||
"name_benefits": "benefits of a name",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "you currently do not have any changes to your pinned apps",
|
||||
"no_results": "no results",
|
||||
"one_app_per_name": "note: Currently, only one App and Website is allowed per Name.",
|
||||
"ongoing_transactions": "ongoing transactions",
|
||||
"opened": "opened",
|
||||
"overwrite_qdn": "overwrite to QDN",
|
||||
"password_confirm": "please confirm a password",
|
||||
@ -281,7 +282,8 @@
|
||||
"space_for_admins": "sorry, this space is only for Admins.",
|
||||
"unread_messages": "unread messages below",
|
||||
"unsaved_changes": "you have unsaved changes to your pinned apps. Save them to QDN.",
|
||||
"updating": "updating"
|
||||
"updating": "updating",
|
||||
"wait": "please wait"
|
||||
},
|
||||
"message": "message",
|
||||
"promotion_text": "promotion text",
|
||||
@ -302,12 +304,7 @@
|
||||
"reset_qdn": "don't like your current local changes? Would you like to reset to your saved QDN pinned apps?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(minting)",
|
||||
"not_minting": "(not minting)",
|
||||
"synchronized": "synchronized",
|
||||
"synchronizing": "synchronizing"
|
||||
},
|
||||
|
||||
"success": {
|
||||
"order_submitted": "your buy order was submitted",
|
||||
"published": "successfully published. Please wait a couple minutes for the network to propogate the changes.",
|
||||
@ -318,7 +315,34 @@
|
||||
"voted": "successfully voted. Please wait a couple minutes for the network to propogate the changes."
|
||||
}
|
||||
},
|
||||
"minting_status": "minting status",
|
||||
"minting": {
|
||||
"account_details": "minting account details",
|
||||
"actions": "minting actions",
|
||||
"average_blocktime": "average qortal blocktime",
|
||||
"average_blocks_per_day": "average blocks per day",
|
||||
"average_created_qorts_per_day": "average created QORT per day",
|
||||
"blockchain_statistics": "blockchain statistics",
|
||||
"blocks_next_level": "blocks to nexl level",
|
||||
"current_level": "current level",
|
||||
"current_status": "current status",
|
||||
"current_tier": "current tier",
|
||||
"current_tier_content": "{{ tier }} (Levels {{ levels }})",
|
||||
"details": "minting details",
|
||||
"next_level": "with a 24/7 minting you will reach <strong>level {{ level }}</strong> in <strong>{{ count }} days</strong>",
|
||||
"rewards_info": "minting rewards info",
|
||||
"reward_per_block": "estimated reward per block",
|
||||
"reward_per_day": "estimated reward per day",
|
||||
"status": {
|
||||
"minting": "(minting)",
|
||||
"not_minting": "(not minting)",
|
||||
"no_status": "no status",
|
||||
"synchronized": "synchronized",
|
||||
"synchronizing": "synchronizing..."
|
||||
},
|
||||
"status_title": "minting status",
|
||||
"tier_share_per_block": "tier share per block",
|
||||
"total_minter_in_tier": "total minters in the tier"
|
||||
},
|
||||
"name": "name",
|
||||
"name_app": "name/App",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "minting account:",
|
||||
"minting_keys_per_node": "only 2 minting keys are allowed per node. Please remove one if you would like to mint with this account.",
|
||||
"minting_keys_per_node_different": "only 2 minting keys are allowed per node. Please remove one if you would like to add a different account.",
|
||||
"next_level": "blocks remaining until next level:",
|
||||
"node_minting": "this node is minting:",
|
||||
"node_minting_account": "node's minting accounts",
|
||||
"node_minting_key": "you currently have a minting key for this account attached to this node",
|
||||
"no_announcement": "no announcements",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "aplicaciones oficiales",
|
||||
"attachment": "adjunto",
|
||||
"balance": "balance:",
|
||||
"basic_tabs_example": "Ejemplo de pestañas básicas",
|
||||
"category": "categoría",
|
||||
"category_other": "categorías",
|
||||
"chat": "charlar",
|
||||
@ -219,7 +218,8 @@
|
||||
"avatar_size": "{{ size }} KB max. for GIFS",
|
||||
"benefits_qort": "beneficios de tener Qort",
|
||||
"building": "edificio",
|
||||
"building_app": "Aplicación de construcción",
|
||||
"building_app": "aplicación de construcción",
|
||||
"confirmed": "confirmado",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "Actualmente no tiene ningún cambio en sus aplicaciones fijadas",
|
||||
"no_results": "Sin resultados",
|
||||
"one_app_per_name": "Nota: Actualmente, solo se permite una aplicación y un sitio web por nombre.",
|
||||
"ongoing_transactions": "transacciones en curso",
|
||||
"opened": "abierto",
|
||||
"overwrite_qdn": "sobrescribir a QDN",
|
||||
"password_confirm": "Confirme una contraseña",
|
||||
@ -277,11 +278,12 @@
|
||||
"select_image": "Seleccione una imagen para un logotipo",
|
||||
"select_zip": "Seleccione el archivo .zip que contenga contenido estático:",
|
||||
"sending": "envío...",
|
||||
"settings": "Está utilizando la forma de exportación/importación de la configuración de ahorro.",
|
||||
"space_for_admins": "Lo siento, este espacio es solo para administradores.",
|
||||
"unread_messages": "Mensajes no leídos a continuación",
|
||||
"unsaved_changes": "Tiene cambios no salvos en sus aplicaciones fijadas. Guárdelos a QDN.",
|
||||
"updating": "actualización"
|
||||
"settings": "está utilizando la forma de exportación/importación de la configuración de ahorro.",
|
||||
"space_for_admins": "lo siento, este espacio es solo para administradores.",
|
||||
"unread_messages": "mensajes no leídos a continuación",
|
||||
"unsaved_changes": "tiene cambios no salvos en sus aplicaciones fijadas. Guárdelos a QDN.",
|
||||
"updating": "actualización",
|
||||
"wait": "espera por favor"
|
||||
},
|
||||
"message": "mensaje",
|
||||
"promotion_text": "texto de promoción",
|
||||
@ -302,12 +304,6 @@
|
||||
"reset_qdn": "¿No te gustan tus cambios locales actuales? ¿Le gustaría restablecer a sus aplicaciones guardadas de QDN guardadas?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(acuñado)",
|
||||
"not_minting": "(no acuñar)",
|
||||
"synchronized": "sincronizado",
|
||||
"synchronizing": "sincronización"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "Su pedido de compra fue enviado",
|
||||
"published": "publicado con éxito. Espere un par de minutos para que la red propoque los cambios.",
|
||||
@ -318,7 +314,34 @@
|
||||
"voted": "votado con éxito. Espere un par de minutos para que la red propoque los cambios."
|
||||
}
|
||||
},
|
||||
"minting_status": "estado de acuñación",
|
||||
"minting": {
|
||||
"account_details": "detalles de la cuenta de minting",
|
||||
"actions": "acciones de minting",
|
||||
"average_blocktime": "tiempo promedio por bloque de Qortal",
|
||||
"average_blocks_per_day": "promedio de bloques por día",
|
||||
"average_created_qorts_per_day": "promedio de QORT creados por día",
|
||||
"blockchain_statistics": "estadísticas de la blockchain",
|
||||
"blocks_next_level": "bloques para el siguiente nivel",
|
||||
"current_level": "nivel actual",
|
||||
"current_status": "estado actual",
|
||||
"current_tier": "nivel actual",
|
||||
"current_tier_content": "{{ tier }} (Nivels {{ levels }})",
|
||||
"details": "detalles de minting",
|
||||
"next_level": "Con minting 24/7 alcanzarás el <strong>nivel {{ level }}</strong> en <strong>{{ count }} días</strong>",
|
||||
"rewards_info": "información sobre recompensas de minting",
|
||||
"reward_per_block": "recompensa estimada por bloque",
|
||||
"reward_per_day": "recompensa estimada por día",
|
||||
"status": {
|
||||
"minting": "(acuñado)",
|
||||
"not_minting": "(no acuñar)",
|
||||
"no_status": "sin estado",
|
||||
"synchronized": "sincronizado",
|
||||
"synchronizing": "sincronización..."
|
||||
},
|
||||
"status_title": "estado de acuñación",
|
||||
"tier_share_per_block": "porción del nivel por bloque",
|
||||
"total_minter_in_tier": "total de minters en el nivel"
|
||||
},
|
||||
"name": "nombre",
|
||||
"name_app": "nombre/aplicación",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
@ -393,4 +416,4 @@
|
||||
},
|
||||
"website": "sitio web",
|
||||
"welcome": "bienvenido"
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "cuenta de minteo:",
|
||||
"minting_keys_per_node": "solo se permiten 2 claves de minteo por nodo. Elimina una para usar esta cuenta.",
|
||||
"minting_keys_per_node_different": "solo se permiten 2 claves de minteo por nodo. Elimina una para añadir otra cuenta.",
|
||||
"next_level": "bloques restantes para el siguiente nivel:",
|
||||
"node_minting": "este nodo está minteando:",
|
||||
"node_minting_account": "cuentas de minteo del nodo",
|
||||
"node_minting_key": "ya tienes una clave de minteo para esta cuenta en este nodo",
|
||||
"no_announcement": "no hay anuncios",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "Applications officielles",
|
||||
"attachment": "pièce jointe",
|
||||
"balance": "équilibre:",
|
||||
"basic_tabs_example": "Exemple de base des onglets",
|
||||
"category": "catégorie",
|
||||
"category_other": "catégories",
|
||||
"chat": "chat",
|
||||
@ -220,6 +219,7 @@
|
||||
"benefits_qort": "Avantages d'avoir QORT",
|
||||
"building": "bâtiment",
|
||||
"building_app": "application de construction",
|
||||
"confirmed": "confirmé",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "Vous n'avez actuellement aucune modification à vos applications épinglées",
|
||||
"no_results": "Aucun résultat",
|
||||
"one_app_per_name": "Remarque: Actuellement, une seule application et site Web est autorisée par nom.",
|
||||
"ongoing_transactions": "transactions en cours",
|
||||
"opened": "ouvert",
|
||||
"overwrite_qdn": "Écraser à QDN",
|
||||
"password_confirm": "Veuillez confirmer un mot de passe",
|
||||
@ -277,11 +278,12 @@
|
||||
"select_image": "Veuillez sélectionner une image pour un logo",
|
||||
"select_zip": "Sélectionnez un fichier .zip contenant du contenu statique:",
|
||||
"sending": "envoi...",
|
||||
"settings": "Vous utilisez la manière d'exportation / l'importation d'enregistrer les paramètres.",
|
||||
"space_for_admins": "Désolé, cet espace est uniquement pour les administrateurs.",
|
||||
"unread_messages": "Messages non lus ci-dessous",
|
||||
"unsaved_changes": "Vous avez des modifications non enregistrées à vos applications épinglées. Enregistrez-les sur QDN.",
|
||||
"updating": "mise à jour"
|
||||
"settings": "vous utilisez la manière d'exportation / importation d'enregistrement des paramètres.",
|
||||
"space_for_admins": "désolé, cet espace est uniquement pour les administrateurs.",
|
||||
"unread_messages": "messages non lus ci-dessous",
|
||||
"unsaved_changes": "vous avez des modifications non enregistrées à vos applications épinglées. Enregistrez-les sur QDN.",
|
||||
"updating": "mise à jour",
|
||||
"wait": "attendez s'il vous plaît"
|
||||
},
|
||||
"message": "message",
|
||||
"promotion_text": "texte de promotion",
|
||||
@ -302,12 +304,6 @@
|
||||
"reset_qdn": "Vous n'aimez pas vos changements locaux actuels? Souhaitez-vous réinitialiser avec vos applications QDN enregistrées?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(Coupure)",
|
||||
"not_minting": "(pas de la frappe)",
|
||||
"synchronized": "synchronisé",
|
||||
"synchronizing": "synchronisation"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "Votre commande d'achat a été soumise",
|
||||
"published": "publié avec succès. Veuillez patienter quelques minutes pour que le réseau propage les modifications.",
|
||||
@ -318,7 +314,34 @@
|
||||
"voted": "voté avec succès. Veuillez patienter quelques minutes pour que le réseau propage les modifications."
|
||||
}
|
||||
},
|
||||
"minting_status": "statut de frappe",
|
||||
"minting": {
|
||||
"account_details": "détails du compte de minting",
|
||||
"actions": "actions de minting",
|
||||
"average_blocktime": "temps moyen par bloc Qortal",
|
||||
"average_blocks_per_day": "blocs moyens par jour",
|
||||
"average_created_qorts_per_day": "QORT créés en moyenne par jour",
|
||||
"blockchain_statistics": "statistiques de la blockchain",
|
||||
"blocks_next_level": "blocs jusqu'au niveau suivant",
|
||||
"current_level": "niveau actuel",
|
||||
"current_status": "statut actuel",
|
||||
"current_tier": "niveau actuel",
|
||||
"current_tier_content": "{{ tier }} (Niveaux {{ levels }})",
|
||||
"details": "détails du minting",
|
||||
"next_level": "Avec un minting 24/7, vous atteindrez le <strong>niveau {{ level }}</strong> en <strong>{{ count }} jours</strong>",
|
||||
"rewards_info": "informations sur les récompenses de minting",
|
||||
"reward_per_block": "récompense estimée par bloc",
|
||||
"reward_per_day": "récompense estimée par jour",
|
||||
"status": {
|
||||
"minting": "(Frappe)",
|
||||
"not_minting": "(pas de la frappe)",
|
||||
"no_status": "pas de statut",
|
||||
"synchronized": "synchronisé",
|
||||
"synchronizing": "synchronisation..."
|
||||
},
|
||||
"status_title": "statut de frappe",
|
||||
"tier_share_per_block": "part du niveau par bloc",
|
||||
"total_minter_in_tier": "nombre total de minters dans ce niveau"
|
||||
},
|
||||
"name": "nom",
|
||||
"name_app": "nom / application",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
@ -393,4 +416,4 @@
|
||||
},
|
||||
"website": "site web",
|
||||
"welcome": "accueillir"
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "compte de minage :",
|
||||
"minting_keys_per_node": "2 clés de minage max par nœud. Veuillez en retirer une.",
|
||||
"minting_keys_per_node_different": "2 clés de minage max par nœud. Retirez-en une pour ajouter un autre compte.",
|
||||
"next_level": "blocs restants avant le niveau suivant :",
|
||||
"node_minting": "ce nœud est en train de miner :",
|
||||
"node_minting_account": "comptes de minage du nœud",
|
||||
"node_minting_key": "vous avez déjà une clé de minage attachée à ce nœud",
|
||||
"no_announcement": "aucune annonce",
|
||||
|
@ -92,7 +92,7 @@
|
||||
"seedphrase_notice": "È stato generato una <seed>SEED PHRASE</seed> in background.",
|
||||
"turn_local_node": "si prega di attivare il nodo locale",
|
||||
"type_seed": "digita o incolla la seed phrase",
|
||||
"your_accounts": "i tuoi conti salvati"
|
||||
"your_accounts": "i tuoi account salvati"
|
||||
},
|
||||
"success": {
|
||||
"reencrypted_secret_key": "chiave segreta recriptata con successo. Potrebbero essere necessari un paio di minuti per propagare le modifiche. Aggiorna il gruppo fra 5 minuti."
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "app ufficiali",
|
||||
"attachment": "allegato",
|
||||
"balance": "bilancio:",
|
||||
"basic_tabs_example": "esempio di schede base",
|
||||
"category": "categoria",
|
||||
"category_other": "categorie",
|
||||
"chat": "chat",
|
||||
@ -220,6 +219,7 @@
|
||||
"benefits_qort": "vantaggi di avere QORT",
|
||||
"building": "creazione",
|
||||
"building_app": "creazione app",
|
||||
"confirmed": "confermato",
|
||||
"created_by": "creato da {{ owner }}",
|
||||
"buy_order_request": "l'applicazione <br/><italic>{{hostname}}</italic> <br/><span>sta effettuando {{count}} ordine d'acquisto</span>.",
|
||||
"buy_order_request_other": "l'applicazione <br/><italic>{{hostname}}</italic> <br/><span>sta effettuando {{count}} ordini d'acquisto</span>.",
|
||||
@ -255,6 +255,7 @@
|
||||
"no_pinned_changes": "per ora non ci sono modifiche alle app bloccate",
|
||||
"no_results": "nessun risultato",
|
||||
"one_app_per_name": "nota: per adesso sono consentiti solo un'app e un sito Web per nome.",
|
||||
"ongoing_transactions": "transazioni in corso",
|
||||
"opened": "aperto",
|
||||
"overwrite_qdn": "sovrascrivi a QDN",
|
||||
"password_confirm": "si prega di confermare una password",
|
||||
@ -280,7 +281,8 @@
|
||||
"space_for_admins": "mi dispiace, questo spazio è solo per gli amministratori.",
|
||||
"unread_messages": "messaggi non letti qua sotto",
|
||||
"unsaved_changes": "hai cambiato modifiche alle app bloccate. Salvali su QDN.",
|
||||
"updating": "aggiornamento"
|
||||
"updating": "aggiornamento",
|
||||
"wait": "attendere per favore"
|
||||
},
|
||||
"message": "messaggio",
|
||||
"promotion_text": "testo di promozione",
|
||||
@ -301,12 +303,6 @@
|
||||
"reset_qdn": "non ti piacciono le attuali modifiche locali? Vorresti ripristinare le app QDN salvate?",
|
||||
"transfer_qort": "vuoi trasferire {{ amount }} QORT?"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(minting)",
|
||||
"not_minting": "(non minting)",
|
||||
"synchronized": "sincronizzato",
|
||||
"synchronizing": "sincronizzazione"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "l'ordine di acquisto è stato inviato",
|
||||
"published": "pubblicato con successo. Si prega di attendere un paio di minuti affinché la rete propaghi le modifiche.",
|
||||
@ -317,7 +313,34 @@
|
||||
"voted": "votato con successo. Si prega di attendere un paio di minuti affinché la rete propaghi le modifiche."
|
||||
}
|
||||
},
|
||||
"minting_status": "stato minting",
|
||||
"minting": {
|
||||
"account_details": "dettagli dell'account di minting",
|
||||
"actions": "azioni sul minting",
|
||||
"average_blocktime": "tempo medio per blocco di Qortal",
|
||||
"average_blocks_per_day": "blocchi medi al giorno",
|
||||
"average_created_qorts_per_day": "QORT medi creati al giorno",
|
||||
"blockchain_statistics": "statistiche della blockchain",
|
||||
"blocks_next_level": "blocchi al prossimo livello",
|
||||
"current_level": "livello attuale",
|
||||
"current_status": "stato attuale",
|
||||
"current_tier": "fascia attuale",
|
||||
"current_tier_content": "{{ tier }} (Livelli {{ levels }})",
|
||||
"details": "dettagli sul minting",
|
||||
"next_level": "Con un minting 24/7 raggiungerai il <strong>livello {{ level }}</strong> in <strong>{{ count }} giorni</strong>",
|
||||
"rewards_info": "informazioni sulle ricompense del minting",
|
||||
"reward_per_block": "ricompensa stimata per blocco",
|
||||
"reward_per_day": "ricompensa stimata al giorno",
|
||||
"status": {
|
||||
"minting": "(minting)",
|
||||
"not_minting": "(non minting)",
|
||||
"no_status": "nessun stato",
|
||||
"synchronized": "sincronizzato",
|
||||
"synchronizing": "sincronizzazione..."
|
||||
},
|
||||
"status_title": "stato minting",
|
||||
"tier_share_per_block": "quota della fascia per blocco",
|
||||
"total_minter_in_tier": "minter totali in questa fascia"
|
||||
},
|
||||
"name": "nome",
|
||||
"name_app": "nome/app",
|
||||
"new_post_in": "nuovo post in {{ title }}",
|
||||
@ -361,7 +384,7 @@
|
||||
"default": "tema di default",
|
||||
"light": "chiaro",
|
||||
"light_mode": "modalità chiara",
|
||||
"manager": "manager tema",
|
||||
"manager": "gestore del tema",
|
||||
"name": "nome tema"
|
||||
},
|
||||
"thread": "thread",
|
||||
|
@ -71,7 +71,7 @@
|
||||
"block_delay_maximum": "ritardo massimo del blocco per le approvazioni delle transazioni di gruppo",
|
||||
"closed_group": "questo è un gruppo chiuso/privato, quindi occorre attendere fino a quando un amministratore accetta la richiesta",
|
||||
"descrypt_wallet": "decrittazione del wallet ...",
|
||||
"encryption_key": "la prima chiave di crittografia comune del gruppo è in fase di creazione. Si prega di attendere qualche minuto per essere recuperato dalla rete. Controllo ogni 2 minuti ...",
|
||||
"encryption_key": "la prima chiave di crittografia comune del gruppo è in fase di creazione. Si prega di attendere qualche minuto per il suo recupero dalla rete. Controllo ogni 2 minuti ...",
|
||||
"group_announcement": "annunci di gruppo",
|
||||
"group_approval_threshold": "soglia di approvazione del gruppo (numero / percentuale di amministratori che devono approvare una transazione)",
|
||||
"group_encrypted": "gruppo crittografato",
|
||||
@ -91,8 +91,6 @@
|
||||
"minting_account": "account di minting:",
|
||||
"minting_keys_per_node": "sono ammesse solo 2 chiavi di minting per nodo. Rimuoverne una se si desidera fare minting con questo account.",
|
||||
"minting_keys_per_node_different": "sono ammesse solo 2 chiavi di minting per nodo. Rimuovine una se desideri aggiungere un account diverso.",
|
||||
"next_level": "blocchi mancanti al livello successivo:",
|
||||
"node_minting": "questo nodo sta coniando:",
|
||||
"node_minting_account": "account minting del nodo",
|
||||
"node_minting_key": "hai una chiave di minting per questo account collegata al nodo",
|
||||
"no_announcement": "nessun annuncio",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "公式アプリ",
|
||||
"attachment": "添付ファイル",
|
||||
"balance": "バランス:",
|
||||
"basic_tabs_example": "基本的なタブの例",
|
||||
"category": "カテゴリ",
|
||||
"category_other": "カテゴリ",
|
||||
"chat": "チャット",
|
||||
@ -220,6 +219,7 @@
|
||||
"benefits_qort": "QORTを持つことの利点",
|
||||
"building": "建物",
|
||||
"building_app": "ビルディングアプリ",
|
||||
"confirmed": "確認済み",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "現在、ピン留めアプリに変更がありません",
|
||||
"no_results": "結果はありません",
|
||||
"one_app_per_name": "注:現在、名前ごとに1つのアプリとWebサイトのみが許可されています。",
|
||||
"ongoing_transactions": "継続中の取引",
|
||||
"opened": "オープン",
|
||||
"overwrite_qdn": "QDNに上書きします",
|
||||
"password_confirm": "パスワードを確認してください",
|
||||
@ -281,7 +282,8 @@
|
||||
"space_for_admins": "申し訳ありませんが、このスペースは管理者専用です。",
|
||||
"unread_messages": "以下の未読メッセージ",
|
||||
"unsaved_changes": "ピン留めアプリに救われていない変更があります。それらをqdnに保存します。",
|
||||
"updating": "更新"
|
||||
"updating": "更新",
|
||||
"wait": "お待ちください"
|
||||
},
|
||||
"message": "メッセージ",
|
||||
"promotion_text": "プロモーションテキスト",
|
||||
@ -302,12 +304,6 @@
|
||||
"reset_qdn": "あなたの現在のローカルの変更が気に入らない?保存したQDNピン留めアプリにリセットしますか?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(鋳造)",
|
||||
"not_minting": "(造りではありません)",
|
||||
"synchronized": "同期",
|
||||
"synchronizing": "同期"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "購入注文が提出されました",
|
||||
"published": "正常に公開されました。ネットワークが変更を提案するまで数分待ってください。",
|
||||
@ -318,7 +314,34 @@
|
||||
"voted": "正常に投票しました。ネットワークが変更を提案するまで数分待ってください。"
|
||||
}
|
||||
},
|
||||
"minting_status": "ミントステータス",
|
||||
"minting": {
|
||||
"account_details": "ミンティングアカウントの詳細",
|
||||
"actions": "ミンティングアクション",
|
||||
"average_blocktime": "Qortalの平均ブロック時間",
|
||||
"average_blocks_per_day": "1日あたりの平均ブロック数",
|
||||
"average_created_qorts_per_day": "1日あたりに作成された平均QORT数",
|
||||
"blockchain_statistics": "ブロックチェーン統計",
|
||||
"blocks_next_level": "次のレベルまでのブロック数",
|
||||
"current_level": "現在のレベル",
|
||||
"current_status": "現在のステータス",
|
||||
"current_tier": "現在のティア",
|
||||
"current_tier_content": "{{ tier }}(レベル {{ levels }})",
|
||||
"details": "ミンティングの詳細",
|
||||
"next_level": "24時間年中無休のミンティングで、<strong>{{ count }}日</strong>以内に<strong>レベル{{ level }}</strong>に到達します",
|
||||
"rewards_info": "ミンティング報酬情報",
|
||||
"reward_per_block": "ブロックごとの推定報酬",
|
||||
"reward_per_day": "1日あたりの推定報酬",
|
||||
"status": {
|
||||
"minting": "(鋳造)",
|
||||
"not_minting": "(造りではありません)",
|
||||
"no_status": "ステータスなし",
|
||||
"synchronized": "同期",
|
||||
"synchronizing": "同期..."
|
||||
},
|
||||
"status_title": "ミントステータス",
|
||||
"tier_share_per_block": "ブロックごとのティアシェア",
|
||||
"total_minter_in_tier": "このティアの合計ミンター数"
|
||||
},
|
||||
"name": "名前",
|
||||
"name_app": "名前/アプリ",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
@ -393,4 +416,4 @@
|
||||
},
|
||||
"website": "Webサイト",
|
||||
"welcome": "いらっしゃいませ"
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "マイニングアカウント:",
|
||||
"minting_keys_per_node": "ノードごとに最大2つのマイニング鍵が許可されています。削除してから追加してください。",
|
||||
"minting_keys_per_node_different": "他のアカウントを追加するには、既存の鍵を削除してください。",
|
||||
"next_level": "次のレベルまでの残りブロック数:",
|
||||
"node_minting": "このノードはマイニング中:",
|
||||
"node_minting_account": "ノードのマイニングアカウント",
|
||||
"node_minting_key": "このノードに現在接続されているアカウントのマイニング鍵があります",
|
||||
"no_announcement": "お知らせはありません",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "официальные приложения",
|
||||
"attachment": "вложение",
|
||||
"balance": "баланс:",
|
||||
"basic_tabs_example": "Основные вкладки",
|
||||
"category": "категория",
|
||||
"category_other": "категории",
|
||||
"chat": "чат",
|
||||
@ -220,6 +219,7 @@
|
||||
"benefits_qort": "Преимущества наличия qort",
|
||||
"building": "здание",
|
||||
"building_app": "строительство приложения",
|
||||
"confirmed": "подтвержденный",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "В настоящее время у вас нет никаких изменений в ваших приложениях",
|
||||
"no_results": "Нет результатов",
|
||||
"one_app_per_name": "ПРИМЕЧАНИЕ. В настоящее время только одно приложение и веб -сайт разрешены для имени.",
|
||||
"ongoing_transactions": "текущие операции",
|
||||
"opened": "открыл",
|
||||
"overwrite_qdn": "перезаписать в QDN",
|
||||
"password_confirm": "Пожалуйста, подтвердите пароль",
|
||||
@ -281,7 +282,8 @@
|
||||
"space_for_admins": "Извините, это пространство только для администраторов.",
|
||||
"unread_messages": "Непрочитанные сообщения ниже",
|
||||
"unsaved_changes": "У вас есть неспасенные изменения в ваши приложения. Сохраните их в QDN.",
|
||||
"updating": "обновление"
|
||||
"updating": "обновление",
|
||||
"wait": "пожалуйста, подождите"
|
||||
},
|
||||
"message": "сообщение",
|
||||
"promotion_text": "Текст продвижения",
|
||||
@ -302,12 +304,6 @@
|
||||
"reset_qdn": "Не нравятся ваши текущие локальные изменения? Хотели бы вы сбросить в сохраненные приложения QDN?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(добыча)",
|
||||
"not_minting": "(не шахта)",
|
||||
"synchronized": "синхронизированный",
|
||||
"synchronizing": "синхронизация"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "Ваш заказ на покупку был отправлен",
|
||||
"published": "успешно опубликовано. Пожалуйста, подождите пару минут, пока сеть прокатит изменения.",
|
||||
@ -318,10 +314,37 @@
|
||||
"voted": "успешно проголосовал. Пожалуйста, подождите пару минут, пока сеть прокатит изменения."
|
||||
}
|
||||
},
|
||||
"minting_status": "Статус майтинга",
|
||||
"minting": {
|
||||
"account_details": "детали аккаунта майнинга",
|
||||
"actions": "действия по майнингу",
|
||||
"average_blocktime": "среднее время блока Qortal",
|
||||
"average_blocks_per_day": "среднее количество блоков в день",
|
||||
"average_created_qorts_per_day": "среднее количество создаваемых QORT в день",
|
||||
"blockchain_statistics": "статистика блокчейна",
|
||||
"blocks_next_level": "блоков до следующего уровня",
|
||||
"current_level": "текущий уровень",
|
||||
"current_status": "текущий статус",
|
||||
"current_tier": "текущий уровень",
|
||||
"current_tier_content": "{{ tier }} (Уровни {{ levels }})",
|
||||
"details": "детали майнинга",
|
||||
"next_level": "При майнинге 24/7 вы достигнете <strong>{{ level }} уровня</strong> за <strong>{{ count }} дней</strong>",
|
||||
"rewards_info": "информация о наградах за майнинг",
|
||||
"reward_per_block": "предполагаемая награда за блок",
|
||||
"reward_per_day": "предполагаемая награда в день",
|
||||
"status": {
|
||||
"minting": "(добыча)",
|
||||
"not_minting": "(не шахта)",
|
||||
"no_status": "нет статуса",
|
||||
"synchronized": "синхронизированный",
|
||||
"synchronizing": "синхронизация..."
|
||||
},
|
||||
"status_title": "Статус майтинга",
|
||||
"tier_share_per_block": "доля уровня за блок",
|
||||
"total_minter_in_tier": "всего майнеров на этом уровне"
|
||||
},
|
||||
"name": "имя",
|
||||
"name_app": "имя/приложение",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
"new_post_in": "новые сообщения в {{ title }}",
|
||||
"none": "никто",
|
||||
"note": "примечание",
|
||||
"option": "вариант",
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "аккаунт майнинга:",
|
||||
"minting_keys_per_node": "максимум 2 ключа майнинга на узел. Удалите один, чтобы продолжить.",
|
||||
"minting_keys_per_node_different": "максимум 2 ключа майнинга на узел. Удалите ключ для добавления другого.",
|
||||
"next_level": "блоков до следующего уровня:",
|
||||
"node_minting": "этот узел майнит:",
|
||||
"node_minting_account": "аккаунты майнинга узла",
|
||||
"node_minting_key": "этот узел уже содержит ключ майнинга для этой учетной записи",
|
||||
"no_announcement": "нет объявлений",
|
||||
|
@ -116,7 +116,6 @@
|
||||
"apps_official": "官方应用程序",
|
||||
"attachment": "依恋",
|
||||
"balance": "平衡:",
|
||||
"basic_tabs_example": "基本标签示例",
|
||||
"category": "类别",
|
||||
"category_other": "类别",
|
||||
"chat": "聊天",
|
||||
@ -220,9 +219,10 @@
|
||||
"benefits_qort": "Qort的好处",
|
||||
"building": "建筑",
|
||||
"building_app": "建筑应用",
|
||||
"created_by": "created by {{ owner }}",
|
||||
"buy_order_request": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy order</span>",
|
||||
"buy_order_request_other": "the Application <br/><italic>{{hostname}}</italic> <br/><span>is requesting {{count}} buy orders</span>",
|
||||
"confirmed": "已确认",
|
||||
"created_by": "创建人 {{ owner }}",
|
||||
"buy_order_request": "应用程序<br/><italic>{{hostname}}</italic><br/><span>正在请求{{count}}购买订单</span>",
|
||||
"buy_order_request_other": "应用程序<br/><italic>{{hostname}}</italic><br/><span>正在请求{{count}}购买订单</span>",
|
||||
"devmode_local_node": "请使用您的本地节点进行开发模式!注销并使用本地节点。",
|
||||
"downloading": "下载",
|
||||
"downloading_decrypting_app": "下载和解密私人应用程序。",
|
||||
@ -256,6 +256,7 @@
|
||||
"no_pinned_changes": "您目前对固定应用程序没有任何更改",
|
||||
"no_results": "没有结果",
|
||||
"one_app_per_name": "注意:目前,每个名称只允许一个应用程序和网站。",
|
||||
"ongoing_transactions": "正在进行的交易",
|
||||
"opened": "打开",
|
||||
"overwrite_qdn": "覆盖为QDN",
|
||||
"password_confirm": "请确认密码",
|
||||
@ -281,7 +282,8 @@
|
||||
"space_for_admins": "抱歉,这个空间仅适用于管理员。",
|
||||
"unread_messages": "下面未读消息",
|
||||
"unsaved_changes": "您对固定应用程序有未保存的更改。将它们保存到QDN。",
|
||||
"updating": "更新"
|
||||
"updating": "更新",
|
||||
"wait": "请稍等"
|
||||
},
|
||||
"message": "信息",
|
||||
"promotion_text": "促销文本",
|
||||
@ -302,12 +304,6 @@
|
||||
"reset_qdn": "不喜欢您当前的本地更改吗?您想重置保存的QDN固定应用吗?",
|
||||
"transfer_qort": "would you like to transfer {{ amount }} QORT"
|
||||
},
|
||||
"status": {
|
||||
"minting": "(铸造)",
|
||||
"not_minting": "(不是铸造)",
|
||||
"synchronized": "同步",
|
||||
"synchronizing": "同步"
|
||||
},
|
||||
"success": {
|
||||
"order_submitted": "您的买入订单已提交",
|
||||
"published": "成功出版。请等待几分钟,以使网络传播更改。",
|
||||
@ -318,7 +314,34 @@
|
||||
"voted": "成功投票。请等待几分钟,以使网络传播更改。"
|
||||
}
|
||||
},
|
||||
"minting_status": "铸造状态",
|
||||
"minting": {
|
||||
"account_details": "铸造账户详情",
|
||||
"actions": "铸造操作",
|
||||
"average_blocktime": "Qortal平均区块时间",
|
||||
"average_blocks_per_day": "每日平均区块数",
|
||||
"average_created_qorts_per_day": "每日平均生成的QORT数量",
|
||||
"blockchain_statistics": "区块链统计",
|
||||
"blocks_next_level": "距离下一级的区块数",
|
||||
"current_level": "当前等级",
|
||||
"current_status": "当前状态",
|
||||
"current_tier": "当前等级层级",
|
||||
"current_tier_content": "{{ tier }}(等级 {{ levels }})",
|
||||
"details": "铸造详情",
|
||||
"next_level": "全天候铸造将使你在<strong>{{ count }}天</strong>内达到<strong>{{ level }}级</strong>",
|
||||
"rewards_info": "铸造奖励信息",
|
||||
"reward_per_block": "每个区块的预计奖励",
|
||||
"reward_per_day": "每日预计奖励",
|
||||
"status": {
|
||||
"minting": "(铸造)",
|
||||
"not_minting": "(不是铸造)",
|
||||
"no_status": "没有状态",
|
||||
"synchronized": "同步",
|
||||
"synchronizing": "同步..."
|
||||
},
|
||||
"status_title": "铸造状态",
|
||||
"tier_share_per_block": "每个区块的等级份额",
|
||||
"total_minter_in_tier": "该等级层级中的总铸造者数"
|
||||
},
|
||||
"name": "姓名",
|
||||
"name_app": "名称/应用",
|
||||
"new_post_in": "new post in {{ title }}",
|
||||
@ -393,4 +416,4 @@
|
||||
},
|
||||
"website": "网站",
|
||||
"welcome": "欢迎"
|
||||
}
|
||||
}
|
||||
|
@ -91,8 +91,6 @@
|
||||
"minting_account": "铸币账户:",
|
||||
"minting_keys_per_node": "每个节点最多允许 2 个铸币密钥。请先移除一个",
|
||||
"minting_keys_per_node_different": "每个节点最多允许 2 个铸币密钥。请先移除再添加其他账户",
|
||||
"next_level": "距离下一级还需区块数:",
|
||||
"node_minting": "当前节点正在铸币:",
|
||||
"node_minting_account": "节点铸币账户",
|
||||
"node_minting_key": "你已有该账户的铸币密钥与该节点绑定",
|
||||
"no_announcement": "暂无公告",
|
||||
|
@ -4,6 +4,28 @@ export const capitalizeAll = {
|
||||
process: (value: string) => value.toUpperCase(),
|
||||
};
|
||||
|
||||
export const capitalizeEachFirstChar = {
|
||||
type: 'postProcessor',
|
||||
name: 'capitalizeEachFirstChar',
|
||||
process: (value: string) => {
|
||||
if (!value?.trim()) return value;
|
||||
|
||||
const leadingSpaces = value.match(/^\s*/)?.[0] || '';
|
||||
const trailingSpaces = value.match(/\s*$/)?.[0] || '';
|
||||
|
||||
const core = value
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.map(
|
||||
(word) =>
|
||||
word.charAt(0).toLocaleUpperCase() + word.slice(1).toLocaleLowerCase()
|
||||
)
|
||||
.join(' ');
|
||||
|
||||
return leadingSpaces + core + trailingSpaces;
|
||||
},
|
||||
};
|
||||
|
||||
export const capitalizeFirstChar = {
|
||||
type: 'postProcessor',
|
||||
name: 'capitalizeFirstChar',
|
||||
|
@ -2465,7 +2465,6 @@ export const saveFile = async (data, sender, isFromExtension, snackMethods) => {
|
||||
const filename = data.filename;
|
||||
const blob = data.blob;
|
||||
|
||||
const mimeType = blob.type || data.mimeType;
|
||||
const resPermission = await getUserPermission(
|
||||
{
|
||||
text1: i18n.t('question:download_file', {
|
||||
@ -2476,17 +2475,6 @@ export const saveFile = async (data, sender, isFromExtension, snackMethods) => {
|
||||
isFromExtension
|
||||
);
|
||||
const { accepted } = resPermission;
|
||||
if (!accepted) throw new Error('User declined to save file'); // TODO translate
|
||||
showSaveFilePicker(
|
||||
{
|
||||
filename,
|
||||
mimeType,
|
||||
blob,
|
||||
},
|
||||
snackMethods
|
||||
);
|
||||
|
||||
return true;
|
||||
|
||||
if (accepted) {
|
||||
const mimeType = blob.type || data.mimeType;
|
||||
|
@ -138,7 +138,10 @@ interface CustomButtonProps {
|
||||
customColor?: string;
|
||||
}
|
||||
|
||||
export const CustomButtonAccept = styled(Box)<CustomButtonProps>((props) => {
|
||||
export const CustomButtonAccept = styled(Box, {
|
||||
shouldForwardProp: (prop) =>
|
||||
prop !== 'customBgColor' && prop !== 'customColor',
|
||||
})<CustomButtonProps>((props) => {
|
||||
const { customBgColor, customColor, theme } = props;
|
||||
return {
|
||||
alignItems: 'center',
|
||||
|
@ -19,6 +19,13 @@
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
/* * { // TODO restore and check
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Roboto';
|
||||
} */
|
||||
|
||||
.image-container {
|
||||
position: relative;
|
||||
}
|
||||
|
@ -73,6 +73,33 @@ const commonThemeOptions = {
|
||||
},
|
||||
},
|
||||
|
||||
MuiDialog: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundColor: 'background.paper',
|
||||
color: 'text.primary',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiDialogTitle: {
|
||||
styleOverrides: {
|
||||
root: {
|
||||
backgroundColor: 'inherit',
|
||||
color: 'inherit',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiDialogContent: {
|
||||
styleOverrides: {
|
||||
root: {
|
||||
backgroundColor: 'inherit',
|
||||
color: 'inherit',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiModal: {
|
||||
styleOverrides: {
|
||||
root: {
|
||||
@ -80,6 +107,14 @@ const commonThemeOptions = {
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiPopover: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundImage: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -16,7 +16,7 @@ export const darkThemeOptions: ThemeOptions = {
|
||||
background: {
|
||||
default: 'rgb(49, 51, 56)',
|
||||
surface: 'rgb(58, 60, 65)',
|
||||
paper: 'rgb(62, 64, 68)',
|
||||
paper: 'rgb(77, 80, 85)',
|
||||
},
|
||||
text: {
|
||||
primary: 'rgb(255, 255, 255)',
|
||||
@ -114,18 +114,11 @@ export const darkThemeOptions: ThemeOptions = {
|
||||
},
|
||||
},
|
||||
|
||||
MuiDialog: {
|
||||
MuiPaper: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundImage: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiPopover: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundImage: 'none',
|
||||
root: {
|
||||
backgroundColor: 'rgb(77, 80, 85)',
|
||||
color: 'rgb(255, 255, 255)',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -116,18 +116,11 @@ export const lightThemeOptions: ThemeOptions = {
|
||||
},
|
||||
},
|
||||
|
||||
MuiDialog: {
|
||||
MuiPaper: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundImage: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
MuiPopover: {
|
||||
styleOverrides: {
|
||||
paper: {
|
||||
backgroundImage: 'none',
|
||||
root: {
|
||||
backgroundColor: 'rgb(220, 220, 220)',
|
||||
color: 'rgba(0, 0, 0, 0.87)',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user