/* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ import React, { type ComponentType, type Ref } from "react"; import { type MatrixClient } from "matrix-js-sdk/src/matrix"; import { type RenderOptions } from "jest-matrix-react"; import { MatrixClientPeg as peg } from "../../src/MatrixClientPeg"; import MatrixClientContext from "../../src/contexts/MatrixClientContext"; import { SDKContext } from "../../src/contexts/SDKContext"; import { type SDKContextClass } from "../../src/contexts/SDKContextClass"; import { type RoomContextType } from "../../src/contexts/RoomContext.ts"; import { ScopedRoomContextProvider } from "../../src/contexts/ScopedRoomContext.tsx"; type WrapperProps = { wrappedRef?: Ref> } & T; export function wrapInMatrixClientContext(WrappedComponent: ComponentType): ComponentType> { class Wrapper extends React.Component> { _matrixClient: MatrixClient; constructor(props: WrapperProps) { super(props); this._matrixClient = peg.safeGet(); } render() { return ( ); } } return Wrapper; } export function wrapInSdkContext( WrappedComponent: ComponentType, sdkContext: SDKContextClass, ): ComponentType> { return class extends React.Component> { render() { return ( ); } }; } /** * Test helper to generate React testing library render options for wrapping with a MatrixClientContext.Provider * @param client the MatrixClient instance to expose via the provider */ export function withClientContextRenderOptions(client: MatrixClient): RenderOptions { return { wrapper: ({ children }) => ( {children} ), }; } export function clientAndSDKContextRenderOptions(client: MatrixClient, sdkContext: SDKContextClass): RenderOptions { return { wrapper: ({ children }) => ( {children} ), }; } export function withContexts({ sdkContext, matrixClient, roomContext, }: { sdkContext?: SDKContextClass; matrixClient?: MatrixClient; roomContext?: RoomContextType; }): RenderOptions { return { wrapper: ({ children }) => { const client = matrixClient || sdkContext?.client; if (client) { children = {children}; } if (sdkContext) { children = {children}; } if (roomContext) { children = {children}; } return children; }, }; }