message: Hide virtual widgets from the room info panel
diff: @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
  limitations under the License.
  */
  -import React, { useCallback, useContext, useEffect, useState } from "react";
  +import React, { useCallback, useContext, useEffect, useMemo, useState } from "react";
  import classNames from "classnames";
  import { Room } from "matrix-js-sdk/src/models/room";
  @@ -197,6 +197,8 @@ const AppRow: React.FC<IAppRowProps> = ({ app, room }) => {
  const AppsSection: React.FC<IAppsSectionProps> = ({ room }) => {
  const apps = useWidgets(room);
  + // Filter out virtual widgets
  + const realApps = useMemo(() => apps.filter(app => app.eventId !== undefined), [apps]);
  const onManageIntegrations = () => {
  const managers = IntegrationManagers.sharedInstance();
  @@ -208,8 +210,8 @@ const AppsSection: React.FC<IAppsSectionProps> = ({ room }) => {
  }
  };
  - let copyLayoutBtn = null;
  - if (apps.length > 0 && WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) {
  + let copyLayoutBtn: JSX.Element | null = null;
  + if (realApps.length > 0 && WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) {
  copyLayoutBtn = (
  <AccessibleButton kind="link" onClick={() => WidgetLayoutStore.instance.copyLayoutToRoom(room)}>
  { _t("Set my room layout for everyone") }
  @@ -218,10 +220,10 @@ const AppsSection: React.FC<IAppsSectionProps> = ({ room }) => {
  }
  return <Group className="mx_RoomSummaryCard_appsGroup" title={_t("Widgets")}>
  - { apps.map(app => <AppRow key={app.id} app={app} room={room} />) }
  + { realApps.map(app => <AppRow key={app.id} app={app} room={room} />) }
  { copyLayoutBtn }
  <AccessibleButton kind="link" onClick={onManageIntegrations}>
  - { apps.length > 0 ? _t("Edit widgets, bridges & bots") : _t("Add widgets, bridges & bots") }
  + { realApps.length > 0 ? _t("Edit widgets, bridges & bots") : _t("Add widgets, bridges & bots") }
  </AccessibleButton>
  </Group>;
  };
  