From b760ec9392b6e25e012d0af6d39c9cc870b1bf35 Mon Sep 17 00:00:00 2001 From: Kerry Date: Mon, 11 Apr 2022 13:58:35 +0200 Subject: [PATCH] Location sharing - extract isSelfLocation util (#8279) * extract isSelfLocation into utils Signed-off-by: Kerry Archibald * replace use of isSelfLocation Signed-off-by: Kerry Archibald --- .../views/messages/MLocationBody.tsx | 12 +--- src/utils/location/index.ts | 1 + src/utils/location/isSelfLocation.ts | 23 ++++++ .../views/messages/MLocationBody-test.tsx | 59 +-------------- test/utils/location/isSelfLocation-test.ts | 72 +++++++++++++++++++ 5 files changed, 99 insertions(+), 68 deletions(-) create mode 100644 src/utils/location/isSelfLocation.ts create mode 100644 test/utils/location/isSelfLocation-test.ts diff --git a/src/components/views/messages/MLocationBody.tsx b/src/components/views/messages/MLocationBody.tsx index 94e27def21..8ab065695c 100644 --- a/src/components/views/messages/MLocationBody.tsx +++ b/src/components/views/messages/MLocationBody.tsx @@ -17,11 +17,6 @@ limitations under the License. import React from 'react'; import maplibregl from 'maplibre-gl'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; -import { - M_ASSET, - LocationAssetType, - ILocationContent, -} from 'matrix-js-sdk/src/@types/location'; import { ClientEvent, IClientWellKnown } from 'matrix-js-sdk/src/client'; import { IBodyProps } from "./IBodyProps"; @@ -33,6 +28,7 @@ import { createMapWithCoords, getLocationShareErrorMessage, LocationShareError, + isSelfLocation, } from '../../../utils/location'; import LocationViewDialog from '../location/LocationViewDialog'; import TooltipTarget from '../elements/TooltipTarget'; @@ -132,12 +128,6 @@ export default class MLocationBody extends React.Component { } } -export function isSelfLocation(locationContent: ILocationContent): boolean { - const asset = M_ASSET.findIn(locationContent) as { type: string }; - const assetType = asset?.type ?? LocationAssetType.Self; - return assetType == LocationAssetType.Self; -} - export const LocationBodyFallbackContent: React.FC<{ event: MatrixEvent, error: Error }> = ({ error, event }) => { const errorType = error?.message as LocationShareError; const message = `${_t('Unable to load map')}: ${getLocationShareErrorMessage(errorType)}`; diff --git a/src/utils/location/index.ts b/src/utils/location/index.ts index 49c6d8112d..a6aeaa65d6 100644 --- a/src/utils/location/index.ts +++ b/src/utils/location/index.ts @@ -15,6 +15,7 @@ limitations under the License. */ export * from './findMapStyleUrl'; +export * from './isSelfLocation'; export * from './locationEventGeoUri'; export * from './LocationShareErrors'; export * from './map'; diff --git a/src/utils/location/isSelfLocation.ts b/src/utils/location/isSelfLocation.ts new file mode 100644 index 0000000000..d1e656e1a0 --- /dev/null +++ b/src/utils/location/isSelfLocation.ts @@ -0,0 +1,23 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { ILocationContent, LocationAssetType, M_ASSET } from "matrix-js-sdk/src/@types/location"; + +export const isSelfLocation = (locationContent: ILocationContent): boolean => { + const asset = M_ASSET.findIn(locationContent) as { type: string }; + const assetType = asset?.type ?? LocationAssetType.Self; + return assetType == LocationAssetType.Self; +}; diff --git a/test/components/views/messages/MLocationBody-test.tsx b/test/components/views/messages/MLocationBody-test.tsx index e80a738534..11b8d707f2 100644 --- a/test/components/views/messages/MLocationBody-test.tsx +++ b/test/components/views/messages/MLocationBody-test.tsx @@ -17,21 +17,11 @@ limitations under the License. import React from 'react'; import { mount } from "enzyme"; import { mocked } from 'jest-mock'; -import { makeLocationContent } from "matrix-js-sdk/src/content-helpers"; -import { - M_ASSET, - LocationAssetType, - ILocationContent, - M_LOCATION, - M_TIMESTAMP, -} from "matrix-js-sdk/src/@types/location"; -import { TEXT_NODE_TYPE } from "matrix-js-sdk/src/@types/extensible_events"; +import { LocationAssetType } from "matrix-js-sdk/src/@types/location"; import maplibregl from 'maplibre-gl'; import { logger } from 'matrix-js-sdk/src/logger'; -import MLocationBody, { - isSelfLocation, -} from "../../../../src/components/views/messages/MLocationBody"; +import MLocationBody from "../../../../src/components/views/messages/MLocationBody"; import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import { RoomPermalinkCreator } from "../../../../src/utils/permalinks/Permalinks"; import { MediaEventHelper } from "../../../../src/utils/MediaEventHelper"; @@ -44,51 +34,6 @@ jest.mock("../../../../src/utils/WellKnownUtils", () => ({ })); describe("MLocationBody", () => { - describe("isSelfLocation", () => { - it("Returns true for a full m.asset event", () => { - const content = makeLocationContent("", '0'); - expect(isSelfLocation(content)).toBe(true); - }); - - it("Returns true for a missing m.asset", () => { - const content = { - body: "", - msgtype: "m.location", - geo_uri: "", - [M_LOCATION.name]: { uri: "" }, - [TEXT_NODE_TYPE.name]: "", - [M_TIMESTAMP.name]: 0, - // Note: no m.asset! - }; - expect(isSelfLocation(content as ILocationContent)).toBe(true); - }); - - it("Returns true for a missing m.asset type", () => { - const content = { - body: "", - msgtype: "m.location", - geo_uri: "", - [M_LOCATION.name]: { uri: "" }, - [TEXT_NODE_TYPE.name]: "", - [M_TIMESTAMP.name]: 0, - [M_ASSET.name]: { - // Note: no type! - }, - }; - expect(isSelfLocation(content as ILocationContent)).toBe(true); - }); - - it("Returns false for an unknown asset type", () => { - const content = makeLocationContent( - undefined, /* text */ - "geo:foo", - 0, - undefined, /* description */ - "org.example.unknown" as unknown as LocationAssetType); - expect(isSelfLocation(content)).toBe(false); - }); - }); - describe('', () => { describe('with error', () => { const mockClient = { diff --git a/test/utils/location/isSelfLocation-test.ts b/test/utils/location/isSelfLocation-test.ts new file mode 100644 index 0000000000..6fafc5e467 --- /dev/null +++ b/test/utils/location/isSelfLocation-test.ts @@ -0,0 +1,72 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { TEXT_NODE_TYPE } from "matrix-js-sdk/src/@types/extensible_events"; +import { + ILocationContent, + LocationAssetType, + M_ASSET, + M_LOCATION, + M_TIMESTAMP, +} from "matrix-js-sdk/src/@types/location"; +import { makeLocationContent } from "matrix-js-sdk/src/content-helpers"; + +import { isSelfLocation } from "../../../src/utils/location"; + +describe("isSelfLocation", () => { + it("Returns true for a full m.asset event", () => { + const content = makeLocationContent("", '0'); + expect(isSelfLocation(content)).toBe(true); + }); + + it("Returns true for a missing m.asset", () => { + const content = { + body: "", + msgtype: "m.location", + geo_uri: "", + [M_LOCATION.name]: { uri: "" }, + [TEXT_NODE_TYPE.name]: "", + [M_TIMESTAMP.name]: 0, + // Note: no m.asset! + }; + expect(isSelfLocation(content as ILocationContent)).toBe(true); + }); + + it("Returns true for a missing m.asset type", () => { + const content = { + body: "", + msgtype: "m.location", + geo_uri: "", + [M_LOCATION.name]: { uri: "" }, + [TEXT_NODE_TYPE.name]: "", + [M_TIMESTAMP.name]: 0, + [M_ASSET.name]: { + // Note: no type! + }, + }; + expect(isSelfLocation(content as ILocationContent)).toBe(true); + }); + + it("Returns false for an unknown asset type", () => { + const content = makeLocationContent( + undefined, /* text */ + "geo:foo", + 0, + undefined, /* description */ + "org.example.unknown" as unknown as LocationAssetType); + expect(isSelfLocation(content)).toBe(false); + }); +});