Use the JoinRuleSettings component for the guest link access prompt. (#28614)
* Use the JoinRuleSettings component for the guest link access prompt. Co-authored-by: fkwp <fkwp@users.noreply.github.com> * increase timeout * fix tests --------- Co-authored-by: fkwp <fkwp@users.noreply.github.com>
This commit is contained in:
@@ -14,10 +14,11 @@ import { EventType, JoinRule, type Room } from "matrix-js-sdk/src/matrix";
|
||||
import Modal from "../../../../Modal";
|
||||
import { ShareDialog } from "../../dialogs/ShareDialog";
|
||||
import { _t } from "../../../../languageHandler";
|
||||
import SettingsStore from "../../../../settings/SettingsStore";
|
||||
import { calculateRoomVia } from "../../../../utils/permalinks/Permalinks";
|
||||
import BaseDialog from "../../dialogs/BaseDialog";
|
||||
import { useGuestAccessInformation } from "../../../../hooks/room/useGuestAccessInformation";
|
||||
import JoinRuleSettings from "../../settings/JoinRuleSettings";
|
||||
import SettingsStore from "../../../../settings/SettingsStore";
|
||||
|
||||
/**
|
||||
* Display a button to open a dialog to share a link to the call using a element call guest spa url (`element_call:guest_spa_url` in the EW config).
|
||||
@@ -114,33 +115,32 @@ export const JoinRuleDialog: React.FC<{
|
||||
"",
|
||||
);
|
||||
// Show the dialog for a bit to give the user feedback
|
||||
setTimeout(() => onFinished(), 500);
|
||||
setTimeout(() => onFinished(), 1000);
|
||||
},
|
||||
[isUpdating, onFinished, room.client, room.roomId],
|
||||
);
|
||||
return (
|
||||
<BaseDialog title={_t("update_room_access_modal|title")} onFinished={onFinished} className="mx_JoinRuleDialog">
|
||||
<p>{_t("update_room_access_modal|description")}</p>
|
||||
<div className="mx_JoinRuleDialogButtons">
|
||||
{askToJoinEnabled && canInvite && (
|
||||
<Button
|
||||
kind="secondary"
|
||||
className="mx_Dialog_nonDialogButton"
|
||||
disabled={isUpdating === JoinRule.Knock}
|
||||
onClick={() => changeJoinRule(JoinRule.Knock)}
|
||||
>
|
||||
{_t("action|ask_to_join")}
|
||||
</Button>
|
||||
)}
|
||||
<Button
|
||||
className="mx_Dialog_nonDialogButton"
|
||||
kind="destructive"
|
||||
disabled={isUpdating === JoinRule.Public}
|
||||
onClick={() => changeJoinRule(JoinRule.Public)}
|
||||
>
|
||||
{_t("common|public")}
|
||||
</Button>
|
||||
</div>
|
||||
<p>{_t("update_room_access_modal|description", {}, { b: (sub) => <strong>{sub}</strong> })}</p>
|
||||
<p>
|
||||
{_t("update_room_access_modal|revert_access_description", {}, { b: (sub) => <strong>{sub}</strong> })}
|
||||
</p>
|
||||
<JoinRuleSettings
|
||||
recommendedOption={JoinRule.Knock}
|
||||
room={room}
|
||||
disabledOptions={new Set([JoinRule.Invite, JoinRule.Private, JoinRule.Restricted])}
|
||||
hiddenOptions={
|
||||
new Set([JoinRule.Restricted].concat(askToJoinEnabled && canInvite ? [] : [JoinRule.Knock]))
|
||||
}
|
||||
beforeChange={async (newRule) => {
|
||||
await changeJoinRule(newRule).catch(() => {
|
||||
return false;
|
||||
});
|
||||
return true;
|
||||
}}
|
||||
closeSettingsFn={() => {}}
|
||||
onError={(error: unknown) => logger.error("Could not generate change access level:", error)}
|
||||
/>
|
||||
<p>{_t("update_room_access_modal|dont_change_description")}</p>
|
||||
<div className="mx_JoinRuleDialogButtons">
|
||||
<Button
|
||||
|
||||
@@ -36,6 +36,9 @@ export interface JoinRuleSettingsProps {
|
||||
onError(error: unknown): void;
|
||||
beforeChange?(joinRule: JoinRule): Promise<boolean>; // if returns false then aborts the change
|
||||
aliasWarning?: ReactNode;
|
||||
disabledOptions?: Set<JoinRule>;
|
||||
hiddenOptions?: Set<JoinRule>;
|
||||
recommendedOption?: JoinRule;
|
||||
}
|
||||
|
||||
const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
@@ -45,6 +48,9 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
onError,
|
||||
beforeChange,
|
||||
closeSettingsFn,
|
||||
disabledOptions,
|
||||
hiddenOptions,
|
||||
recommendedOption,
|
||||
}) => {
|
||||
const cli = room.client;
|
||||
|
||||
@@ -147,7 +153,7 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
}
|
||||
});
|
||||
|
||||
closeSettingsFn();
|
||||
closeSettingsFn?.();
|
||||
|
||||
// switch to the new room in the background
|
||||
dis.dispatch<ViewRoomPayload>({
|
||||
@@ -170,18 +176,26 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
{_t("room_settings|security|join_rule_upgrade_required")}
|
||||
</span>
|
||||
);
|
||||
const withRecommendLabel = (label: string, rule: JoinRule): React.ReactNode =>
|
||||
rule === recommendedOption ? (
|
||||
<>
|
||||
{label} (<span className="mx_JoinRuleSettings_recommended">{_t("common|recommended")}</span>)
|
||||
</>
|
||||
) : (
|
||||
label
|
||||
);
|
||||
|
||||
const definitions: IDefinition<JoinRule>[] = [
|
||||
{
|
||||
value: JoinRule.Invite,
|
||||
label: _t("room_settings|security|join_rule_invite"),
|
||||
label: withRecommendLabel(_t("room_settings|security|join_rule_invite"), JoinRule.Invite),
|
||||
description: _t("room_settings|security|join_rule_invite_description"),
|
||||
checked:
|
||||
joinRule === JoinRule.Invite || (joinRule === JoinRule.Restricted && !restrictedAllowRoomIds?.length),
|
||||
},
|
||||
{
|
||||
value: JoinRule.Public,
|
||||
label: _t("common|public"),
|
||||
label: withRecommendLabel(_t("common|public"), JoinRule.Public),
|
||||
description: (
|
||||
<>
|
||||
{_t("room_settings|security|join_rule_public_description")}
|
||||
@@ -292,7 +306,7 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
value: JoinRule.Restricted,
|
||||
label: (
|
||||
<>
|
||||
{_t("room_settings|security|join_rule_restricted")}
|
||||
{withRecommendLabel(_t("room_settings|security|join_rule_restricted"), JoinRule.Restricted)}
|
||||
{preferredRestrictionVersion && upgradeRequiredPill}
|
||||
</>
|
||||
),
|
||||
@@ -303,11 +317,11 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
}
|
||||
|
||||
if (askToJoinEnabled && (roomSupportsKnock || preferredKnockVersion)) {
|
||||
definitions.push({
|
||||
definitions.splice(Math.max(0, definitions.length - 1), 0, {
|
||||
value: JoinRule.Knock,
|
||||
label: (
|
||||
<>
|
||||
{_t("room_settings|security|join_rule_knock")}
|
||||
{withRecommendLabel(_t("room_settings|security|join_rule_knock"), JoinRule.Knock)}
|
||||
{preferredKnockVersion && upgradeRequiredPill}
|
||||
</>
|
||||
),
|
||||
@@ -397,7 +411,9 @@ const JoinRuleSettings: React.FC<JoinRuleSettingsProps> = ({
|
||||
name="joinRule"
|
||||
value={joinRule}
|
||||
onChange={onChange}
|
||||
definitions={definitions}
|
||||
definitions={definitions
|
||||
.map((d) => (disabledOptions?.has(d.value) ? { ...d, disabled: true } : d))
|
||||
.filter((d) => !hiddenOptions?.has(d.value))}
|
||||
disabled={disabled}
|
||||
className="mx_JoinRuleSettings_radioButton"
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user