Added "Organisms." prefix to translations for organims
This commit is contained in:
parent
7bb187bce1
commit
09c7aa9589
30 changed files with 646 additions and 645 deletions
|
@ -41,6 +41,7 @@
|
||||||
"browser_not_supported": "Not supported in this browser",
|
"browser_not_supported": "Not supported in this browser",
|
||||||
"generic": "Something went wrong!"
|
"generic": "Something went wrong!"
|
||||||
},
|
},
|
||||||
|
"Organisms": {
|
||||||
"Welcome": {
|
"Welcome": {
|
||||||
"heading": "Welcome to Cinny!",
|
"heading": "Welcome to Cinny!",
|
||||||
"subheading": "Yet another Matrix client"
|
"subheading": "Yet another Matrix client"
|
||||||
|
@ -233,7 +234,6 @@
|
||||||
"setup_message": "Setup to verify and keep track of all your sessions. Also required to backup encrypted message.",
|
"setup_message": "Setup to verify and keep track of all your sessions. Also required to backup encrypted message.",
|
||||||
"reset_keys_subtitle": "Resetting cross-signing keys is permanent.",
|
"reset_keys_subtitle": "Resetting cross-signing keys is permanent.",
|
||||||
"reset_keys_message": "Anyone you have verified with will see security alerts and your message backup will lost. You almost certainly do not want to do this, unless you have lost Security Key or Phrase and every session you can cross-sign from."
|
"reset_keys_message": "Anyone you have verified with will see security alerts and your message backup will lost. You almost certainly do not want to do this, unless you have lost Security Key or Phrase and every session you can cross-sign from."
|
||||||
|
|
||||||
},
|
},
|
||||||
"AuthRequest": {
|
"AuthRequest": {
|
||||||
"wrong_password": "Wrong password. Please enter the correct password",
|
"wrong_password": "Wrong password. Please enter the correct password",
|
||||||
|
@ -440,3 +440,4 @@
|
||||||
"home": "Home"
|
"home": "Home"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
|
@ -137,8 +137,8 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const joinRules = ['invite', 'restricted', 'public'];
|
const joinRules = ['invite', 'restricted', 'public'];
|
||||||
const joinRuleShortText = [ t("CreateRoom.private_room_short"), t("CreateRoom.restricted_room_short"), t("CreateRoom.public_room_short")];
|
const joinRuleShortText = [ t("Organisms.CreateRoom.private_room_short"), t("Organisms.CreateRoom.restricted_room_short"), t("Organisms.CreateRoom.public_room_short")];
|
||||||
const joinRuleText = [ t("CreateRoom.private_room_long"), t("CreateRoom.restricted_room_long"), t("CreateRoom.public_room_long")];
|
const joinRuleText = [ t("Organisms.CreateRoom.private_room_long"), t("Organisms.CreateRoom.restricted_room_long"), t("Organisms.CreateRoom.public_room_long")];
|
||||||
const jrRoomIC = [HashLockIC, HashIC, HashGlobeIC];
|
const jrRoomIC = [HashLockIC, HashIC, HashGlobeIC];
|
||||||
const jrSpaceIC = [SpaceLockIC, SpaceIC, SpaceGlobeIC];
|
const jrSpaceIC = [SpaceLockIC, SpaceIC, SpaceGlobeIC];
|
||||||
const handleJoinRule = (evt) => {
|
const handleJoinRule = (evt) => {
|
||||||
|
@ -147,7 +147,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
|
||||||
getEventCords(evt, '.btn-surface'),
|
getEventCords(evt, '.btn-surface'),
|
||||||
(closeMenu) => (
|
(closeMenu) => (
|
||||||
<>
|
<>
|
||||||
<MenuHeader>{t("CreateRoom.visibility_message")}</MenuHeader>
|
<MenuHeader>{t("Organisms.CreateRoom.visibility_message")}</MenuHeader>
|
||||||
{
|
{
|
||||||
joinRules.map((rule) => (
|
joinRules.map((rule) => (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
|
@ -174,17 +174,17 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
|
||||||
<div className="create-room">
|
<div className="create-room">
|
||||||
<form className="create-room__form" onSubmit={handleSubmit}>
|
<form className="create-room__form" onSubmit={handleSubmit}>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("CreateRoom.visibility_title")}
|
title={t("Organisms.CreateRoom.visibility_title")}
|
||||||
options={(
|
options={(
|
||||||
<Button onClick={handleJoinRule} iconSrc={ChevronBottomIC}>
|
<Button onClick={handleJoinRule} iconSrc={ChevronBottomIC}>
|
||||||
{joinRuleShortText[joinRules.indexOf(joinRule)]}
|
{joinRuleShortText[joinRules.indexOf(joinRule)]}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{isSpace ? t("CreateRoom.select_who_can_join_space") : t("CreateRoom.select_who_can_join_room")}</Text>}
|
content={<Text variant="b3">{isSpace ? t("Organisms.CreateRoom.select_who_can_join_space") : t("Organisms.CreateRoom.select_who_can_join_room")}</Text>}
|
||||||
/>
|
/>
|
||||||
{joinRule === 'public' && (
|
{joinRule === 'public' && (
|
||||||
<div>
|
<div>
|
||||||
<Text className="create-room__address__label" variant="b2">{isSpace ? t("CreateRoom.space_address") : t("CreateRoom.room_address")}</Text>
|
<Text className="create-room__address__label" variant="b2">{isSpace ? t("Organisms.CreateRoom.space_address") : t("Organisms.CreateRoom.room_address")}</Text>
|
||||||
<div className="create-room__address">
|
<div className="create-room__address">
|
||||||
<Text variant="b1">#</Text>
|
<Text variant="b1">#</Text>
|
||||||
<Input
|
<Input
|
||||||
|
@ -197,32 +197,32 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
|
||||||
/>
|
/>
|
||||||
<Text variant="b1">{`:${userHs}`}</Text>
|
<Text variant="b1">{`:${userHs}`}</Text>
|
||||||
</div>
|
</div>
|
||||||
{isValidAddress === false && <Text className="create-room__address__tip" variant="b3"><span style={{ color: 'var(--bg-danger)' }}>{ t("CreateRoom.room_address_already_in_use", {room_address: `#${addressValue}:${userHs}`})}</span></Text>}
|
{isValidAddress === false && <Text className="create-room__address__tip" variant="b3"><span style={{ color: 'var(--bg-danger)' }}>{ t("Organisms.CreateRoom.room_address_already_in_use", {room_address: `#${addressValue}:${userHs}`})}</span></Text>}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{!isSpace && joinRule !== 'public' && (
|
{!isSpace && joinRule !== 'public' && (
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("CreateRoom.e2e_title")}
|
title={t("Organisms.CreateRoom.e2e_title")}
|
||||||
options={<Toggle isActive={isEncrypted} onToggle={setIsEncrypted} />}
|
options={<Toggle isActive={isEncrypted} onToggle={setIsEncrypted} />}
|
||||||
content={<Text variant="b3"> {t("CreateRoom.e2e_message")}</Text>}
|
content={<Text variant="b3"> {t("Organisms.CreateRoom.e2e_message")}</Text>}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("CreateRoom.role_title")}
|
title={t("Organisms.CreateRoom.role_title")}
|
||||||
options={(
|
options={(
|
||||||
<SegmentControl
|
<SegmentControl
|
||||||
selected={roleIndex}
|
selected={roleIndex}
|
||||||
segments={[{ text: t("CreateRoom.role_admin")}, { text: t("CreateRoom.role_founder")}]}
|
segments={[{ text: t("Organisms.CreateRoom.role_admin")}, { text: t("Organisms.CreateRoom.role_founder")}]}
|
||||||
onSelect={setRoleIndex}
|
onSelect={setRoleIndex}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={(
|
content={(
|
||||||
<Text variant="b3"> {t("CreateRoom.role_message")}</Text>
|
<Text variant="b3"> {t("Organisms.CreateRoom.role_message")}</Text>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<Input name="topic" minHeight={174} resizable label= {t("CreateRoom.topic_label")}/>
|
<Input name="topic" minHeight={174} resizable label= {t("Organisms.CreateRoom.topic_label")}/>
|
||||||
<div className="create-room__name-wrapper">
|
<div className="create-room__name-wrapper">
|
||||||
<Input name="name" label={isSpace ? t("CreateRoom.space_name"): t("CreateRoom.room_name")} required />
|
<Input name="name" label={isSpace ? t("Organisms.CreateRoom.space_name"): t("Organisms.CreateRoom.room_name")} required />
|
||||||
<Button
|
<Button
|
||||||
disabled={isValidAddress === false || isCreatingRoom}
|
disabled={isValidAddress === false || isCreatingRoom}
|
||||||
iconSrc={isSpace ? SpacePlusIC : HashPlusIC}
|
iconSrc={isSpace ? SpacePlusIC : HashPlusIC}
|
||||||
|
@ -235,7 +235,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
|
||||||
{isCreatingRoom && (
|
{isCreatingRoom && (
|
||||||
<div className="create-room__loading">
|
<div className="create-room__loading">
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{ isSpace ? t("CreateRoom.creating_space") : t("CreateRoom.creating_room")}</Text>
|
<Text>{ isSpace ? t("Organisms.CreateRoom.creating_space") : t("Organisms.CreateRoom.creating_room")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{typeof creatingError === 'string' && <Text className="create-room__error" variant="b3">{creatingError}</Text>}
|
{typeof creatingError === 'string' && <Text className="create-room__error" variant="b3">{creatingError}</Text>}
|
||||||
|
@ -284,9 +284,9 @@ function CreateRoom() {
|
||||||
isOpen={create !== null}
|
isOpen={create !== null}
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{parentId ? twemojify(room.name) : t("CreateRoom.home")}
|
{parentId ? twemojify(room.name) : t("Organisms.CreateRoom.home")}
|
||||||
<span style={{ color: 'var(--tc-surface-low)' }}>
|
<span style={{ color: 'var(--tc-surface-low)' }}>
|
||||||
{` — ${isSpace ? t("CreateRoom.create_space") : t("CreateRoom.create_room")}`}
|
{` — ${isSpace ? t("Organisms.CreateRoom.create_space") : t("Organisms.CreateRoom.create_room")}`}
|
||||||
</span>
|
</span>
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -18,7 +18,7 @@ function DragDrop({ isOpen }) {
|
||||||
overlayClassName="drag-drop__overlay"
|
overlayClassName="drag-drop__overlay"
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
>
|
>
|
||||||
<Text variant="h2" weight="medium">{t("DragDrop.drop_file_to_upload_prompt")}</Text>
|
<Text variant="h2" weight="medium">{t("Organisms.DragDrop.drop_file_to_upload_prompt")}</Text>
|
||||||
</RawModal>
|
</RawModal>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,14 +100,14 @@ function EmojiVerificationContent({ data, requestClose }) {
|
||||||
const renderWait = () => (
|
const renderWait = () => (
|
||||||
<>
|
<>
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{t("EmojiVerification.waiting_for_response")}</Text>
|
<Text>{t("Organisms.EmojiVerification.waiting_for_response")}</Text>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (sas !== null) {
|
if (sas !== null) {
|
||||||
return (
|
return (
|
||||||
<div className="emoji-verification__content">
|
<div className="emoji-verification__content">
|
||||||
<Text>{t("EmojiVerification.confirmation_prompt")}</Text>
|
<Text>{t("Organisms.EmojiVerification.confirmation_prompt")}</Text>
|
||||||
<div className="emoji-verification__emojis">
|
<div className="emoji-verification__emojis">
|
||||||
{sas.sas.emoji.map((emoji, i) => (
|
{sas.sas.emoji.map((emoji, i) => (
|
||||||
// eslint-disable-next-line react/no-array-index-key
|
// eslint-disable-next-line react/no-array-index-key
|
||||||
|
@ -120,8 +120,8 @@ function EmojiVerificationContent({ data, requestClose }) {
|
||||||
<div className="emoji-verification__buttons">
|
<div className="emoji-verification__buttons">
|
||||||
{process ? renderWait() : (
|
{process ? renderWait() : (
|
||||||
<>
|
<>
|
||||||
<Button variant="primary" onClick={sasConfirm}>{t("EmojiVerification.emojis_match_button")}</Button>
|
<Button variant="primary" onClick={sasConfirm}>{t("Organisms.EmojiVerification.emojis_match_button")}</Button>
|
||||||
<Button onClick={sasMismatch}>{t("EmojiVerification.emojis_dont_match_button")}</Button>
|
<Button onClick={sasMismatch}>{t("Organisms.EmojiVerification.emojis_dont_match_button")}</Button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -132,7 +132,7 @@ function EmojiVerificationContent({ data, requestClose }) {
|
||||||
if (targetDevice) {
|
if (targetDevice) {
|
||||||
return (
|
return (
|
||||||
<div className="emoji-verification__content">
|
<div className="emoji-verification__content">
|
||||||
<Text>{t("EmojiVerification.accept_request_from_other_device_message")}</Text>
|
<Text>{t("Organisms.EmojiVerification.accept_request_from_other_device_message")}</Text>
|
||||||
<div className="emoji-verification__buttons">
|
<div className="emoji-verification__buttons">
|
||||||
{renderWait()}
|
{renderWait()}
|
||||||
</div>
|
</div>
|
||||||
|
@ -142,12 +142,12 @@ function EmojiVerificationContent({ data, requestClose }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="emoji-verification__content">
|
<div className="emoji-verification__content">
|
||||||
<Text>{t("EmojiVerification.begin_verification_process_message")}</Text>
|
<Text>{t("Organisms.EmojiVerification.begin_verification_process_message")}</Text>
|
||||||
<div className="emoji-verification__buttons">
|
<div className="emoji-verification__buttons">
|
||||||
{
|
{
|
||||||
process
|
process
|
||||||
? renderWait()
|
? renderWait()
|
||||||
: <Button variant="primary" onClick={beginVerification}>{t("EmojiVerification.begin_verification_button_text")}</Button>
|
: <Button variant="primary" onClick={beginVerification}>{t("Organisms.EmojiVerification.begin_verification_button_text")}</Button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -188,7 +188,7 @@ function EmojiVerification() {
|
||||||
className="emoji-verification"
|
className="emoji-verification"
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{t("EmojiVerification.title")}
|
{t("Organisms.EmojiVerification.title")}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}
|
||||||
|
|
|
@ -81,8 +81,8 @@ function InviteList({ isOpen, onRequestClose }) {
|
||||||
? (<Spinner size="small" />)
|
? (<Spinner size="small" />)
|
||||||
: (
|
: (
|
||||||
<div className="invite-btn__container">
|
<div className="invite-btn__container">
|
||||||
<Button onClick={() => rejectInvite(myRoom.roomId)}>{t("InviteList.reject_invite")}</Button>
|
<Button onClick={() => rejectInvite(myRoom.roomId)}>{t("Organisms.InviteList.reject_invite")}</Button>
|
||||||
<Button onClick={() => acceptInvite(myRoom.roomId)} variant="primary">{t("InviteList.accept_invite")}</Button>
|
<Button onClick={() => acceptInvite(myRoom.roomId)} variant="primary">{t("Organisms.InviteList.accept_invite")}</Button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -93,14 +93,14 @@ function InviteList({ isOpen, onRequestClose }) {
|
||||||
return (
|
return (
|
||||||
<PopupWindow
|
<PopupWindow
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
title={t("InviteList.title")}
|
title={t("Organisms.InviteList.title")}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
||||||
onRequestClose={onRequestClose}
|
onRequestClose={onRequestClose}
|
||||||
>
|
>
|
||||||
<div className="invites-content">
|
<div className="invites-content">
|
||||||
{ initMatrix.roomList.inviteDirects.size !== 0 && (
|
{ initMatrix.roomList.inviteDirects.size !== 0 && (
|
||||||
<div className="invites-content__subheading">
|
<div className="invites-content__subheading">
|
||||||
<Text variant="b3" weight="bold">{t("InviteList.direct_messages_title")}</Text>
|
<Text variant="b3" weight="bold">{t("Organisms.InviteList.direct_messages_title")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{
|
{
|
||||||
|
@ -118,8 +118,8 @@ function InviteList({ isOpen, onRequestClose }) {
|
||||||
? (<Spinner size="small" />)
|
? (<Spinner size="small" />)
|
||||||
: (
|
: (
|
||||||
<div className="invite-btn__container">
|
<div className="invite-btn__container">
|
||||||
<Button onClick={() => rejectInvite(myRoom.roomId, true)}>{t("InviteList.reject_invite")}</Button>
|
<Button onClick={() => rejectInvite(myRoom.roomId, true)}>{t("Organisms.InviteList.reject_invite")}</Button>
|
||||||
<Button onClick={() => acceptInvite(myRoom.roomId, true)} variant="primary">{t("InviteList.accept_invite")}</Button>
|
<Button onClick={() => acceptInvite(myRoom.roomId, true)} variant="primary">{t("Organisms.InviteList.accept_invite")}</Button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -129,14 +129,14 @@ function InviteList({ isOpen, onRequestClose }) {
|
||||||
}
|
}
|
||||||
{ initMatrix.roomList.inviteSpaces.size !== 0 && (
|
{ initMatrix.roomList.inviteSpaces.size !== 0 && (
|
||||||
<div className="invites-content__subheading">
|
<div className="invites-content__subheading">
|
||||||
<Text variant="b3" weight="bold">{t("InviteList.spaces_title")}</Text>
|
<Text variant="b3" weight="bold">{t("Organisms.InviteList.spaces_title")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{ Array.from(initMatrix.roomList.inviteSpaces).map(renderRoomTile) }
|
{ Array.from(initMatrix.roomList.inviteSpaces).map(renderRoomTile) }
|
||||||
|
|
||||||
{ initMatrix.roomList.inviteRooms.size !== 0 && (
|
{ initMatrix.roomList.inviteRooms.size !== 0 && (
|
||||||
<div className="invites-content__subheading">
|
<div className="invites-content__subheading">
|
||||||
<Text variant="b3" weight="bold">{t("InviteList.rooms_title")}</Text>
|
<Text variant="b3" weight="bold">{t("Organisms.InviteList.rooms_title")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{ Array.from(initMatrix.roomList.inviteRooms).map(renderRoomTile) }
|
{ Array.from(initMatrix.roomList.inviteRooms).map(renderRoomTile) }
|
||||||
|
|
|
@ -88,7 +88,7 @@ function InviteUser({
|
||||||
avatar_url: result.avatar_url,
|
avatar_url: result.avatar_url,
|
||||||
}]);
|
}]);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
updateSearchQuery({error: t("InviteUser.user_not_found", {user_name: inputUsername})});
|
updateSearchQuery({error: t("Organisms.InviteUser.user_not_found", {user_name: inputUsername})});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
@ -97,7 +97,7 @@ function InviteUser({
|
||||||
limit: 20,
|
limit: 20,
|
||||||
});
|
});
|
||||||
if (result.results.length === 0) {
|
if (result.results.length === 0) {
|
||||||
updateSearchQuery({ error: t("InviteUser.no_matches_found", {user_name: inputUsername})});
|
updateSearchQuery({ error: t("Organisms.InviteUser.no_matches_found", {user_name: inputUsername})});
|
||||||
updateIsSearching(false);
|
updateIsSearching(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,7 @@ function InviteUser({
|
||||||
return <Button onClick={() => { selectRoom(createdDM.get(userId)); onRequestClose(); }}>Open</Button>;
|
return <Button onClick={() => { selectRoom(createdDM.get(userId)); onRequestClose(); }}>Open</Button>;
|
||||||
}
|
}
|
||||||
if (invitedUserIds.has(userId)) {
|
if (invitedUserIds.has(userId)) {
|
||||||
return messageJSX(t("InviteUser.invite_result.invited"), true);
|
return messageJSX(t("Organisms.InviteUser.invite_result.invited"), true);
|
||||||
}
|
}
|
||||||
if (typeof roomId === 'string') {
|
if (typeof roomId === 'string') {
|
||||||
const member = mx.getRoom(roomId).getMember(userId);
|
const member = mx.getRoom(roomId).getMember(userId);
|
||||||
|
@ -187,11 +187,11 @@ function InviteUser({
|
||||||
const userMembership = member.membership;
|
const userMembership = member.membership;
|
||||||
switch (userMembership) {
|
switch (userMembership) {
|
||||||
case 'join':
|
case 'join':
|
||||||
return messageJSX(t("InviteUser.invite_result.already_joined"), true);
|
return messageJSX(t("Organisms.InviteUser.invite_result.already_joined"), true);
|
||||||
case 'invite':
|
case 'invite':
|
||||||
return messageJSX(t("InviteUser.invite_result.already_invited"), true);
|
return messageJSX(t("Organisms.InviteUser.invite_result.already_invited"), true);
|
||||||
case 'ban':
|
case 'ban':
|
||||||
return messageJSX(t("InviteUser.invite_result.banned"), false);
|
return messageJSX(t("Organisms.InviteUser.invite_result.banned"), false);
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -245,13 +245,13 @@ function InviteUser({
|
||||||
return (
|
return (
|
||||||
<PopupWindow
|
<PopupWindow
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
title={(typeof roomId === 'string' ? t("InviteUser.invite_to_room", {room: mx.getRoom(roomId).name}) : t("InviteUser.invite_to_dm"))}
|
title={(typeof roomId === 'string' ? t("Organisms.InviteUser.invite_to_room", {room: mx.getRoom(roomId).name}) : t("Organisms.InviteUser.invite_to_dm"))}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
||||||
onRequestClose={onRequestClose}
|
onRequestClose={onRequestClose}
|
||||||
>
|
>
|
||||||
<div className="invite-user">
|
<div className="invite-user">
|
||||||
<form className="invite-user__form" onSubmit={(e) => { e.preventDefault(); searchUser(usernameRef.current.value); }}>
|
<form className="invite-user__form" onSubmit={(e) => { e.preventDefault(); searchUser(usernameRef.current.value); }}>
|
||||||
<Input value={searchTerm} forwardRef={usernameRef} label={t("InviteUser.search_label")} />
|
<Input value={searchTerm} forwardRef={usernameRef} label={t("Organisms.InviteUser.search_label")} />
|
||||||
<Button disabled={isSearching} iconSrc={UserIC} variant="primary" type="submit">{t("common.search")}</Button>
|
<Button disabled={isSearching} iconSrc={UserIC} variant="primary" type="submit">{t("common.search")}</Button>
|
||||||
</form>
|
</form>
|
||||||
<div className="invite-user__search-status">
|
<div className="invite-user__search-status">
|
||||||
|
@ -259,13 +259,13 @@ function InviteUser({
|
||||||
typeof searchQuery.username !== 'undefined' && isSearching && (
|
typeof searchQuery.username !== 'undefined' && isSearching && (
|
||||||
<div className="flex--center">
|
<div className="flex--center">
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text variant="b2">{t("InviteUser.searching_for_user", {user_name: searchQuery.username})}</Text>
|
<Text variant="b2">{t("Organisms.InviteUser.searching_for_user", {user_name: searchQuery.username})}</Text>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
typeof searchQuery.username !== 'undefined' && !isSearching && (
|
typeof searchQuery.username !== 'undefined' && !isSearching && (
|
||||||
<Text variant="b2">{t("InviteUser.search_result_title", {user_name: searchQuery.username})}</Text>
|
<Text variant="b2">{t("Organisms.InviteUser.search_result_title", {user_name: searchQuery.username})}</Text>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,10 +61,10 @@ function JoinAliasContent({ term, requestClose }) {
|
||||||
const alias = e.target.alias.value;
|
const alias = e.target.alias.value;
|
||||||
if (alias?.trim() === '') return;
|
if (alias?.trim() === '') return;
|
||||||
if (alias.match(ALIAS_OR_ID_REG) === null) {
|
if (alias.match(ALIAS_OR_ID_REG) === null) {
|
||||||
setError(t("JoinAlias.invalid_address"));
|
setError(t("Organisms.JoinAlias.invalid_address"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setProcess(t("JoinAlias.looking_for_address"));
|
setProcess(t("Organisms.JoinAlias.looking_for_address"));
|
||||||
setError(undefined);
|
setError(undefined);
|
||||||
let via;
|
let via;
|
||||||
if (alias.startsWith('#')) {
|
if (alias.startsWith('#')) {
|
||||||
|
@ -72,12 +72,12 @@ function JoinAliasContent({ term, requestClose }) {
|
||||||
const aliasData = await mx.resolveRoomAlias(alias);
|
const aliasData = await mx.resolveRoomAlias(alias);
|
||||||
via = aliasData?.servers.slice(0, 3) || [];
|
via = aliasData?.servers.slice(0, 3) || [];
|
||||||
if (mountStore.getItem()) {
|
if (mountStore.getItem()) {
|
||||||
setProcess(t("JoinAlias.joining_alias", {alias_name: alias}));
|
setProcess(t("Organisms.JoinAlias.joining_alias", {alias_name: alias}));
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (!mountStore.getItem()) return;
|
if (!mountStore.getItem()) return;
|
||||||
setProcess(false);
|
setProcess(false);
|
||||||
setError(t("JoinAlias.couldnt_find_room_or_space_alias", {alias_name: alias}));
|
setError(t("Organisms.JoinAlias.couldnt_find_room_or_space_alias", {alias_name: alias}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -88,14 +88,14 @@ function JoinAliasContent({ term, requestClose }) {
|
||||||
} catch {
|
} catch {
|
||||||
if (!mountStore.getItem()) return;
|
if (!mountStore.getItem()) return;
|
||||||
setProcess(false);
|
setProcess(false);
|
||||||
setError(t("JoinAlias.couldnt_find_room_or_space", {alias_name: alias}));
|
setError(t("Organisms.JoinAlias.couldnt_find_room_or_space", {alias_name: alias}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form className="join-alias" onSubmit={handleSubmit}>
|
<form className="join-alias" onSubmit={handleSubmit}>
|
||||||
<Input
|
<Input
|
||||||
label={t("JoinAlias.address_label")}
|
label={t("Organisms.JoinAlias.address_label")}
|
||||||
value={term}
|
value={term}
|
||||||
name="alias"
|
name="alias"
|
||||||
required
|
required
|
||||||
|
@ -149,7 +149,7 @@ function JoinAlias() {
|
||||||
<Dialog
|
<Dialog
|
||||||
isOpen={data !== null}
|
isOpen={data !== null}
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>{t("JoinAlias.title")}</Text>
|
<Text variant="s1" weight="medium" primary>{t("Organisms.JoinAlias.title")}</Text>
|
||||||
)}
|
)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={"common.close"} />}
|
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={"common.close"} />}
|
||||||
onRequestClose={requestClose}
|
onRequestClose={requestClose}
|
||||||
|
|
|
@ -116,7 +116,7 @@ function DrawerBreadcrumb({ spaceId }) {
|
||||||
className={index === spacePath.length - 1 ? 'drawer-breadcrumb__btn--selected' : ''}
|
className={index === spacePath.length - 1 ? 'drawer-breadcrumb__btn--selected' : ''}
|
||||||
onClick={() => selectSpace(id)}
|
onClick={() => selectSpace(id)}
|
||||||
>
|
>
|
||||||
<Text variant="b2">{id === cons.tabs.HOME ? t("DrawerBreadcrumb.home") : twemojify(mx.getRoom(id).name)}</Text>
|
<Text variant="b2">{id === cons.tabs.HOME ? t("Organisms.DrawerBreadcrumb.home") : twemojify(mx.getRoom(id).name)}</Text>
|
||||||
{ noti !== null && (
|
{ noti !== null && (
|
||||||
<NotificationBadge
|
<NotificationBadge
|
||||||
alert={noti.highlight !== 0}
|
alert={noti.highlight !== 0}
|
||||||
|
|
|
@ -44,27 +44,27 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MenuHeader>{t("DrawerHeader.add_rooms_or_spaces")}</MenuHeader>
|
<MenuHeader>{t("Organisms.DrawerHeader.add_rooms_or_spaces")}</MenuHeader>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
iconSrc={SpacePlusIC}
|
iconSrc={SpacePlusIC}
|
||||||
onClick={() => { afterOptionSelect(); openCreateRoom(true, spaceId); }}
|
onClick={() => { afterOptionSelect(); openCreateRoom(true, spaceId); }}
|
||||||
disabled={!canManage}
|
disabled={!canManage}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.create_new_space")}
|
{t("Organisms.DrawerHeader.create_new_space")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
iconSrc={HashPlusIC}
|
iconSrc={HashPlusIC}
|
||||||
onClick={() => { afterOptionSelect(); openCreateRoom(false, spaceId); }}
|
onClick={() => { afterOptionSelect(); openCreateRoom(false, spaceId); }}
|
||||||
disabled={!canManage}
|
disabled={!canManage}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.create_new_room")}
|
{t("Organisms.DrawerHeader.create_new_room")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{ !spaceId && (
|
{ !spaceId && (
|
||||||
<MenuItem
|
<MenuItem
|
||||||
iconSrc={HashGlobeIC}
|
iconSrc={HashGlobeIC}
|
||||||
onClick={() => { afterOptionSelect(); openPublicRooms(); }}
|
onClick={() => { afterOptionSelect(); openPublicRooms(); }}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.join_public_room")}
|
{t("Organisms.DrawerHeader.join_public_room")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
{ !spaceId && (
|
{ !spaceId && (
|
||||||
|
@ -72,7 +72,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
|
||||||
iconSrc={PlusIC}
|
iconSrc={PlusIC}
|
||||||
onClick={() => { afterOptionSelect(); openJoinAlias(); }}
|
onClick={() => { afterOptionSelect(); openJoinAlias(); }}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.join_with_address")}
|
{t("Organisms.DrawerHeader.join_with_address")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
{ spaceId && (
|
{ spaceId && (
|
||||||
|
@ -81,7 +81,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
|
||||||
onClick={() => { afterOptionSelect(); openSpaceAddExisting(spaceId); }}
|
onClick={() => { afterOptionSelect(); openSpaceAddExisting(spaceId); }}
|
||||||
disabled={!canManage}
|
disabled={!canManage}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.add_existing")}
|
{t("Organisms.DrawerHeader.add_existing")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
{ spaceId && (
|
{ spaceId && (
|
||||||
|
@ -89,7 +89,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
|
||||||
onClick={() => { afterOptionSelect(); openSpaceManage(spaceId); }}
|
onClick={() => { afterOptionSelect(); openSpaceManage(spaceId); }}
|
||||||
iconSrc={HashSearchIC}
|
iconSrc={HashSearchIC}
|
||||||
>
|
>
|
||||||
{t("DrawerHeader.manage_rooms")}
|
{t("Organisms.DrawerHeader.manage_rooms")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
@ -105,7 +105,7 @@ HomeSpaceOptions.propTypes = {
|
||||||
|
|
||||||
function DrawerHeader({ selectedTab, spaceId }) {
|
function DrawerHeader({ selectedTab, spaceId }) {
|
||||||
const mx = initMatrix.matrixClient;
|
const mx = initMatrix.matrixClient;
|
||||||
const tabName = selectedTab !== cons.tabs.DIRECTS ? t("DrawerHeader.home") : t("DrawerHeader.direct_messages");
|
const tabName = selectedTab !== cons.tabs.DIRECTS ? t("Organisms.DrawerHeader.home") : t("Organisms.DrawerHeader.direct_messages");
|
||||||
|
|
||||||
const isDMTab = selectedTab === cons.tabs.DIRECTS;
|
const isDMTab = selectedTab === cons.tabs.DIRECTS;
|
||||||
const room = mx.getRoom(spaceId);
|
const room = mx.getRoom(spaceId);
|
||||||
|
@ -149,8 +149,8 @@ function DrawerHeader({ selectedTab, spaceId }) {
|
||||||
</TitleWrapper>
|
</TitleWrapper>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{ isDMTab && <IconButton onClick={() => openInviteUser()} tooltip={t("DrawerHeader.start_dm_tooltip")} src={PlusIC} size="small" /> }
|
{ isDMTab && <IconButton onClick={() => openInviteUser()} tooltip={t("Organisms.DrawerHeader.start_dm_tooltip")} src={PlusIC} size="small" /> }
|
||||||
{ !isDMTab && <IconButton onClick={openHomeSpaceOptions} tooltip={t("DrawerHeader.add_rooms_spaces_tooltip")} src={PlusIC} size="small" /> }
|
{ !isDMTab && <IconButton onClick={openHomeSpaceOptions} tooltip={t("Organisms.DrawerHeader.add_rooms_spaces_tooltip")} src={PlusIC} size="small" /> }
|
||||||
</Header>
|
</Header>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ function ProfileAvatarMenu() {
|
||||||
return (
|
return (
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
onClick={openSettings}
|
onClick={openSettings}
|
||||||
tooltip={t("SideBar.settings_tooltip")}
|
tooltip={t("Organisms.SideBar.settings_tooltip")}
|
||||||
avatar={(
|
avatar={(
|
||||||
<Avatar
|
<Avatar
|
||||||
text={profile.displayName}
|
text={profile.displayName}
|
||||||
|
@ -107,7 +107,7 @@ function CrossSigninAlert() {
|
||||||
return (
|
return (
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
className="sidebar__cross-signin-alert"
|
className="sidebar__cross-signin-alert"
|
||||||
tooltip={t("SideBar.unverified_sessions", {count: unverified.length})}
|
tooltip={t("Organisms.SideBar.unverified_sessions", {count: unverified.length})}
|
||||||
onClick={() => openSettings(settingTabText.SECURITY)}
|
onClick={() => openSettings(settingTabText.SECURITY)}
|
||||||
avatar={<Avatar iconSrc={ShieldUserIC} iconColor="var(--ic-danger-normal)" size="normal" />}
|
avatar={<Avatar iconSrc={ShieldUserIC} iconColor="var(--ic-danger-normal)" size="normal" />}
|
||||||
/>
|
/>
|
||||||
|
@ -155,7 +155,7 @@ function FeaturedTab() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
tooltip={t("SideBar.home_tooltip")}
|
tooltip={t("Organisms.SideBar.home_tooltip")}
|
||||||
active={selectedTab === cons.tabs.HOME}
|
active={selectedTab === cons.tabs.HOME}
|
||||||
onClick={() => selectTab(cons.tabs.HOME)}
|
onClick={() => selectTab(cons.tabs.HOME)}
|
||||||
avatar={<Avatar iconSrc={HomeIC} size="normal" />}
|
avatar={<Avatar iconSrc={HomeIC} size="normal" />}
|
||||||
|
@ -167,7 +167,7 @@ function FeaturedTab() {
|
||||||
) : null}
|
) : null}
|
||||||
/>
|
/>
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
tooltip={t("SideBar.direct_messages_tooltip")}
|
tooltip={t("Organisms.SideBar.direct_messages_tooltip")}
|
||||||
active={selectedTab === cons.tabs.DIRECTS}
|
active={selectedTab === cons.tabs.DIRECTS}
|
||||||
onClick={() => selectTab(cons.tabs.DIRECTS)}
|
onClick={() => selectTab(cons.tabs.DIRECTS)}
|
||||||
avatar={<Avatar iconSrc={UserIC} size="normal" />}
|
avatar={<Avatar iconSrc={UserIC} size="normal" />}
|
||||||
|
@ -363,7 +363,7 @@ function SideBar() {
|
||||||
<div className="space-container">
|
<div className="space-container">
|
||||||
<SpaceShortcut />
|
<SpaceShortcut />
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
tooltip={t("SideBar.pin_spaces_tooltip")}
|
tooltip={t("Organisms.SideBar.pin_spaces_tooltip")}
|
||||||
onClick={() => openShortcutSpaces()}
|
onClick={() => openShortcutSpaces()}
|
||||||
avatar={<Avatar iconSrc={AddPinIC} size="normal" />}
|
avatar={<Avatar iconSrc={AddPinIC} size="normal" />}
|
||||||
/>
|
/>
|
||||||
|
@ -375,13 +375,13 @@ function SideBar() {
|
||||||
<div className="sidebar-divider" />
|
<div className="sidebar-divider" />
|
||||||
<div className="sticky-container">
|
<div className="sticky-container">
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
tooltip={t("SideBar.search_tooltip")}
|
tooltip={t("Organisms.SideBar.search_tooltip")}
|
||||||
onClick={() => openSearch()}
|
onClick={() => openSearch()}
|
||||||
avatar={<Avatar iconSrc={SearchIC} size="normal" />}
|
avatar={<Avatar iconSrc={SearchIC} size="normal" />}
|
||||||
/>
|
/>
|
||||||
{ totalInvites !== 0 && (
|
{ totalInvites !== 0 && (
|
||||||
<SidebarAvatar
|
<SidebarAvatar
|
||||||
tooltip={t("SideBar.invites_tooltip")}
|
tooltip={t("Organisms.SideBar.invites_tooltip")}
|
||||||
onClick={() => openInviteList()}
|
onClick={() => openInviteList()}
|
||||||
avatar={<Avatar iconSrc={InviteIC} size="normal" />}
|
avatar={<Avatar iconSrc={InviteIC} size="normal" />}
|
||||||
notificationBadge={<NotificationBadge alert content={totalInvites} />}
|
notificationBadge={<NotificationBadge alert content={totalInvites} />}
|
||||||
|
|
|
@ -49,8 +49,8 @@ function ProfileEditor({ userId }) {
|
||||||
const handleAvatarUpload = async (url) => {
|
const handleAvatarUpload = async (url) => {
|
||||||
if (url === null) {
|
if (url === null) {
|
||||||
const isConfirmed = await confirmDialog(
|
const isConfirmed = await confirmDialog(
|
||||||
t("ProfileEditor.remove_avatar"),
|
t("Organisms.ProfileEditor.remove_avatar"),
|
||||||
t("ProfileViewer.remove_avatar_confirmation"),
|
t("Organisms.ProfileViewer.remove_avatar_confirmation"),
|
||||||
t("common.remove"),
|
t("common.remove"),
|
||||||
'caution',
|
'caution',
|
||||||
);
|
);
|
||||||
|
@ -90,7 +90,7 @@ function ProfileEditor({ userId }) {
|
||||||
onSubmit={(e) => { e.preventDefault(); saveDisplayName(); }}
|
onSubmit={(e) => { e.preventDefault(); saveDisplayName(); }}
|
||||||
>
|
>
|
||||||
<Input
|
<Input
|
||||||
label={t("ProfileEditor.display_name_message", {user_name: mx.getUserId()})}
|
label={t("Organisms.ProfileEditor.display_name_message", {user_name: mx.getUserId()})}
|
||||||
onChange={onDisplayNameInputChange}
|
onChange={onDisplayNameInputChange}
|
||||||
value={mx.getUser(mx.getUserId()).displayName}
|
value={mx.getUser(mx.getUserId()).displayName}
|
||||||
forwardRef={displayNameRef}
|
forwardRef={displayNameRef}
|
||||||
|
|
|
@ -77,14 +77,14 @@ function ModerationTools({
|
||||||
<div className="moderation-tools">
|
<div className="moderation-tools">
|
||||||
{canIKick && (
|
{canIKick && (
|
||||||
<form onSubmit={handleKick}>
|
<form onSubmit={handleKick}>
|
||||||
<Input label={t("ProfileViewer.kick_reason_label")} name="kick-reason" />
|
<Input label={t("Organisms.ProfileViewer.kick_reason_label")} name="kick-reason" />
|
||||||
<Button type="submit">{t("ProfileViewer.kick_button")}</Button>
|
<Button type="submit">{t("Organisms.ProfileViewer.kick_button")}</Button>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
{canIBan && (
|
{canIBan && (
|
||||||
<form onSubmit={handleBan}>
|
<form onSubmit={handleBan}>
|
||||||
<Input label={t("ProfileViewer.ban_reason_label")} name="ban-reason" />
|
<Input label={t("Organisms.ProfileViewer.ban_reason_label")} name="ban-reason" />
|
||||||
<Button type="submit">{t("ProfileViewer.ban_button")}</Button>
|
<Button type="submit">{t("Organisms.ProfileViewer.ban_button")}</Button>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -127,8 +127,8 @@ function SessionInfo({ userId }) {
|
||||||
if (!isVisible) return null;
|
if (!isVisible) return null;
|
||||||
return (
|
return (
|
||||||
<div className="session-info__chips">
|
<div className="session-info__chips">
|
||||||
{devices === null && <Text variant="b2">{t("ProfileViewer.loading_sessions")}</Text>}
|
{devices === null && <Text variant="b2">{t("Organisms.ProfileViewer.loading_sessions")}</Text>}
|
||||||
{devices?.length === 0 && <Text variant="b2">{t("ProfileViewer.no_sessions_found")}</Text>}
|
{devices?.length === 0 && <Text variant="b2">{t("Organisms.ProfileViewer.no_sessions_found")}</Text>}
|
||||||
{devices !== null && (devices.map((device) => (
|
{devices !== null && (devices.map((device) => (
|
||||||
<Chip
|
<Chip
|
||||||
key={device.deviceId}
|
key={device.deviceId}
|
||||||
|
@ -146,7 +146,7 @@ function SessionInfo({ userId }) {
|
||||||
onClick={() => setIsVisible(!isVisible)}
|
onClick={() => setIsVisible(!isVisible)}
|
||||||
iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC}
|
iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC}
|
||||||
>
|
>
|
||||||
<Text variant="b2">{t("ProfileViewer.view_sessions", {count: devices?.length})}</Text>
|
<Text variant="b2">{t("Organisms.ProfileViewer.view_sessions", {count: devices?.length})}</Text>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
{renderSessionChips()}
|
{renderSessionChips()}
|
||||||
</div>
|
</div>
|
||||||
|
@ -261,7 +261,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
|
||||||
onClick={openDM}
|
onClick={openDM}
|
||||||
disabled={isCreatingDM}
|
disabled={isCreatingDM}
|
||||||
>
|
>
|
||||||
{isCreatingDM ? t("ProfileViewer.creating_dm_room") : t("ProfileViewer.send_direct_message_button")}
|
{isCreatingDM ? t("Organisms.ProfileViewer.creating_dm_room") : t("Organisms.ProfileViewer.send_direct_message_button")}
|
||||||
</Button>
|
</Button>
|
||||||
{ isBanned && canIKick && (
|
{ isBanned && canIKick && (
|
||||||
<Button
|
<Button
|
||||||
|
@ -290,8 +290,8 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
isUserIgnored
|
isUserIgnored
|
||||||
? `${isIgnoring ? t("ProfileViewer.unignoring") : t("ProfileViewer.unignore")}`
|
? `${isIgnoring ? t("Organisms.ProfileViewer.unignoring") : t("Organisms.ProfileViewer.unignore")}`
|
||||||
: `${isIgnoring ? t("ProfileViewer.ignoring") : t("ProfileViewer.ignore")}`
|
: `${isIgnoring ? t("Organisms.ProfileViewer.ignoring") : t("Organisms.ProfileViewer.ignore")}`
|
||||||
}
|
}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -374,14 +374,14 @@ function ProfileViewer() {
|
||||||
|
|
||||||
const handleChangePowerLevel = async (newPowerLevel) => {
|
const handleChangePowerLevel = async (newPowerLevel) => {
|
||||||
if (newPowerLevel === powerLevel) return;
|
if (newPowerLevel === powerLevel) return;
|
||||||
const SHARED_POWER_MSG = t("ProfileViewer.shared_power_message");
|
const SHARED_POWER_MSG = t("Organisms.ProfileViewer.shared_power_message");
|
||||||
const DEMOTING_MYSELF_MSG = t("ProfileViewer.demoting_self_message");
|
const DEMOTING_MYSELF_MSG = t("Organisms.ProfileViewer.demoting_self_message");
|
||||||
|
|
||||||
const isSharedPower = newPowerLevel === myPowerLevel;
|
const isSharedPower = newPowerLevel === myPowerLevel;
|
||||||
const isDemotingMyself = userId === mx.getUserId();
|
const isDemotingMyself = userId === mx.getUserId();
|
||||||
if (isSharedPower || isDemotingMyself) {
|
if (isSharedPower || isDemotingMyself) {
|
||||||
const isConfirmed = await confirmDialog(
|
const isConfirmed = await confirmDialog(
|
||||||
t("ProfileViewer.change_power_level"),
|
t("Organisms.ProfileViewer.change_power_level"),
|
||||||
isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG,
|
isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG,
|
||||||
t("common.change"),
|
t("common.change"),
|
||||||
'caution',
|
'caution',
|
||||||
|
|
|
@ -59,7 +59,7 @@ function TryJoinWithAlias({ alias, onRequestClose }) {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setStatus({
|
setStatus({
|
||||||
isJoining: false,
|
isJoining: false,
|
||||||
error: t("PublicRooms.could_not_join_alias", {alias: alias}),
|
error: t("Organisms.PublicRooms.could_not_join_alias", {alias: alias}),
|
||||||
roomId: null,
|
roomId: null,
|
||||||
tempRoomId: null,
|
tempRoomId: null,
|
||||||
});
|
});
|
||||||
|
@ -69,12 +69,12 @@ function TryJoinWithAlias({ alias, onRequestClose }) {
|
||||||
return (
|
return (
|
||||||
<div className="try-join-with-alias">
|
<div className="try-join-with-alias">
|
||||||
{status.roomId === null && !status.isJoining && status.error === null && (
|
{status.roomId === null && !status.isJoining && status.error === null && (
|
||||||
<Button onClick={() => joinWithAlias()}>{t("PublicRooms.try_joining_alias", {alias: alias})}</Button>
|
<Button onClick={() => joinWithAlias()}>{t("Organisms.PublicRooms.try_joining_alias", {alias: alias})}</Button>
|
||||||
)}
|
)}
|
||||||
{status.isJoining && (
|
{status.isJoining && (
|
||||||
<>
|
<>
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{t("PublicRooms.joining_alias", {alias: alias})}</Text>
|
<Text>{t("Organisms.PublicRooms.joining_alias", {alias: alias})}</Text>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{status.roomId !== null && (
|
{status.roomId !== null && (
|
||||||
|
@ -147,8 +147,8 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
|
||||||
if (totalRooms.length === 0) {
|
if (totalRooms.length === 0) {
|
||||||
updateSearchQuery({
|
updateSearchQuery({
|
||||||
error: inputRoomName === ''
|
error: inputRoomName === ''
|
||||||
? t("PublicRooms.no_public_rooms", {homeserver: inputHs})
|
? t("Organisms.PublicRooms.no_public_rooms", {homeserver: inputHs})
|
||||||
: t("PublicRooms.no_result_found", {homeserver: inputHs, input: inputRoomName}),
|
: t("Organisms.PublicRooms.no_result_found", {homeserver: inputHs, input: inputRoomName}),
|
||||||
alias: isInputAlias ? inputRoomName : null,
|
alias: isInputAlias ? inputRoomName : null,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -225,17 +225,17 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
|
||||||
return (
|
return (
|
||||||
<PopupWindow
|
<PopupWindow
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
title={t("PublicRooms.title")}
|
title={t("Organisms.PublicRooms.title")}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
|
||||||
onRequestClose={onRequestClose}
|
onRequestClose={onRequestClose}
|
||||||
>
|
>
|
||||||
<div className="public-rooms">
|
<div className="public-rooms">
|
||||||
<form className="public-rooms__form" onSubmit={(e) => { e.preventDefault(); searchRooms(); }}>
|
<form className="public-rooms__form" onSubmit={(e) => { e.preventDefault(); searchRooms(); }}>
|
||||||
<div className="public-rooms__input-wrapper">
|
<div className="public-rooms__input-wrapper">
|
||||||
<Input value={searchTerm} forwardRef={roomNameRef} label={t("PublicRooms.search_room_name_alias")} />
|
<Input value={searchTerm} forwardRef={roomNameRef} label={t("Organisms.PublicRooms.search_room_name_alias")} />
|
||||||
<Input forwardRef={hsRef} value={userId.slice(userId.indexOf(':') + 1)} label={t("common.homeserver")} required />
|
<Input forwardRef={hsRef} value={userId.slice(userId.indexOf(':') + 1)} label={t("common.homeserver")} required />
|
||||||
</div>
|
</div>
|
||||||
<Button disabled={isSearching} iconSrc={HashSearchIC} variant="primary" type="submit">{t("PublicRooms.search_button")}</Button>
|
<Button disabled={isSearching} iconSrc={HashSearchIC} variant="primary" type="submit">{t("Organisms.PublicRooms.search_button")}</Button>
|
||||||
</form>
|
</form>
|
||||||
<div className="public-rooms__search-status">
|
<div className="public-rooms__search-status">
|
||||||
{
|
{
|
||||||
|
@ -244,13 +244,13 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
|
||||||
? (
|
? (
|
||||||
<div className="flex--center">
|
<div className="flex--center">
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text variant="b2">{t("PublicRooms.loading", {homeserver: searchQuery.homeserver})}</Text>
|
<Text variant="b2">{t("Organisms.PublicRooms.loading", {homeserver: searchQuery.homeserver})}</Text>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
: (
|
: (
|
||||||
<div className="flex--center">
|
<div className="flex--center">
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text variant="b2">{t("PublicRooms.searching", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
|
<Text variant="b2">{t("Organisms.PublicRooms.searching", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -258,8 +258,8 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
|
||||||
{
|
{
|
||||||
typeof searchQuery.name !== 'undefined' && !isSearching && (
|
typeof searchQuery.name !== 'undefined' && !isSearching && (
|
||||||
searchQuery.name === ''
|
searchQuery.name === ''
|
||||||
? <Text variant="b2">{t("PublicRooms.result_title", {homeserver: searchQuery.homeserver})}</Text>
|
? <Text variant="b2">{t("Organisms.PublicRooms.result_title", {homeserver: searchQuery.homeserver})}</Text>
|
||||||
: <Text variant="b2">{t("PublicRooms.search_result_title", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
|
: <Text variant="b2">{t("Organisms.PublicRooms.search_result_title", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{ searchQuery.error && (
|
{ searchQuery.error && (
|
||||||
|
|
|
@ -94,9 +94,9 @@ function GeneralSettings({ roomId }) {
|
||||||
variant="danger"
|
variant="danger"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
const isConfirmed = await confirmDialog(
|
const isConfirmed = await confirmDialog(
|
||||||
t("RoomSettings.leave_room"),
|
t("Organisms.RoomSettings.leave_room"),
|
||||||
t("RoomSettings.leave_room_confirm_message", {room_name: room.name}),
|
t("Organisms.RoomSettings.leave_room_confirm_message", {room_name: room.name}),
|
||||||
t("RoomSettings.leave_room_confirm_button"),
|
t("Organisms.RoomSettings.leave_room_confirm_button"),
|
||||||
'danger',
|
'danger',
|
||||||
);
|
);
|
||||||
if (!isConfirmed) return;
|
if (!isConfirmed) return;
|
||||||
|
@ -108,15 +108,15 @@ function GeneralSettings({ roomId }) {
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</div>
|
</div>
|
||||||
<div className="room-settings__card">
|
<div className="room-settings__card">
|
||||||
<MenuHeader>{t("RoomSettings.notification_header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.RoomSettings.notification_header")}</MenuHeader>
|
||||||
<RoomNotification roomId={roomId} />
|
<RoomNotification roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
<div className="room-settings__card">
|
<div className="room-settings__card">
|
||||||
<MenuHeader>{t("RoomSettings.visibility_header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.RoomSettings.visibility_header")}</MenuHeader>
|
||||||
<RoomVisibility roomId={roomId} />
|
<RoomVisibility roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
<div className="room-settings__card">
|
<div className="room-settings__card">
|
||||||
<MenuHeader>{t("RoomSettings.address_header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.RoomSettings.address_header")}</MenuHeader>
|
||||||
<RoomAliases roomId={roomId} />
|
<RoomAliases roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
@ -131,11 +131,11 @@ function SecuritySettings({ roomId }) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="room-settings__card">
|
<div className="room-settings__card">
|
||||||
<MenuHeader>{t("RoomSettings.encryption_header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.RoomSettings.encryption_header")}</MenuHeader>
|
||||||
<RoomEncryption roomId={roomId} />
|
<RoomEncryption roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
<div className="room-settings__card">
|
<div className="room-settings__card">
|
||||||
<MenuHeader>{t("RoomSettings.message_history_header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.RoomSettings.message_history_header")}</MenuHeader>
|
||||||
<RoomHistoryVisibility roomId={roomId} />
|
<RoomHistoryVisibility roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
@ -187,7 +187,7 @@ function RoomSettings({ roomId }) {
|
||||||
<TitleWrapper>
|
<TitleWrapper>
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{`${room.name}`}
|
{`${room.name}`}
|
||||||
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("RoomSettings.room_settings_subtitle")}</span>
|
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("Organisms.RoomSettings.room_settings_subtitle")}</span>
|
||||||
</Text>
|
</Text>
|
||||||
</TitleWrapper>
|
</TitleWrapper>
|
||||||
<RawIcon size="small" src={ChevronTopIC} />
|
<RawIcon size="small" src={ChevronTopIC} />
|
||||||
|
|
|
@ -68,14 +68,14 @@ function RoomIntroContainer({ event, timeline }) {
|
||||||
let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
|
let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
|
||||||
avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
|
avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
|
||||||
|
|
||||||
const heading = isDM ? room.name : t("RoomViewContent.welcome_to_room", {room_name: room.name});
|
const heading = isDM ? room.name : t("Organisms.RoomViewContent.welcome_to_room", {room_name: room.name});
|
||||||
const topic = twemojify(roomTopic || '', undefined, true);
|
const topic = twemojify(roomTopic || '', undefined, true);
|
||||||
const nameJsx = twemojify(room.name);
|
const nameJsx = twemojify(room.name);
|
||||||
const desc = isDM
|
const desc = isDM
|
||||||
? (
|
? (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomViewContent.beginning_dm"}
|
i18nKey={"Organisms.RoomViewContent.beginning_dm"}
|
||||||
values={{user_name: nameJsx}}
|
values={{user_name: nameJsx}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -86,7 +86,7 @@ function RoomIntroContainer({ event, timeline }) {
|
||||||
: (
|
: (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomViewContent.beginning_room"}
|
i18nKey={"Organisms.RoomViewContent.beginning_room"}
|
||||||
values={{room_name: nameJsx}}
|
values={{room_name: nameJsx}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -112,7 +112,7 @@ function RoomIntroContainer({ event, timeline }) {
|
||||||
name={room.name}
|
name={room.name}
|
||||||
heading={twemojify(heading)}
|
heading={twemojify(heading)}
|
||||||
desc={desc}
|
desc={desc}
|
||||||
time={event ? t("RoomViewContent.created_on", {date: event.getDate(), formatParams: { date: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'}}}) : null}
|
time={event ? t("Organisms.RoomViewContent.created_on", {date: event.getDate(), formatParams: { date: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'}}}) : null}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -539,7 +539,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
|
||||||
&& readUptoEvent.getTs() < mEvent.getTs());
|
&& readUptoEvent.getTs() < mEvent.getTs());
|
||||||
if (unreadDivider) {
|
if (unreadDivider) {
|
||||||
isNewEvent = true;
|
isNewEvent = true;
|
||||||
tl.push(<Divider key={`new-${mEvent.getId()}`} variant="positive" text={t("RoomViewContent.new_messages")} />);
|
tl.push(<Divider key={`new-${mEvent.getId()}`} variant="positive" text={t("Organisms.RoomViewContent.new_messages")} />);
|
||||||
itemCountIndex += 1;
|
itemCountIndex += 1;
|
||||||
if (jumpToItemIndex === -1) jumpToItemIndex = itemCountIndex;
|
if (jumpToItemIndex === -1) jumpToItemIndex = itemCountIndex;
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,17 +124,17 @@ function RoomViewFloating({
|
||||||
<>
|
<>
|
||||||
<div className={`room-view__unread ${isJumpToEvent ? 'room-view__unread--open' : ''}`}>
|
<div className={`room-view__unread ${isJumpToEvent ? 'room-view__unread--open' : ''}`}>
|
||||||
<Button iconSrc={MessageUnreadIC} onClick={jumpToEvent} variant="primary">
|
<Button iconSrc={MessageUnreadIC} onClick={jumpToEvent} variant="primary">
|
||||||
<Text variant="b3" weight="medium">{t("RoomViewFloating.jump_unread")}</Text>
|
<Text variant="b3" weight="medium">{t("Organisms.RoomViewFloating.jump_unread")}</Text>
|
||||||
</Button>
|
</Button>
|
||||||
<Button iconSrc={TickMarkIC} onClick={cancelJumpToEvent} variant="primary">
|
<Button iconSrc={TickMarkIC} onClick={cancelJumpToEvent} variant="primary">
|
||||||
<Text variant="b3" weight="bold">{t("RoomViewFloating.mark_read")}</Text>
|
<Text variant="b3" weight="bold">{t("Organisms.RoomViewFloating.mark_read")}</Text>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div className={`room-view__typing${typingMembers.size > 0 ? ' room-view__typing--open' : ''}`}>
|
<div className={`room-view__typing${typingMembers.size > 0 ? ' room-view__typing--open' : ''}`}>
|
||||||
<div className="bouncing-loader"><div /></div>
|
<div className="bouncing-loader"><div /></div>
|
||||||
<Text variant="b2">
|
<Text variant="b2">
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey="RoomViewFloating.user_typing"
|
i18nKey="Organisms.RoomViewFloating.user_typing"
|
||||||
values={{count: typingMembers.size, user_one: getUserDisplayName(typingMemberValues?.[0]), user_two: getUserDisplayName(typingMemberValues?.[1]), user_three: getUserDisplayName(typingMemberValues?.[2]), user_four: getUserDisplayName(typingMemberValues?.[3])}}
|
values={{count: typingMembers.size, user_one: getUserDisplayName(typingMemberValues?.[0]), user_two: getUserDisplayName(typingMemberValues?.[1]), user_three: getUserDisplayName(typingMemberValues?.[2]), user_four: getUserDisplayName(typingMemberValues?.[3])}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -142,7 +142,7 @@ function RoomViewFloating({
|
||||||
</div>
|
</div>
|
||||||
<div className={`room-view__STB${isAtBottom ? '' : ' room-view__STB--open'}`}>
|
<div className={`room-view__STB${isAtBottom ? '' : ' room-view__STB--open'}`}>
|
||||||
<Button iconSrc={MessageIC} onClick={handleScrollToBottom}>
|
<Button iconSrc={MessageIC} onClick={handleScrollToBottom}>
|
||||||
<Text variant="b3" weight="medium">{t("RoomViewFloating.jump_latest")}</Text>
|
<Text variant="b3" weight="medium">{t("Organisms.RoomViewFloating.jump_latest")}</Text>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -98,9 +98,9 @@ function RoomViewHeader({ roomId }) {
|
||||||
</TitleWrapper>
|
</TitleWrapper>
|
||||||
<RawIcon src={ChevronBottomIC} />
|
<RawIcon src={ChevronBottomIC} />
|
||||||
</button>
|
</button>
|
||||||
<IconButton onClick={() => toggleRoomSettings(tabText.SEARCH)} tooltip={t("RoomViewHeader.search_tooltip")} src={SearchIC} />
|
<IconButton onClick={() => toggleRoomSettings(tabText.SEARCH)} tooltip={t("Organisms.RoomViewHeader.search_tooltip")} src={SearchIC} />
|
||||||
<IconButton className="room-header__drawer-btn" onClick={togglePeopleDrawer} tooltip={t("RoomViewHeader.people_tooltip")} src={UserIC} />
|
<IconButton className="room-header__drawer-btn" onClick={togglePeopleDrawer} tooltip={t("Organisms.RoomViewHeader.people_tooltip")} src={UserIC} />
|
||||||
<IconButton className="room-header__members-btn" onClick={() => toggleRoomSettings(tabText.MEMBERS)} tooltip={t("RoomViewHeader.members_tooltip")} src={UserIC} />
|
<IconButton className="room-header__members-btn" onClick={() => toggleRoomSettings(tabText.MEMBERS)} tooltip={t("Organisms.RoomViewHeader.members_tooltip")} src={UserIC} />
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={openRoomOptions}
|
onClick={openRoomOptions}
|
||||||
tooltip={t("common.options")}
|
tooltip={t("common.options")}
|
||||||
|
|
|
@ -86,7 +86,7 @@ function RoomViewInput({
|
||||||
function uploadingProgress(myRoomId, { loaded, total }) {
|
function uploadingProgress(myRoomId, { loaded, total }) {
|
||||||
if (myRoomId !== roomId) return;
|
if (myRoomId !== roomId) return;
|
||||||
const progressPer = Math.round((loaded * 100) / total);
|
const progressPer = Math.round((loaded * 100) / total);
|
||||||
uploadProgressRef.current.textContent = t("RoomViewInput.upload_progress", {progress: bytesToSize(loaded), total:bytesToSize(total), percent: progressPer});
|
uploadProgressRef.current.textContent = t("Organisms.RoomViewInput.upload_progress", {progress: bytesToSize(loaded), total:bytesToSize(total), percent: progressPer});
|
||||||
inputBaseRef.current.style.backgroundImage = `linear-gradient(90deg, var(--bg-surface-hover) ${progressPer}%, var(--bg-surface-low) ${progressPer}%)`;
|
inputBaseRef.current.style.backgroundImage = `linear-gradient(90deg, var(--bg-surface-hover) ${progressPer}%, var(--bg-surface-low) ${progressPer}%)`;
|
||||||
}
|
}
|
||||||
function clearAttachment(myRoomId) {
|
function clearAttachment(myRoomId) {
|
||||||
|
@ -316,8 +316,8 @@ function RoomViewInput({
|
||||||
<Text className="room-input__alert">
|
<Text className="room-input__alert">
|
||||||
{
|
{
|
||||||
tombstoneEvent
|
tombstoneEvent
|
||||||
? tombstoneEvent.getContent()?.body ?? t("RoomViewInput.tombstone_replaced")
|
? tombstoneEvent.getContent()?.body ?? t("Organisms.RoomViewInput.tombstone_replaced")
|
||||||
: t("RoomViewInput.tombstone_permission_denied")
|
: t("Organisms.RoomViewInput.tombstone_permission_denied")
|
||||||
}
|
}
|
||||||
</Text>
|
</Text>
|
||||||
);
|
);
|
||||||
|
@ -338,7 +338,7 @@ function RoomViewInput({
|
||||||
onChange={handleMsgTyping}
|
onChange={handleMsgTyping}
|
||||||
onPaste={handlePaste}
|
onPaste={handlePaste}
|
||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
placeholder={t("RoomViewInput.send_message_placeholder")}
|
placeholder={t("Organisms.RoomViewInput.send_message_placeholder")}
|
||||||
/>
|
/>
|
||||||
</Text>
|
</Text>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@ -352,7 +352,7 @@ function RoomViewInput({
|
||||||
cords.y -= 250;
|
cords.y -= 250;
|
||||||
openEmojiBoard(cords, addEmoji);
|
openEmojiBoard(cords, addEmoji);
|
||||||
}}
|
}}
|
||||||
tooltip={t("RoomViewInput.emoji_tooltip")}
|
tooltip={t("Organisms.RoomViewInput.emoji_tooltip")}
|
||||||
src={EmojiIC}
|
src={EmojiIC}
|
||||||
/>
|
/>
|
||||||
<IconButton onClick={sendMessage} tooltip={t("common.send")} src={SendIC} />
|
<IconButton onClick={sendMessage} tooltip={t("common.send")} src={SendIC} />
|
||||||
|
@ -373,7 +373,7 @@ function RoomViewInput({
|
||||||
</div>
|
</div>
|
||||||
<div className="room-attachment__info">
|
<div className="room-attachment__info">
|
||||||
<Text variant="b1">{attachment.name}</Text>
|
<Text variant="b1">{attachment.name}</Text>
|
||||||
<Text variant="b3"><span ref={uploadProgressRef}>{t("RoomViewInput.file_size", {size: bytesToSize(attachment.size)})}</span></Text>
|
<Text variant="b3"><span ref={uploadProgressRef}>{t("Organisms.RoomViewInput.file_size", {size: bytesToSize(attachment.size)})}</span></Text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -388,7 +388,7 @@ function RoomViewInput({
|
||||||
setReplyTo(null);
|
setReplyTo(null);
|
||||||
}}
|
}}
|
||||||
src={CrossIC}
|
src={CrossIC}
|
||||||
tooltip={t("RoomViewInput.cancel_reply_tooltip")}
|
tooltip={t("Organisms.RoomViewInput.cancel_reply_tooltip")}
|
||||||
size="extra-small"
|
size="extra-small"
|
||||||
/>
|
/>
|
||||||
<MessageReply
|
<MessageReply
|
||||||
|
|
|
@ -17,7 +17,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_joined"}
|
i18nKey={"Organisms.RoomCommon.user_joined"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -29,7 +29,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_left"}
|
i18nKey={"Organisms.RoomCommon.user_left"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -40,7 +40,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_invited"}
|
i18nKey={"Organisms.RoomCommon.user_invited"}
|
||||||
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
|
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -51,7 +51,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.invite_cancelled"}
|
i18nKey={"Organisms.RoomCommon.invite_cancelled"}
|
||||||
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
|
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -62,7 +62,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.invite_rejected"}
|
i18nKey={"Organisms.RoomCommon.invite_rejected"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -74,7 +74,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_kicked"}
|
i18nKey={"Organisms.RoomCommon.user_kicked"}
|
||||||
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
|
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -86,7 +86,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_banned"}
|
i18nKey={"Organisms.RoomCommon.user_banned"}
|
||||||
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
|
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -97,7 +97,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.user_unbanned"}
|
i18nKey={"Organisms.RoomCommon.user_unbanned"}
|
||||||
values={{user_name: twemojify(user), actor: twemojify(actor)}}
|
values={{user_name: twemojify(user), actor: twemojify(actor)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -108,7 +108,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.avatar_set"}
|
i18nKey={"Organisms.RoomCommon.avatar_set"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -119,7 +119,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.avatar_changed"}
|
i18nKey={"Organisms.RoomCommon.avatar_changed"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -130,7 +130,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.avatar_removed"}
|
i18nKey={"Organisms.RoomCommon.avatar_removed"}
|
||||||
values={{user_name: twemojify(user)}}
|
values={{user_name: twemojify(user)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -141,7 +141,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.name_set"}
|
i18nKey={"Organisms.RoomCommon.name_set"}
|
||||||
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -152,7 +152,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.name_changed"}
|
i18nKey={"Organisms.RoomCommon.name_changed"}
|
||||||
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
@ -163,7 +163,7 @@ function getTimelineJSXMessages() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey={"RoomCommon.name_removed"}
|
i18nKey={"Organisms.RoomCommon.name_removed"}
|
||||||
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
values={{user_name: twemojify(user), new_name: twemojify(newName)}}
|
||||||
components={{bold: <b/>}}
|
components={{bold: <b/>}}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -229,7 +229,7 @@ function Search() {
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</div>
|
</div>
|
||||||
<div className="search-dialog__footer">
|
<div className="search-dialog__footer">
|
||||||
<Text variant="b3">{t("Search.description")}</Text>
|
<Text variant="b3">{t("Organisms.Search.description")}</Text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</RawModal>
|
</RawModal>
|
||||||
|
|
|
@ -45,10 +45,10 @@ function AuthRequest({ onComplete, makeRequest }) {
|
||||||
lastUsedPassword = undefined;
|
lastUsedPassword = undefined;
|
||||||
if (!mountStore.getItem()) return;
|
if (!mountStore.getItem()) return;
|
||||||
if (err.errcode === 'M_FORBIDDEN') {
|
if (err.errcode === 'M_FORBIDDEN') {
|
||||||
setStatus({ error: t("AuthRequest.wrong_password") });
|
setStatus({ error: t("Organisms.AuthRequest.wrong_password") });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
setStatus({ error: t("AuthRequest.request_failed") });
|
setStatus({ error: t("Organisms.AuthRequest.request_failed") });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ function AuthRequest({ onComplete, makeRequest }) {
|
||||||
<form onSubmit={handleForm}>
|
<form onSubmit={handleForm}>
|
||||||
<Input
|
<Input
|
||||||
name="password"
|
name="password"
|
||||||
label={t("AuthRequest.password_label")}
|
label={t("Organisms.AuthRequest.password_label")}
|
||||||
type="password"
|
type="password"
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
required
|
required
|
||||||
|
|
|
@ -35,13 +35,13 @@ function CrossSigningSetup() {
|
||||||
const renderFailure = (requestClose) => (
|
const renderFailure = (requestClose) => (
|
||||||
<div className="cross-signing__failure">
|
<div className="cross-signing__failure">
|
||||||
<Text variant="h1">{twemojify('❌')}</Text>
|
<Text variant="h1">{twemojify('❌')}</Text>
|
||||||
<Text weight="medium">{t("CrossSigning.setup_failed")}</Text>
|
<Text weight="medium">{t("Organisms.CrossSigning.setup_failed")}</Text>
|
||||||
<Button onClick={requestClose}>{t("common.close")}</Button>
|
<Button onClick={requestClose}>{t("common.close")}</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t("CrossSigning.setup")}</Text>,
|
<Text variant="s1" weight="medium">{t("Organisms.CrossSigning.setup")}</Text>,
|
||||||
renderFailure,
|
renderFailure,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -59,7 +59,7 @@ function CrossSigningSetup() {
|
||||||
|
|
||||||
const renderSecurityKey = () => (
|
const renderSecurityKey = () => (
|
||||||
<div className="cross-signing__key">
|
<div className="cross-signing__key">
|
||||||
<Text weight="medium">{t("CrossSigning.save_security_key_message")}</Text>
|
<Text weight="medium">{t("Organisms.CrossSigning.save_security_key_message")}</Text>
|
||||||
<Text className="cross-signing__key-text">
|
<Text className="cross-signing__key-text">
|
||||||
{key.encodedPrivateKey}
|
{key.encodedPrivateKey}
|
||||||
</Text>
|
</Text>
|
||||||
|
@ -74,7 +74,7 @@ function CrossSigningSetup() {
|
||||||
downloadKey();
|
downloadKey();
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t("CrossSigning.security_key_dialog_title")}</Text>,
|
<Text variant="s1" weight="medium">{t("Organisms.CrossSigning.security_key_dialog_title")}</Text>,
|
||||||
() => renderSecurityKey(),
|
() => renderSecurityKey(),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -130,9 +130,9 @@ function CrossSigningSetup() {
|
||||||
<div className="cross-signing__setup">
|
<div className="cross-signing__setup">
|
||||||
<div className="cross-signing__setup-entry">
|
<div className="cross-signing__setup-entry">
|
||||||
<Text>
|
<Text>
|
||||||
{t("CrossSigning.security_key_generation_message")}
|
{t("Organisms.CrossSigning.security_key_generation_message")}
|
||||||
</Text>
|
</Text>
|
||||||
{genWithPhrase !== false && <Button variant="primary" onClick={() => setup()} disabled={genWithPhrase !== undefined}>{t("CrossSigning.security_key_generation_button")}</Button>}
|
{genWithPhrase !== false && <Button variant="primary" onClick={() => setup()} disabled={genWithPhrase !== undefined}>{t("Organisms.CrossSigning.security_key_generation_button")}</Button>}
|
||||||
{genWithPhrase === false && <Spinner size="small" />}
|
{genWithPhrase === false && <Spinner size="small" />}
|
||||||
</div>
|
</div>
|
||||||
<Text className="cross-signing__setup-divider">{t("common.or")}</Text>
|
<Text className="cross-signing__setup-divider">{t("common.or")}</Text>
|
||||||
|
@ -150,13 +150,13 @@ function CrossSigningSetup() {
|
||||||
disabled={genWithPhrase !== undefined}
|
disabled={genWithPhrase !== undefined}
|
||||||
>
|
>
|
||||||
<Text>
|
<Text>
|
||||||
{t("CrossSigning.security_phrase_message")}
|
{t("Organisms.CrossSigning.security_phrase_message")}
|
||||||
</Text>
|
</Text>
|
||||||
<Input
|
<Input
|
||||||
name="phrase"
|
name="phrase"
|
||||||
value={values.phrase}
|
value={values.phrase}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
label={t("CrossSigning.security_phrase_label")}
|
label={t("Organisms.CrossSigning.security_phrase_label")}
|
||||||
type="password"
|
type="password"
|
||||||
required
|
required
|
||||||
disabled={genWithPhrase !== undefined}
|
disabled={genWithPhrase !== undefined}
|
||||||
|
@ -166,13 +166,13 @@ function CrossSigningSetup() {
|
||||||
name="confirmPhrase"
|
name="confirmPhrase"
|
||||||
value={values.confirmPhrase}
|
value={values.confirmPhrase}
|
||||||
onChange={handleChange}
|
onChange={handleChange}
|
||||||
label={t("CrossSigning.security_phrase_confirm_label")}
|
label={t("Organisms.CrossSigning.security_phrase_confirm_label")}
|
||||||
type="password"
|
type="password"
|
||||||
required
|
required
|
||||||
disabled={genWithPhrase !== undefined}
|
disabled={genWithPhrase !== undefined}
|
||||||
/>
|
/>
|
||||||
{errors.confirmPhrase && <Text variant="b3" className="cross-signing__error">{errors.confirmPhrase}</Text>}
|
{errors.confirmPhrase && <Text variant="b3" className="cross-signing__error">{errors.confirmPhrase}</Text>}
|
||||||
{genWithPhrase !== true && <Button variant="primary" type="submit" disabled={genWithPhrase !== undefined}>{t("CrossSigning.security_phrase_set_button")}</Button>}
|
{genWithPhrase !== true && <Button variant="primary" type="submit" disabled={genWithPhrase !== undefined}>{t("Organisms.CrossSigning.security_phrase_set_button")}</Button>}
|
||||||
{genWithPhrase === true && <Spinner size="small" />}
|
{genWithPhrase === true && <Spinner size="small" />}
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
|
@ -193,9 +193,9 @@ function CrossSigningReset() {
|
||||||
return (
|
return (
|
||||||
<div className="cross-signing__reset">
|
<div className="cross-signing__reset">
|
||||||
<Text variant="h1">{twemojify('✋🧑🚒🤚')}</Text>
|
<Text variant="h1">{twemojify('✋🧑🚒🤚')}</Text>
|
||||||
<Text weight="medium">{t("CrossSigning.reset_keys_subtitle")}</Text>
|
<Text weight="medium">{t("Organisms.CrossSigning.reset_keys_subtitle")}</Text>
|
||||||
<Text>
|
<Text>
|
||||||
{t("CrossSigning.reset_keys_message")}
|
{t("Organisms.CrossSigning.reset_keys_message")}
|
||||||
</Text>
|
</Text>
|
||||||
<Button variant="danger" onClick={setupDialog}>{t("common.reset")}</Button>
|
<Button variant="danger" onClick={setupDialog}>{t("common.reset")}</Button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -215,8 +215,8 @@ function CrossSignin() {
|
||||||
const isCSEnabled = useCrossSigningStatus();
|
const isCSEnabled = useCrossSigningStatus();
|
||||||
return (
|
return (
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("CrossSigning.title")}
|
title={t("Organisms.CrossSigning.title")}
|
||||||
content={<Text variant="b3">{t("CrossSigning.setup_message")}</Text>}
|
content={<Text variant="b3">{t("Organisms.CrossSigning.setup_message")}</Text>}
|
||||||
options={(
|
options={(
|
||||||
isCSEnabled
|
isCSEnabled
|
||||||
? <Button variant="danger" onClick={resetDialog}>{t("common.reset")}</Button>
|
? <Button variant="danger" onClick={resetDialog}>{t("common.reset")}</Button>
|
||||||
|
|
|
@ -45,7 +45,7 @@ const promptDeviceName = async (deviceName) => new Promise((resolve) => {
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<form className="device-manage__rename" onSubmit={handleSubmit}>
|
<form className="device-manage__rename" onSubmit={handleSubmit}>
|
||||||
<Input value={deviceName} label={t("DeviceManage.edit_session_name_subtitle")} name="session" />
|
<Input value={deviceName} label={t("Organisms.DeviceManage.edit_session_name_subtitle")} name="session" />
|
||||||
<div className="device-manage__rename-btn">
|
<div className="device-manage__rename-btn">
|
||||||
<Button variant="primary" type="submit">{t("common.save")}</Button>
|
<Button variant="primary" type="submit">{t("common.save")}</Button>
|
||||||
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
|
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
|
||||||
|
@ -55,7 +55,7 @@ const promptDeviceName = async (deviceName) => new Promise((resolve) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t("DeviceManage.edit_session_name_title")}</Text>,
|
<Text variant="s1" weight="medium">{t("Organisms.DeviceManage.edit_session_name_title")}</Text>,
|
||||||
(requestClose) => renderContent((name) => {
|
(requestClose) => renderContent((name) => {
|
||||||
isCompleted = true;
|
isCompleted = true;
|
||||||
resolve(name);
|
resolve(name);
|
||||||
|
@ -95,7 +95,7 @@ function DeviceManage() {
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<form className="device-manage__rename" onSubmit={handleSubmit}>
|
<form className="device-manage__rename" onSubmit={handleSubmit}>
|
||||||
<Input value={deviceName} label={t("DeviceManage.edit_session_name_subtitle")} name="session" />
|
<Input value={deviceName} label={t("Organisms.DeviceManage.edit_session_name_subtitle")} name="session" />
|
||||||
<div className="device-manage__rename-btn">
|
<div className="device-manage__rename-btn">
|
||||||
<Button variant="primary" type="submit">{t("common.save")}</Button>
|
<Button variant="primary" type="submit">{t("common.save")}</Button>
|
||||||
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
|
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
|
||||||
|
@ -105,7 +105,7 @@ function DeviceManage() {
|
||||||
};
|
};
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t("DeviceManage.edit_session_name_title")}</Text>,
|
<Text variant="s1" weight="medium">{t("Organisms.DeviceManage.edit_session_name_title")}</Text>,
|
||||||
(requestClose) => renderContent((name) => {
|
(requestClose) => renderContent((name) => {
|
||||||
isCompleted = true;
|
isCompleted = true;
|
||||||
resolve(name);
|
resolve(name);
|
||||||
|
@ -132,7 +132,7 @@ function DeviceManage() {
|
||||||
<div className="device-manage">
|
<div className="device-manage">
|
||||||
<div className="device-manage__loading">
|
<div className="device-manage__loading">
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{t("DeviceManage.loading_devices")}</Text>
|
<Text>{t("Organisms.DeviceManage.loading_devices")}</Text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -155,14 +155,14 @@ function DeviceManage() {
|
||||||
|
|
||||||
const handleRemove = async (device) => {
|
const handleRemove = async (device) => {
|
||||||
const isConfirmed = await confirmDialog(
|
const isConfirmed = await confirmDialog(
|
||||||
t("DeviceManage.logout_device_title", {device: device.display_name}),
|
t("Organisms.DeviceManage.logout_device_title", {device: device.display_name}),
|
||||||
t("DeviceManage.logout_device_message", {device: device.display_name}),
|
t("Organisms.DeviceManage.logout_device_message", {device: device.display_name}),
|
||||||
t("DeviceManage.logout_device_confirm"),
|
t("Organisms.DeviceManage.logout_device_confirm"),
|
||||||
'danger',
|
'danger',
|
||||||
);
|
);
|
||||||
if (!isConfirmed) return;
|
if (!isConfirmed) return;
|
||||||
addToProcessing(device);
|
addToProcessing(device);
|
||||||
await authRequest(t("DeviceManage.logout_device_title", {device: device.display_name}), async (auth) => {
|
await authRequest(t("Organisms.DeviceManage.logout_device_title", {device: device.display_name}), async (auth) => {
|
||||||
await mx.deleteDevice(device.device_id, auth);
|
await mx.deleteDevice(device.device_id, auth);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ function DeviceManage() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const verifyWithKey = async (device) => {
|
const verifyWithKey = async (device) => {
|
||||||
const keyData = await accessSecretStorage(t("DeviceManage.session_verification_title"));
|
const keyData = await accessSecretStorage(t("Organisms.DeviceManage.session_verification_title"));
|
||||||
if (!keyData) return;
|
if (!keyData) return;
|
||||||
addToProcessing(device);
|
addToProcessing(device);
|
||||||
await mx.checkOwnCrossSigningTrust();
|
await mx.checkOwnCrossSigningTrust();
|
||||||
|
@ -205,7 +205,7 @@ function DeviceManage() {
|
||||||
<Text style={{ color: isVerified !== false ? '' : 'var(--tc-danger-high)' }}>
|
<Text style={{ color: isVerified !== false ? '' : 'var(--tc-danger-high)' }}>
|
||||||
{displayName}
|
{displayName}
|
||||||
<Text variant="b3" span>{`${displayName ? ' — ' : ''}${deviceId}`}</Text>
|
<Text variant="b3" span>{`${displayName ? ' — ' : ''}${deviceId}`}</Text>
|
||||||
{isCurrentDevice && <Text span className="device-manage__current-label" variant="b3">{t("DeviceManage.current_device_label")}</Text>}
|
{isCurrentDevice && <Text span className="device-manage__current-label" variant="b3">{t("Organisms.DeviceManage.current_device_label")}</Text>}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
options={
|
options={
|
||||||
|
@ -213,9 +213,9 @@ function DeviceManage() {
|
||||||
? <Spinner size="small" />
|
? <Spinner size="small" />
|
||||||
: (
|
: (
|
||||||
<>
|
<>
|
||||||
{(isCSEnabled && canVerify) && <Button onClick={() => verify(deviceId, isCurrentDevice)} variant="positive">{t("DeviceManage.verify_session_button")}</Button>}
|
{(isCSEnabled && canVerify) && <Button onClick={() => verify(deviceId, isCurrentDevice)} variant="positive">{t("Organisms.DeviceManage.verify_session_button")}</Button>}
|
||||||
<IconButton size="small" onClick={() => handleRename(device)} src={PencilIC} tooltip={t("DeviceManage.edit_session_name_tooltip")} />
|
<IconButton size="small" onClick={() => handleRename(device)} src={PencilIC} tooltip={t("Organisms.DeviceManage.edit_session_name_tooltip")} />
|
||||||
<IconButton size="small" onClick={() => handleRemove(device)} src={BinIC} tooltip={t("DeviceManage.logout_device_tooltip")}/>
|
<IconButton size="small" onClick={() => handleRemove(device)} src={BinIC} tooltip={t("Organisms.DeviceManage.logout_device_tooltip")}/>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -256,38 +256,38 @@ function DeviceManage() {
|
||||||
return (
|
return (
|
||||||
<div className="device-manage">
|
<div className="device-manage">
|
||||||
<div>
|
<div>
|
||||||
<MenuHeader>{t("DeviceManage.unverified_sessions_title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.DeviceManage.unverified_sessions_title")}</MenuHeader>
|
||||||
{!isCSEnabled && (
|
{!isCSEnabled && (
|
||||||
<div style={{ padding: 'var(--sp-extra-tight) var(--sp-normal)' }}>
|
<div style={{ padding: 'var(--sp-extra-tight) var(--sp-normal)' }}>
|
||||||
<InfoCard
|
<InfoCard
|
||||||
rounded
|
rounded
|
||||||
variant="caution"
|
variant="caution"
|
||||||
iconSrc={InfoIC}
|
iconSrc={InfoIC}
|
||||||
title={t("DeviceManage.setup_cross_signing_message")}
|
title={t("Organisms.DeviceManage.setup_cross_signing_message")}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{
|
{
|
||||||
unverified.length > 0
|
unverified.length > 0
|
||||||
? unverified.map((device) => renderDevice(device, false))
|
? unverified.map((device) => renderDevice(device, false))
|
||||||
: <Text className="device-manage__info">{t("DeviceManage.unverified_sessions_none")}</Text>
|
: <Text className="device-manage__info">{t("Organisms.DeviceManage.unverified_sessions_none")}</Text>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
{noEncryption.length > 0 && (
|
{noEncryption.length > 0 && (
|
||||||
<div>
|
<div>
|
||||||
<MenuHeader>{t("DeviceManage.unencrypted_sessions_title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.DeviceManage.unencrypted_sessions_title")}</MenuHeader>
|
||||||
{noEncryption.map((device) => renderDevice(device, null))}
|
{noEncryption.map((device) => renderDevice(device, null))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div>
|
<div>
|
||||||
<MenuHeader>{t("DeviceManage.verified_sessions_title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.DeviceManage.verified_sessions_title")}</MenuHeader>
|
||||||
{
|
{
|
||||||
verified.length > 0
|
verified.length > 0
|
||||||
? verified.map((device, index) => {
|
? verified.map((device, index) => {
|
||||||
if (truncated && index >= TRUNCATED_COUNT) return null;
|
if (truncated && index >= TRUNCATED_COUNT) return null;
|
||||||
return renderDevice(device, true);
|
return renderDevice(device, true);
|
||||||
})
|
})
|
||||||
: <Text className="device-manage__info">{t("DeviceManage.verified_sessions_none")}</Text>
|
: <Text className="device-manage__info">{t("Organisms.DeviceManage.verified_sessions_none")}</Text>
|
||||||
}
|
}
|
||||||
{ verified.length > TRUNCATED_COUNT && (
|
{ verified.length > TRUNCATED_COUNT && (
|
||||||
<Button className="device-manage__info" onClick={() => setTruncated(!truncated)}>
|
<Button className="device-manage__info" onClick={() => setTruncated(!truncated)}>
|
||||||
|
@ -295,7 +295,7 @@ function DeviceManage() {
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
{ deviceList.length > 0 && (
|
{ deviceList.length > 0 && (
|
||||||
<Text className="device-manage__info" variant="b3">{t("DeviceManage.session_name_privacy_message")}</Text>
|
<Text className="device-manage__info" variant="b3">{t("Organisms.DeviceManage.session_name_privacy_message")}</Text>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -66,18 +66,18 @@ function CreateKeyBackupDialog({ keyData }) {
|
||||||
{done === false && (
|
{done === false && (
|
||||||
<div>
|
<div>
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{t("KeyBackup.creating_backup")}</Text>
|
<Text>{t("Organisms.KeyBackup.creating_backup")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{done === true && (
|
{done === true && (
|
||||||
<>
|
<>
|
||||||
<Text variant="h1">{twemojify('✅')}</Text>
|
<Text variant="h1">{twemojify('✅')}</Text>
|
||||||
<Text>{t("KeyBackup.backup_created")}</Text>
|
<Text>{t("Organisms.KeyBackup.backup_created")}</Text>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{done === null && (
|
{done === null && (
|
||||||
<>
|
<>
|
||||||
<Text>{t("KeyBackup.backup_failed")}</Text>
|
<Text>{t("Organisms.KeyBackup.backup_failed")}</Text>
|
||||||
<Button onClick={doBackup}>{t("common.retry")}</Button>
|
<Button onClick={doBackup}>{t("common.retry")}</Button>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -108,7 +108,7 @@ function RestoreKeyBackupDialog({ keyData }) {
|
||||||
meBreath = true;
|
meBreath = true;
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|
||||||
setStatus({ message: t("KeyBackup.restoring_progress", {progress: progress.successes, total: progress.total}) });
|
setStatus({ message: t("Organisms.KeyBackup.restoring_progress", {progress: progress.successes, total: progress.total}) });
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -120,14 +120,14 @@ function RestoreKeyBackupDialog({ keyData }) {
|
||||||
{ progressCallback },
|
{ progressCallback },
|
||||||
);
|
);
|
||||||
if (!mountStore.getItem()) return;
|
if (!mountStore.getItem()) return;
|
||||||
setStatus({ done: t("KeyBackup.restore_complete", {progress: info.imported, total: info.total})});
|
setStatus({ done: t("Organisms.KeyBackup.restore_complete", {progress: info.imported, total: info.total})});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!mountStore.getItem()) return;
|
if (!mountStore.getItem()) return;
|
||||||
if (e.errcode === 'RESTORE_BACKUP_ERROR_BAD_KEY') {
|
if (e.errcode === 'RESTORE_BACKUP_ERROR_BAD_KEY') {
|
||||||
deletePrivateKey(keyData.keyId);
|
deletePrivateKey(keyData.keyId);
|
||||||
setStatus({ error: t("KeyBackup.restore_failed_bad_key"), errorCode: 'BAD_KEY' });
|
setStatus({ error: t("Organisms.KeyBackup.restore_failed_bad_key"), errorCode: 'BAD_KEY' });
|
||||||
} else {
|
} else {
|
||||||
setStatus({ error: t("KeyBackup.restore_failed_unknown"), errCode: 'UNKNOWN' });
|
setStatus({ error: t("Organisms.KeyBackup.restore_failed_unknown"), errCode: 'UNKNOWN' });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -142,7 +142,7 @@ function RestoreKeyBackupDialog({ keyData }) {
|
||||||
{(status === false || status.message) && (
|
{(status === false || status.message) && (
|
||||||
<div>
|
<div>
|
||||||
<Spinner size="small" />
|
<Spinner size="small" />
|
||||||
<Text>{status.message ?? t("KeyBackup.restoring")}</Text>
|
<Text>{status.message ?? t("Organisms.KeyBackup.restoring")}</Text>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{status.done && (
|
{status.done && (
|
||||||
|
@ -187,8 +187,8 @@ function DeleteKeyBackupDialog({ requestClose }) {
|
||||||
return (
|
return (
|
||||||
<div className="key-backup__delete">
|
<div className="key-backup__delete">
|
||||||
<Text variant="h1">{twemojify('🗑')}</Text>
|
<Text variant="h1">{twemojify('🗑')}</Text>
|
||||||
<Text weight="medium">{t("KeyBackup.delete_key_backup_subtitle")}</Text>
|
<Text weight="medium">{t("Organisms.KeyBackup.delete_key_backup_subtitle")}</Text>
|
||||||
<Text>{t("KeyBackup.delete_key_backup_message")}</Text>
|
<Text>{t("Organisms.KeyBackup.delete_key_backup_message")}</Text>
|
||||||
{
|
{
|
||||||
isDeleting
|
isDeleting
|
||||||
? <Spinner size="small" />
|
? <Spinner size="small" />
|
||||||
|
@ -231,28 +231,28 @@ function KeyBackup() {
|
||||||
}, [isCSEnabled]);
|
}, [isCSEnabled]);
|
||||||
|
|
||||||
const openCreateKeyBackup = async () => {
|
const openCreateKeyBackup = async () => {
|
||||||
const keyData = await accessSecretStorage(t('KeyBackup.create_backup_title'));
|
const keyData = await accessSecretStorage(t('Organisms.KeyBackup.create_backup_title'));
|
||||||
if (keyData === null) return;
|
if (keyData === null) return;
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t('KeyBackup.create_backup_title')}</Text>,
|
<Text variant="s1" weight="medium">{t('Organisms.KeyBackup.create_backup_title')}</Text>,
|
||||||
() => <CreateKeyBackupDialog keyData={keyData} />,
|
() => <CreateKeyBackupDialog keyData={keyData} />,
|
||||||
() => fetchKeyBackupVersion(),
|
() => fetchKeyBackupVersion(),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const openRestoreKeyBackup = async () => {
|
const openRestoreKeyBackup = async () => {
|
||||||
const keyData = await accessSecretStorage(t('KeyBackup.restore_backup_title'));
|
const keyData = await accessSecretStorage(t('Organisms.KeyBackup.restore_backup_title'));
|
||||||
if (keyData === null) return;
|
if (keyData === null) return;
|
||||||
|
|
||||||
openReusableDialog(
|
openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t('KeyBackup.restore_backup_title')}</Text>,
|
<Text variant="s1" weight="medium">{t('Organisms.KeyBackup.restore_backup_title')}</Text>,
|
||||||
() => <RestoreKeyBackupDialog keyData={keyData} />,
|
() => <RestoreKeyBackupDialog keyData={keyData} />,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const openDeleteKeyBackup = () => openReusableDialog(
|
const openDeleteKeyBackup = () => openReusableDialog(
|
||||||
<Text variant="s1" weight="medium">{t('KeyBackup.delete_key_backup_title')}</Text>,
|
<Text variant="s1" weight="medium">{t('Organisms.KeyBackup.delete_key_backup_title')}</Text>,
|
||||||
(requestClose) => (
|
(requestClose) => (
|
||||||
<DeleteKeyBackupDialog
|
<DeleteKeyBackupDialog
|
||||||
requestClose={(isDone) => {
|
requestClose={(isDone) => {
|
||||||
|
@ -265,28 +265,28 @@ function KeyBackup() {
|
||||||
|
|
||||||
const renderOptions = () => {
|
const renderOptions = () => {
|
||||||
if (keyBackup === undefined) return <Spinner size="small" />;
|
if (keyBackup === undefined) return <Spinner size="small" />;
|
||||||
if (keyBackup === null) return <Button variant="primary" onClick={openCreateKeyBackup}>{t('KeyBackup.create_backup_tooltip')}</Button>;
|
if (keyBackup === null) return <Button variant="primary" onClick={openCreateKeyBackup}>{t('Organisms.KeyBackup.create_backup_tooltip')}</Button>;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<IconButton src={DownloadIC} variant="positive" onClick={openRestoreKeyBackup} tooltip={t('KeyBackup.restore_backup_tooltip')} />
|
<IconButton src={DownloadIC} variant="positive" onClick={openRestoreKeyBackup} tooltip={t('Organisms.KeyBackup.restore_backup_tooltip')} />
|
||||||
<IconButton src={BinIC} onClick={openDeleteKeyBackup} tooltip={t('KeyBackup.delete_key_backup_tooltip')} />
|
<IconButton src={BinIC} onClick={openDeleteKeyBackup} tooltip={t('Organisms.KeyBackup.delete_key_backup_tooltip')} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("KeyBackup.encrypted_messages_backup_title")}
|
title={t("Organisms.KeyBackup.encrypted_messages_backup_title")}
|
||||||
content={(
|
content={(
|
||||||
<>
|
<>
|
||||||
<Text variant="b3">{t("KeyBackup.encrypted_messages_backup_description")}</Text>
|
<Text variant="b3">{t("Organisms.KeyBackup.encrypted_messages_backup_description")}</Text>
|
||||||
{!isCSEnabled && (
|
{!isCSEnabled && (
|
||||||
<InfoCard
|
<InfoCard
|
||||||
style={{ marginTop: 'var(--sp-ultra-tight)' }}
|
style={{ marginTop: 'var(--sp-ultra-tight)' }}
|
||||||
rounded
|
rounded
|
||||||
variant="caution"
|
variant="caution"
|
||||||
iconSrc={InfoIC}
|
iconSrc={InfoIC}
|
||||||
title={t("KeyBackup.encrypted_messages_backup_cross_signing_disabled")}
|
title={t("Organisms.KeyBackup.encrypted_messages_backup_cross_signing_disabled")}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -53,26 +53,26 @@ function AppearanceSection() {
|
||||||
<div className="settings-appearance__card">
|
<div className="settings-appearance__card">
|
||||||
<MenuHeader>Theme</MenuHeader>
|
<MenuHeader>Theme</MenuHeader>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.theme.follow_system.title")}
|
title={t("Organisms.Settings.theme.follow_system.title")}
|
||||||
options={(
|
options={(
|
||||||
<Toggle
|
<Toggle
|
||||||
isActive={settings.useSystemTheme}
|
isActive={settings.useSystemTheme}
|
||||||
onToggle={() => { toggleSystemTheme(); updateState({}); }}
|
onToggle={() => { toggleSystemTheme(); updateState({}); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{t("Settings.theme.follow_system.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.theme.follow_system.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
{!settings.useSystemTheme && (
|
{!settings.useSystemTheme && (
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.theme.title")}
|
title={t("Organisms.Settings.theme.title")}
|
||||||
content={(
|
content={(
|
||||||
<SegmentedControls
|
<SegmentedControls
|
||||||
selected={settings.getThemeIndex()}
|
selected={settings.getThemeIndex()}
|
||||||
segments={[
|
segments={[
|
||||||
{ text: t("Settings.theme.theme_light") },
|
{ text: t("Organisms.Settings.theme.theme_light") },
|
||||||
{ text: t("Settings.theme.theme_silver") },
|
{ text: t("Organisms.Settings.theme.theme_silver") },
|
||||||
{ text: t("Settings.theme.theme_dark") },
|
{ text: t("Organisms.Settings.theme.theme_dark") },
|
||||||
{ text: t("Settings.theme.theme_butter") },
|
{ text: t("Organisms.Settings.theme.theme_butter") },
|
||||||
]}
|
]}
|
||||||
onSelect={(index) => settings.setTheme(index)}
|
onSelect={(index) => settings.setTheme(index)}
|
||||||
/>
|
/>
|
||||||
|
@ -83,34 +83,34 @@ function AppearanceSection() {
|
||||||
<div className="settings-appearance__card">
|
<div className="settings-appearance__card">
|
||||||
<MenuHeader>Room messages</MenuHeader>
|
<MenuHeader>Room messages</MenuHeader>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.markdown.title")}
|
title={t("Organisms.Settings.markdown.title")}
|
||||||
options={(
|
options={(
|
||||||
<Toggle
|
<Toggle
|
||||||
isActive={settings.isMarkdown}
|
isActive={settings.isMarkdown}
|
||||||
onToggle={() => { toggleMarkdown(); updateState({}); }}
|
onToggle={() => { toggleMarkdown(); updateState({}); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{t("Settings.markdown.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.markdown.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.hide_membership_events.title")}
|
title={t("Organisms.Settings.hide_membership_events.title")}
|
||||||
options={(
|
options={(
|
||||||
<Toggle
|
<Toggle
|
||||||
isActive={settings.hideMembershipEvents}
|
isActive={settings.hideMembershipEvents}
|
||||||
onToggle={() => { toggleMembershipEvents(); updateState({}); }}
|
onToggle={() => { toggleMembershipEvents(); updateState({}); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{t("Settings.hide_membership_events.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.hide_membership_events.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.hide_nickname_avatar_events.title")}
|
title={t("Organisms.Settings.hide_nickname_avatar_events.title")}
|
||||||
options={(
|
options={(
|
||||||
<Toggle
|
<Toggle
|
||||||
isActive={settings.hideNickAvatarEvents}
|
isActive={settings.hideNickAvatarEvents}
|
||||||
onToggle={() => { toggleNickAvatarEvents(); updateState({}); }}
|
onToggle={() => { toggleNickAvatarEvents(); updateState({}); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{t("Settings.hide_nickname_avatar_events.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.hide_nickname_avatar_events.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -154,21 +154,21 @@ function NotificationsSection() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="settings-notifications">
|
<div className="settings-notifications">
|
||||||
<MenuHeader>{t("Settings.notifications_and_sound.title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.Settings.notifications_and_sound.title")}</MenuHeader>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.notifications_and_sound.desktop.title")}
|
title={t("Organisms.Settings.notifications_and_sound.desktop.title")}
|
||||||
options={renderOptions()}
|
options={renderOptions()}
|
||||||
content={<Text variant="b3">{t("Settings.notifications_and_sound.desktop.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.notifications_and_sound.desktop.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.notifications_and_sound.sound.title")}
|
title={t("Organisms.Settings.notifications_and_sound.sound.title")}
|
||||||
options={(
|
options={(
|
||||||
<Toggle
|
<Toggle
|
||||||
isActive={settings.isNotificationSounds}
|
isActive={settings.isNotificationSounds}
|
||||||
onToggle={() => { toggleNotificationSounds(); updateState({}); }}
|
onToggle={() => { toggleNotificationSounds(); updateState({}); }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
content={<Text variant="b3">{t("Settings.notifications_and_sound.desktop.description")}</Text>}
|
content={<Text variant="b3">{t("Organisms.Settings.notifications_and_sound.desktop.description")}</Text>}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -181,27 +181,27 @@ function SecuritySection() {
|
||||||
return (
|
return (
|
||||||
<div className="settings-security">
|
<div className="settings-security">
|
||||||
<div className="settings-security__card">
|
<div className="settings-security__card">
|
||||||
<MenuHeader>{t("Settings.security.cross_signing.title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.Settings.security.cross_signing.title")}</MenuHeader>
|
||||||
<CrossSigning />
|
<CrossSigning />
|
||||||
<KeyBackup />
|
<KeyBackup />
|
||||||
</div>
|
</div>
|
||||||
<DeviceManage />
|
<DeviceManage />
|
||||||
<div className="settings-security__card">
|
<div className="settings-security__card">
|
||||||
<MenuHeader>{t("Settings.security.export_import_encryption_keys.title")}</MenuHeader>
|
<MenuHeader>{t("Organisms.Settings.security.export_import_encryption_keys.title")}</MenuHeader>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.security.export_encryption_keys.title")}
|
title={t("Organisms.Settings.security.export_encryption_keys.title")}
|
||||||
content={(
|
content={(
|
||||||
<>
|
<>
|
||||||
<Text variant="b3">{t("Settings.security.export_encryption_keys.description")}</Text>
|
<Text variant="b3">{t("Organisms.Settings.security.export_encryption_keys.description")}</Text>
|
||||||
<ExportE2ERoomKeys />
|
<ExportE2ERoomKeys />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<SettingTile
|
<SettingTile
|
||||||
title={t("Settings.security.import_encryption_keys.title")}
|
title={t("Organisms.Settings.security.import_encryption_keys.title")}
|
||||||
content={(
|
content={(
|
||||||
<>
|
<>
|
||||||
<Text variant="b3">{t("Settings.security.import_encryption_keys.description")}</Text>
|
<Text variant="b3">{t("Organisms.Settings.security.import_encryption_keys.description")}</Text>
|
||||||
<ImportE2ERoomKeys />
|
<ImportE2ERoomKeys />
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
@ -218,7 +218,7 @@ function AboutSection() {
|
||||||
return (
|
return (
|
||||||
<div className="settings-about">
|
<div className="settings-about">
|
||||||
<div className="settings-about__card">
|
<div className="settings-about__card">
|
||||||
<MenuHeader>{t("Settings.about.application")}</MenuHeader>
|
<MenuHeader>{t("Organisms.Settings.about.application")}</MenuHeader>
|
||||||
<div className="settings-about__branding">
|
<div className="settings-about__branding">
|
||||||
<img width="60" height="60" src={CinnySVG} alt="Cinny logo" />
|
<img width="60" height="60" src={CinnySVG} alt="Cinny logo" />
|
||||||
<div>
|
<div>
|
||||||
|
@ -236,7 +236,7 @@ function AboutSection() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="settings-about__card">
|
<div className="settings-about__card">
|
||||||
<MenuHeader>{t("Settings.about.credits")}</MenuHeader>
|
<MenuHeader>{t("Organisms.Settings.about.credits")}</MenuHeader>
|
||||||
<div className="settings-about__credits">
|
<div className="settings-about__credits">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
@ -314,7 +314,7 @@ function Settings() {
|
||||||
|
|
||||||
const handleTabChange = (tabItem) => setSelectedTab(tabItem);
|
const handleTabChange = (tabItem) => setSelectedTab(tabItem);
|
||||||
const handleLogout = async () => {
|
const handleLogout = async () => {
|
||||||
if (await confirmDialog(t("Settings.logout.dialog.title"), t("Settings.logout.dialog.description"), t("Settings.logout.dialog.confirm"), 'danger')) {
|
if (await confirmDialog(t("Organisms.Settings.logout.dialog.title"), t("Organisms.Settings.logout.dialog.description"), t("Organisms.Settings.logout.dialog.confirm"), 'danger')) {
|
||||||
logout();
|
logout();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -323,11 +323,11 @@ function Settings() {
|
||||||
<PopupWindow
|
<PopupWindow
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
className="settings-window"
|
className="settings-window"
|
||||||
title={<Text variant="s1" weight="medium" primary>{t("Settings.title")}</Text>}
|
title={<Text variant="s1" weight="medium" primary>{t("Organisms.Settings.title")}</Text>}
|
||||||
contentOptions={(
|
contentOptions={(
|
||||||
<>
|
<>
|
||||||
<Button variant="danger" iconSrc={PowerIC} onClick={handleLogout}>
|
<Button variant="danger" iconSrc={PowerIC} onClick={handleLogout}>
|
||||||
{t("Settings.logout.title")}
|
{t("Organisms.Settings.logout.title")}
|
||||||
</Button>
|
</Button>
|
||||||
<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />
|
<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -115,18 +115,18 @@ function ShortcutSpacesContent() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("ShortcutSpaces.pinned_spaces")}</Text>
|
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("Organisms.ShortcutSpaces.pinned_spaces")}</Text>
|
||||||
{spaceShortcut.length === 0 && <Text>{t("ShortcutSpaces.no_pinned_spaces")}</Text>}
|
{spaceShortcut.length === 0 && <Text>{t("Organisms.ShortcutSpaces.no_pinned_spaces")}</Text>}
|
||||||
{spaceShortcut.map((spaceId) => renderSpace(spaceId, true))}
|
{spaceShortcut.map((spaceId) => renderSpace(spaceId, true))}
|
||||||
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("ShortcutSpaces.unpinned_spaces")}</Text>
|
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("Organisms.ShortcutSpaces.unpinned_spaces")}</Text>
|
||||||
{spaceWithoutShortcut.length === 0 && <Text>{t("ShortcutSpaces.no_unpinned_spaces")}</Text>}
|
{spaceWithoutShortcut.length === 0 && <Text>{t("Organisms.ShortcutSpaces.no_unpinned_spaces")}</Text>}
|
||||||
{spaceWithoutShortcut.map((spaceId) => renderSpace(spaceId, false))}
|
{spaceWithoutShortcut.map((spaceId) => renderSpace(spaceId, false))}
|
||||||
{selected.length !== 0 && (
|
{selected.length !== 0 && (
|
||||||
<div className="shortcut-spaces__footer">
|
<div className="shortcut-spaces__footer">
|
||||||
{process && <Spinner size="small" />}
|
{process && <Spinner size="small" />}
|
||||||
<Text weight="medium">{process || t("ShortcutSpaces.spaces_selected", {count: selected.length})}</Text>
|
<Text weight="medium">{process || t("Organisms.ShortcutSpaces.spaces_selected", {count: selected.length})}</Text>
|
||||||
{ !process && (
|
{ !process && (
|
||||||
<Button onClick={handleAdd} variant="primary">{t("ShortcutSpaces.pin_button")}</Button>
|
<Button onClick={handleAdd} variant="primary">{t("Organisms.ShortcutSpaces.pin_button")}</Button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
@ -160,7 +160,7 @@ function ShortcutSpaces() {
|
||||||
className="shortcut-spaces"
|
className="shortcut-spaces"
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{t("ShortcutSpaces.header")}
|
{t("Organisms.ShortcutSpaces.header")}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip= {t("common.close")}/>}
|
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip= {t("common.close")}/>}
|
||||||
|
|
|
@ -120,7 +120,7 @@ function SpaceManageItem({
|
||||||
const roomNameJSX = (
|
const roomNameJSX = (
|
||||||
<Text>
|
<Text>
|
||||||
{twemojify(name)}
|
{twemojify(name)}
|
||||||
<Text variant="b3" span> • {t("SpaceManage.room_members", {count: roomInfo.num_joined_members})}</Text>
|
<Text variant="b3" span> • {t("Organisms.SpaceManage.room_members", {count: roomInfo.num_joined_members})}</Text>
|
||||||
</Text>
|
</Text>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ function SpaceManageItem({
|
||||||
>
|
>
|
||||||
{roomAvatarJSX}
|
{roomAvatarJSX}
|
||||||
{roomNameJSX}
|
{roomNameJSX}
|
||||||
{isSuggested && <Text variant="b2">{t("SpaceManage.suggested")}</Text>}
|
{isSuggested && <Text variant="b2">{t("Organisms.SpaceManage.suggested")}</Text>}
|
||||||
</button>
|
</button>
|
||||||
{roomInfo.topic && expandBtnJsx}
|
{roomInfo.topic && expandBtnJsx}
|
||||||
{
|
{
|
||||||
|
@ -187,15 +187,15 @@ function SpaceManageFooter({ parentId, selected }) {
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleRemove = () => {
|
const handleRemove = () => {
|
||||||
setProcess(t("SpaceManage.remove", {count: selected.length}));
|
setProcess(t("Organisms.SpaceManage.remove", {count: selected.length}));
|
||||||
selected.forEach((roomId) => {
|
selected.forEach((roomId) => {
|
||||||
mx.sendStateEvent(parentId, 'm.space.child', {}, roomId);
|
mx.sendStateEvent(parentId, 'm.space.child', {}, roomId);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleToggleSuggested = (isMark) => {
|
const handleToggleSuggested = (isMark) => {
|
||||||
if (isMark) setProcess(t("SpaceManage.mark_suggested", {count: selected.length}));
|
if (isMark) setProcess(t("Organisms.SpaceManage.mark_suggested", {count: selected.length}));
|
||||||
else setProcess(t("SpaceManage.mark_not_suggested", {count: selected.length}));
|
else setProcess(t("Organisms.SpaceManage.mark_not_suggested", {count: selected.length}));
|
||||||
selected.forEach((roomId) => {
|
selected.forEach((roomId) => {
|
||||||
const sEvent = room.currentState.getStateEvents('m.space.child', roomId);
|
const sEvent = room.currentState.getStateEvents('m.space.child', roomId);
|
||||||
if (!sEvent) return;
|
if (!sEvent) return;
|
||||||
|
@ -210,7 +210,7 @@ function SpaceManageFooter({ parentId, selected }) {
|
||||||
return (
|
return (
|
||||||
<div className="space-manage__footer">
|
<div className="space-manage__footer">
|
||||||
{process && <Spinner size="small" />}
|
{process && <Spinner size="small" />}
|
||||||
<Text weight="medium">{process || t("SpaceManage.items_selected", {count: selected.length})}</Text>
|
<Text weight="medium">{process || t("Organisms.SpaceManage.items_selected", {count: selected.length})}</Text>
|
||||||
{ !process && (
|
{ !process && (
|
||||||
<>
|
<>
|
||||||
<Button onClick={handleRemove} variant="danger">{t("common.remove")}</Button>
|
<Button onClick={handleRemove} variant="danger">{t("common.remove")}</Button>
|
||||||
|
@ -352,11 +352,11 @@ function SpaceManageContent({ roomId, requestClose }) {
|
||||||
{spacePath.length > 1 && (
|
{spacePath.length > 1 && (
|
||||||
<SpaceManageBreadcrumb path={spacePath} onSelect={addPathItem} />
|
<SpaceManageBreadcrumb path={spacePath} onSelect={addPathItem} />
|
||||||
)}
|
)}
|
||||||
<Text variant="b3" weight="bold">{t("SpaceManage.rooms_and_spaces")}</Text>
|
<Text variant="b3" weight="bold">{t("Organisms.SpaceManage.rooms_and_spaces")}</Text>
|
||||||
<div className="space-manage__content-items">
|
<div className="space-manage__content-items">
|
||||||
{!isLoading && currentHierarchy?.rooms?.length === 1 && (
|
{!isLoading && currentHierarchy?.rooms?.length === 1 && (
|
||||||
<Text>
|
<Text>
|
||||||
{t("SpaceManage.private_rooms_message")}
|
{t("Organisms.SpaceManage.private_rooms_message")}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
{currentHierarchy && (currentHierarchy.rooms?.map((roomInfo) => (
|
{currentHierarchy && (currentHierarchy.rooms?.map((roomInfo) => (
|
||||||
|
@ -378,7 +378,7 @@ function SpaceManageContent({ roomId, requestClose }) {
|
||||||
{!currentHierarchy && <Text>{t("common.loading")}</Text>}
|
{!currentHierarchy && <Text>{t("common.loading")}</Text>}
|
||||||
</div>
|
</div>
|
||||||
{currentHierarchy?.canLoadMore && !isLoading && (
|
{currentHierarchy?.canLoadMore && !isLoading && (
|
||||||
<Button onClick={loadRoomHierarchy}>{t("SpaceManage.load_more")}</Button>
|
<Button onClick={loadRoomHierarchy}>{t("Organisms.SpaceManage.load_more")}</Button>
|
||||||
)}
|
)}
|
||||||
{isLoading && (
|
{isLoading && (
|
||||||
<div className="space-manage__content-loading">
|
<div className="space-manage__content-loading">
|
||||||
|
@ -428,7 +428,7 @@ function SpaceManage() {
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{roomId && twemojify(room.name)}
|
{roomId && twemojify(room.name)}
|
||||||
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("SpaceManage.subtitle")}</span>
|
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("Organisms.SpaceManage.subtitle")}</span>
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip="Close" />}
|
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip="Close" />}
|
||||||
|
|
|
@ -83,7 +83,7 @@ function GeneralSettings({ roomId }) {
|
||||||
}}
|
}}
|
||||||
iconSrc={isCategorized ? CategoryFilledIC : CategoryIC}
|
iconSrc={isCategorized ? CategoryFilledIC : CategoryIC}
|
||||||
>
|
>
|
||||||
{isCategorized ? t("SpaceSettings.uncategorize_subspaces") : t("SpaceSettings.categorize_subspaces")}
|
{isCategorized ? t("Organisms.SpaceSettings.uncategorize_subspaces") : t("Organisms.SpaceSettings.categorize_subspaces")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
@ -93,30 +93,30 @@ function GeneralSettings({ roomId }) {
|
||||||
}}
|
}}
|
||||||
iconSrc={isPinned ? PinFilledIC : PinIC}
|
iconSrc={isPinned ? PinFilledIC : PinIC}
|
||||||
>
|
>
|
||||||
{isPinned ? t("SpaceSettings.unpin_sidebar") : t("SpaceSettings.pin_sidebar")}
|
{isPinned ? t("Organisms.SpaceSettings.unpin_sidebar") : t("Organisms.SpaceSettings.pin_sidebar")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
variant="danger"
|
variant="danger"
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
const isConfirmed = await confirmDialog(
|
const isConfirmed = await confirmDialog(
|
||||||
t("SpaceSettings.leave.leave_dialog_title"),
|
t("Organisms.SpaceSettings.leave.leave_dialog_title"),
|
||||||
t("SpaceSettings.leave.leave_dialog_message", {space: roomName}),
|
t("Organisms.SpaceSettings.leave.leave_dialog_message", {space: roomName}),
|
||||||
t("SpaceSettings.leave.leave_space"),
|
t("Organisms.SpaceSettings.leave.leave_space"),
|
||||||
'danger',
|
'danger',
|
||||||
);
|
);
|
||||||
if (isConfirmed) leave(roomId);
|
if (isConfirmed) leave(roomId);
|
||||||
}}
|
}}
|
||||||
iconSrc={LeaveArrowIC}
|
iconSrc={LeaveArrowIC}
|
||||||
>
|
>
|
||||||
{t("SpaceSettings.leave.leave_space")}
|
{t("Organisms.SpaceSettings.leave.leave_space")}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</div>
|
</div>
|
||||||
<div className="space-settings__card">
|
<div className="space-settings__card">
|
||||||
<MenuHeader>{t("SpaceSettings.visibility.header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.SpaceSettings.visibility.header")}</MenuHeader>
|
||||||
<RoomVisibility roomId={roomId} />
|
<RoomVisibility roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
<div className="space-settings__card">
|
<div className="space-settings__card">
|
||||||
<MenuHeader>{t("SpaceSettings.addresses.header")}</MenuHeader>
|
<MenuHeader>{t("Organisms.SpaceSettings.addresses.header")}</MenuHeader>
|
||||||
<RoomAliases roomId={roomId} />
|
<RoomAliases roomId={roomId} />
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
@ -169,7 +169,7 @@ function SpaceSettings() {
|
||||||
title={(
|
title={(
|
||||||
<Text variant="s1" weight="medium" primary>
|
<Text variant="s1" weight="medium" primary>
|
||||||
{isOpen && twemojify(room.name)}
|
{isOpen && twemojify(room.name)}
|
||||||
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("SpaceSettings.subtitle")}</span>
|
<span style={{ color: 'var(--tc-surface-low)' }}> — {t("Organisms.SpaceSettings.subtitle")}</span>
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}
|
||||||
|
|
|
@ -56,15 +56,15 @@ function ViewSource() {
|
||||||
|
|
||||||
const renderViewSource = () => (
|
const renderViewSource = () => (
|
||||||
<div className="view-source">
|
<div className="view-source">
|
||||||
{event.isEncrypted() && <ViewSourceBlock title={t("ViewSource.decrypted_source")} json={event.getEffectiveEvent()} />}
|
{event.isEncrypted() && <ViewSourceBlock title={t("Organisms.ViewSource.decrypted_source")} json={event.getEffectiveEvent()} />}
|
||||||
<ViewSourceBlock title={t("ViewSource.original_source")} json={event.event} />
|
<ViewSourceBlock title={t("Organisms.ViewSource.original_source")} json={event.event} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PopupWindow
|
<PopupWindow
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
title={t("ViewSource.title")}
|
title={t("Organisms.ViewSource.title")}
|
||||||
onAfterClose={handleAfterClose}
|
onAfterClose={handleAfterClose}
|
||||||
onRequestClose={() => setIsOpen(false)}
|
onRequestClose={() => setIsOpen(false)}
|
||||||
contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip={t("common.close")} />}
|
contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip={t("common.close")} />}
|
||||||
|
|
|
@ -16,8 +16,8 @@ function Welcome() {
|
||||||
<div className="app-welcome flex--center">
|
<div className="app-welcome flex--center">
|
||||||
<div>
|
<div>
|
||||||
<img className="app-welcome__logo noselect" src={CinnySvg} alt="Cinny logo" />
|
<img className="app-welcome__logo noselect" src={CinnySvg} alt="Cinny logo" />
|
||||||
<Text className="app-welcome__heading" variant="h1" weight="medium" primary>{t('Welcome.heading')}</Text>
|
<Text className="app-welcome__heading" variant="h1" weight="medium" primary>{t('Organisms.Welcome.heading')}</Text>
|
||||||
<Text className="app-welcome__subheading" variant="s1">{t('Welcome.subheading')}</Text>
|
<Text className="app-welcome__subheading" variant="s1">{t('Organisms.Welcome.subheading')}</Text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue