Conform more of the codebase to strictNullChecks
(#10602)
* Conform more of the codebase to `strictNullChecks` * Conform more of the codebase to `strictNullChecks` * Fix types
This commit is contained in:
parent
93858813a3
commit
daad630827
26 changed files with 79 additions and 49 deletions
|
@ -100,14 +100,14 @@ export default class AuxPanel extends React.Component<IProps, IState> {
|
|||
|
||||
if (this.props.room && SettingsStore.getValue("feature_state_counters")) {
|
||||
const stateEvs = this.props.room.currentState.getStateEvents("re.jki.counter");
|
||||
stateEvs.sort((a, b) => lexicographicCompare(a.getStateKey(), b.getStateKey()));
|
||||
stateEvs.sort((a, b) => lexicographicCompare(a.getStateKey()!, b.getStateKey()!));
|
||||
|
||||
for (const ev of stateEvs) {
|
||||
const title = ev.getContent().title;
|
||||
const value = ev.getContent().value;
|
||||
const link = ev.getContent().link;
|
||||
const severity = ev.getContent().severity || "normal";
|
||||
const stateKey = ev.getStateKey();
|
||||
const stateKey = ev.getStateKey()!;
|
||||
|
||||
// We want a non-empty title but can accept falsy values (e.g.
|
||||
// zero)
|
||||
|
|
|
@ -765,7 +765,7 @@ export default class BasicMessageEditor extends React.Component<IProps, IState>
|
|||
|
||||
public render(): React.ReactNode {
|
||||
let autoComplete: JSX.Element | undefined;
|
||||
if (this.state.autoComplete) {
|
||||
if (this.state.autoComplete && this.state.query) {
|
||||
const query = this.state.query;
|
||||
const queryLen = query.length;
|
||||
autoComplete = (
|
||||
|
@ -800,8 +800,8 @@ export default class BasicMessageEditor extends React.Component<IProps, IState>
|
|||
const { completionIndex } = this.state;
|
||||
const hasAutocomplete = Boolean(this.state.autoComplete);
|
||||
let activeDescendant: string | undefined;
|
||||
if (hasAutocomplete && completionIndex >= 0) {
|
||||
activeDescendant = generateCompletionDomId(completionIndex);
|
||||
if (hasAutocomplete && completionIndex! >= 0) {
|
||||
activeDescendant = generateCompletionDomId(completionIndex!);
|
||||
}
|
||||
|
||||
return (
|
||||
|
|
|
@ -229,11 +229,11 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
}
|
||||
|
||||
private get editorRoomKey(): string {
|
||||
return editorRoomKey(this.props.editState.getEvent().getRoomId(), this.context.timelineRenderingType);
|
||||
return editorRoomKey(this.props.editState.getEvent().getRoomId()!, this.context.timelineRenderingType);
|
||||
}
|
||||
|
||||
private get editorStateKey(): string {
|
||||
return editorStateKey(this.props.editState.getEvent().getId());
|
||||
return editorStateKey(this.props.editState.getEvent().getId()!);
|
||||
}
|
||||
|
||||
private get events(): MatrixEvent[] {
|
||||
|
@ -275,7 +275,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
private saveStoredEditorState = (): void => {
|
||||
const item = SendHistoryManager.createItem(this.model);
|
||||
this.clearPreviousEdit();
|
||||
localStorage.setItem(this.editorRoomKey, this.props.editState.getEvent().getId());
|
||||
localStorage.setItem(this.editorRoomKey, this.props.editState.getEvent().getId()!);
|
||||
localStorage.setItem(this.editorStateKey, JSON.stringify(item));
|
||||
};
|
||||
|
||||
|
@ -329,7 +329,7 @@ class EditMessageComposer extends React.Component<IEditMessageComposerProps, ISt
|
|||
|
||||
// If content is modified then send an updated event into the room
|
||||
if (this.isContentModified(newContent)) {
|
||||
const roomId = editedEvent.getRoomId();
|
||||
const roomId = editedEvent.getRoomId()!;
|
||||
if (!containsEmote(this.model) && isSlashCommand(this.model)) {
|
||||
const [cmd, args, commandText] = getSlashCommand(this.model);
|
||||
if (cmd) {
|
||||
|
|
|
@ -43,11 +43,13 @@ export default class LinkPreviewWidget extends React.Component<IProps> {
|
|||
if (ev.button != 0 || ev.metaKey) return;
|
||||
ev.preventDefault();
|
||||
|
||||
let src = p["og:image"];
|
||||
let src: string | null | undefined = p["og:image"];
|
||||
if (src?.startsWith("mxc://")) {
|
||||
src = mediaFromMxc(src).srcHttp;
|
||||
}
|
||||
|
||||
if (!src) return;
|
||||
|
||||
const params: Omit<ComponentProps<typeof ImageView>, "onFinished"> = {
|
||||
src: src,
|
||||
width: p["og:image:width"],
|
||||
|
|
|
@ -17,7 +17,7 @@ limitations under the License.
|
|||
import classNames from "classnames";
|
||||
import { IEventRelation } from "matrix-js-sdk/src/models/event";
|
||||
import { M_POLL_START } from "matrix-js-sdk/src/@types/polls";
|
||||
import React, { createContext, MouseEventHandler, ReactElement, ReactNode, RefObject, useContext, useRef } from "react";
|
||||
import React, { createContext, MouseEventHandler, ReactElement, ReactNode, useContext, useRef } from "react";
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import { MatrixClient } from "matrix-js-sdk/src/client";
|
||||
import { THREAD_RELATION_TYPE } from "matrix-js-sdk/src/models/thread";
|
||||
|
@ -180,7 +180,7 @@ interface IUploadButtonProps {
|
|||
const UploadButtonContextProvider: React.FC<IUploadButtonProps> = ({ roomId, relation, children }) => {
|
||||
const cli = useContext(MatrixClientContext);
|
||||
const roomContext = useContext(RoomContext);
|
||||
const uploadInput = useRef() as RefObject<HTMLInputElement>;
|
||||
const uploadInput = useRef<HTMLInputElement>(null);
|
||||
|
||||
const onUploadClick = (): void => {
|
||||
if (cli?.isGuest()) {
|
||||
|
|
|
@ -293,7 +293,7 @@ interface ISectionHeaderProps {
|
|||
}
|
||||
|
||||
function SectionHeader({ className, children }: PropsWithChildren<ISectionHeaderProps>): JSX.Element {
|
||||
const ref = useRef<HTMLHeadingElement>();
|
||||
const ref = useRef<HTMLHeadingElement>(null);
|
||||
const [onFocus] = useRovingTabIndex(ref);
|
||||
|
||||
return (
|
||||
|
|
|
@ -124,7 +124,7 @@ export default class ReadReceiptMarker extends React.PureComponent<IProps, IStat
|
|||
private buildReadReceiptInfo(target: IReadReceiptInfo = {}): IReadReceiptInfo {
|
||||
const element = this.avatar.current;
|
||||
// this is the mx_ReadReceiptsGroup_container
|
||||
const horizontalContainer = element.offsetParent;
|
||||
const horizontalContainer = element?.offsetParent;
|
||||
if (!horizontalContainer || !(horizontalContainer instanceof HTMLElement)) {
|
||||
// this seems to happen sometimes for reasons I don't understand
|
||||
// the docs for `offsetParent` say it may be null if `display` is
|
||||
|
|
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||
limitations under the License.
|
||||
*/
|
||||
|
||||
import React, { RefObject, useRef } from "react";
|
||||
import React, { useRef } from "react";
|
||||
|
||||
import { BreadcrumbsStore } from "../../../stores/BreadcrumbsStore";
|
||||
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
|
||||
|
@ -30,7 +30,7 @@ import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
|
|||
import RoomAvatar from "../avatars/RoomAvatar";
|
||||
|
||||
const RecentlyViewedButton: React.FC = () => {
|
||||
const tooltipRef = useRef() as RefObject<InteractiveTooltip>;
|
||||
const tooltipRef = useRef<InteractiveTooltip>(null);
|
||||
const crumbs = useEventEmitterState(BreadcrumbsStore.instance, UPDATE_EVENT, () => BreadcrumbsStore.instance.rooms);
|
||||
|
||||
const content = (
|
||||
|
|
|
@ -134,7 +134,7 @@ export default class ReplyTile extends React.PureComponent<IProps> {
|
|||
|
||||
let permalink = "#";
|
||||
if (this.props.permalinkCreator) {
|
||||
permalink = this.props.permalinkCreator.forEvent(mxEvent.getId());
|
||||
permalink = this.props.permalinkCreator.forEvent(mxEvent.getId()!);
|
||||
}
|
||||
|
||||
let sender;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue