Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Add support for disabling spell checking #8604

Merged
merged 15 commits into from
Jul 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions res/css/views/settings/tabs/_SettingsTab.pcss
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ limitations under the License.
color: $primary-content;
margin-top: 10px; /* TODO: Use a spacing variable */
margin-bottom: 10px; /* TODO: Use a spacing variable */
margin-right: 100px; /* TODO: Use a spacing variable */

&:nth-child(n + 2) {
margin-top: var(--SettingsTab_heading_nth_child-margin-top);
Expand All @@ -50,6 +51,7 @@ limitations under the License.
color: $primary-content;
margin-top: $spacing-12;
margin-bottom: 10px; /* TODO: Use a spacing variable */
margin-right: 100px; /* TODO: Use a spacing variable */
}

.mx_SettingsTab_subsectionText {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,7 @@ limitations under the License.
.mx_GeneralUserSettingsTab_warningIcon {
vertical-align: middle;
}

.mx_SettingsTab_section_spellcheck .mx_ToggleSwitch {
float: right;
}
8 changes: 7 additions & 1 deletion src/BasePlatform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export default abstract class BasePlatform {
* Return true if platform supports multi-language
* spell-checking, otherwise false.
*/
public supportsMultiLanguageSpellCheck(): boolean {
public supportsSpellCheckSettings(): boolean {
return false;
}

Expand Down Expand Up @@ -274,6 +274,12 @@ export default abstract class BasePlatform {

public setLanguage(preferredLangs: string[]) {}

public setSpellCheckEnabled(enabled: boolean): void {}

public async getSpellCheckEnabled(): Promise<boolean> {
return null;
}

public setSpellCheckLanguages(preferredLangs: string[]) {}

public getSpellCheckLanguages(): Promise<string[]> | null {
Expand Down
4 changes: 3 additions & 1 deletion src/components/views/elements/Dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ interface IProps {
// width.
menuWidth?: number;
searchEnabled?: boolean;
// Placeholder to show when no value is selected
placeholder?: string;
// Called when the selected option changes
onOptionChange(dropdownKey: string): void;
// Called when the value of the search field changes
Expand Down Expand Up @@ -362,7 +364,7 @@ export default class Dropdown extends React.Component<IProps, IState> {
this.props.getShortOption(this.props.value) :
this.childrenByKey[this.props.value];
currentValue = <div className="mx_Dropdown_option" id={`${this.props.id}_value`}>
{ selectedChild }
{ selectedChild || this.props.placeholder }
</div>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,9 @@ export default class SpellCheckLanguagesDropdown extends React.Component<SpellCh
onSearchChange={this.onSearchChange}
searchEnabled={true}
value={value}
label={_t("Language Dropdown")}>
label={_t("Language Dropdown")}
placeholder={_t("Choose a locale")}
>
{ options }
</Dropdown>;
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/views/elements/ToggleSwitch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ interface IProps {
checked: boolean;

// Whether or not the user can interact with the switch
disabled: boolean;
disabled?: boolean;

// Called when the checked state changes. First argument will be the new state.
onChange(checked: boolean): void;
Expand Down
1 change: 1 addition & 0 deletions src/components/views/settings/SpellCheckSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ export default class SpellCheckLanguages extends React.Component<SpellCheckLangu
e.preventDefault();

const language = this.state.newLanguage;
this.setState({ newLanguage: "" });

if (!language) return;
if (this.props.languages.includes(language)) return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,16 @@ import ChangePassword from "../../ChangePassword";
import InlineTermsAgreement from "../../../terms/InlineTermsAgreement";
import SetIdServer from "../../SetIdServer";
import SetIntegrationManager from "../../SetIntegrationManager";
import ToggleSwitch from "../../../elements/ToggleSwitch";
import { IS_MAC } from "../../../../../Keyboard";

interface IProps {
closeSettingsFn: () => void;
}

interface IState {
language: string;
spellCheckEnabled: boolean;
spellCheckLanguages: string[];
haveIdServer: boolean;
serverSupportsSeparateAddAndBind: boolean;
Expand Down Expand Up @@ -85,6 +88,7 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta

this.state = {
language: languageHandler.getCurrentLanguage(),
spellCheckEnabled: false,
spellCheckLanguages: [],
haveIdServer: Boolean(MatrixClientPeg.get().getIdentityServerUrl()),
serverSupportsSeparateAddAndBind: null,
Expand Down Expand Up @@ -126,10 +130,16 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta
}

public async componentDidMount(): Promise<void> {
const plaf = PlatformPeg.get();
if (plaf) {
const plat = PlatformPeg.get();
const [spellCheckEnabled, spellCheckLanguages] = await Promise.all([
plat.getSpellCheckEnabled(),
plat.getSpellCheckLanguages(),
]);

if (spellCheckLanguages) {
this.setState({
spellCheckLanguages: await plaf.getSpellCheckLanguages(),
spellCheckEnabled,
spellCheckLanguages,
});
}
}
Expand Down Expand Up @@ -238,11 +248,12 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta

private onSpellCheckLanguagesChange = (languages: string[]): void => {
this.setState({ spellCheckLanguages: languages });
PlatformPeg.get()?.setSpellCheckLanguages(languages);
};

const plaf = PlatformPeg.get();
if (plaf) {
plaf.setSpellCheckLanguages(languages);
}
private onSpellCheckEnabledChange = (spellCheckEnabled: boolean): void => {
this.setState({ spellCheckEnabled });
PlatformPeg.get()?.setSpellCheckEnabled(spellCheckEnabled);
};

private onPasswordChangeError = (err): void => {
Expand Down Expand Up @@ -368,12 +379,18 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta

private renderSpellCheckSection(): JSX.Element {
return (
<div className="mx_SettingsTab_section">
<span className="mx_SettingsTab_subheading">{ _t("Spell check dictionaries") }</span>
<SpellCheckSettings
<div className="mx_SettingsTab_section mx_SettingsTab_section_spellcheck">
<span className="mx_SettingsTab_subheading">
{ _t("Spell check") }
<ToggleSwitch
checked={this.state.spellCheckEnabled}
onChange={this.onSpellCheckEnabledChange}
/>
</span>
{ (this.state.spellCheckEnabled && !IS_MAC) && <SpellCheckSettings
languages={this.state.spellCheckLanguages}
onLanguagesChange={this.onSpellCheckLanguagesChange}
/>
/> }
</div>
);
}
Expand Down Expand Up @@ -449,7 +466,7 @@ export default class GeneralUserSettingsTab extends React.Component<IProps, ISta

public render(): JSX.Element {
const plaf = PlatformPeg.get();
const supportsMultiLanguageSpellCheck = plaf.supportsMultiLanguageSpellCheck();
const supportsMultiLanguageSpellCheck = plaf.supportsSpellCheckSettings();

const discoWarning = this.state.requiredPolicyInfo.hasTerms
? <img
Expand Down
3 changes: 2 additions & 1 deletion src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -1435,7 +1435,7 @@
"Set a new account password...": "Set a new account password...",
"Account": "Account",
"Language and region": "Language and region",
"Spell check dictionaries": "Spell check dictionaries",
"Spell check": "Spell check",
"Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.",
"Account management": "Account management",
"Deactivating your account is a permanent action — be careful!": "Deactivating your account is a permanent action — be careful!",
Expand Down Expand Up @@ -2377,6 +2377,7 @@
"You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.",
"Join millions for free on the largest public server": "Join millions for free on the largest public server",
"Homeserver": "Homeserver",
"Choose a locale": "Choose a locale",
"Continue with %(provider)s": "Continue with %(provider)s",
"Sign in with single sign-on": "Sign in with single sign-on",
"And %(count)s more...|other": "And %(count)s more...",
Expand Down