handleSupportFormDeeplinks()

in desktop/flipper-ui-core/src/reducers/supportForm.tsx [112:213]


  handleSupportFormDeeplinks(store: Store) {
    getLogger().track('usage', 'support-form-source', {
      source: 'deeplink',
      group: this.name,
    });
    store.dispatch(setStaticView(SupportRequestFormV2));
    const selectedAppId = store.getState().connections.selectedAppId;
    const selectedClient = store
      .getState()
      .connections.clients.get(selectedAppId!);
    let errorMessage: string | undefined = undefined;
    if (selectedAppId) {
      const {app} = deconstructClientId(selectedAppId);
      const enabledPlugins: Array<string> | null =
        store.getState().connections.enabledPlugins[app];
      const unsupportedPlugins = [];
      for (const requiredPlugin of this.requiredPlugins) {
        const requiredPluginEnabled =
          enabledPlugins != null && enabledPlugins.includes(requiredPlugin);
        if (
          selectedClient &&
          selectedClient.plugins.has(requiredPlugin) &&
          !requiredPluginEnabled
        ) {
          const plugin =
            store.getState().plugins.clientPlugins.get(requiredPlugin) ||
            store.getState().plugins.devicePlugins.get(requiredPlugin)!;
          store.dispatch(
            switchPlugin({
              selectedApp: app,
              plugin,
            }),
          );
        } else if (
          !selectedClient ||
          !selectedClient.plugins.has(requiredPlugin)
        ) {
          unsupportedPlugins.push(requiredPlugin);
        }
      }
      if (unsupportedPlugins.length > 0) {
        errorMessage = `The current client does not support ${unsupportedPlugins.join(
          ', ',
        )}. Please change the app from the dropdown in the support form.`;
        logPlatformSuccessRate(`${SUPPORT_FORM_PREFIX}-deeplink`, {
          kind: 'failure',
          supportedOperation: true,
          error: errorMessage,
        });
        showStatusUpdatesForDuration(
          errorMessage,
          'Deeplink',
          10000,
          (payload) => {
            store.dispatch(addStatusMessage(payload));
          },
          (payload) => {
            store.dispatch(removeStatusMessage(payload));
          },
        );
      }
    } else {
      errorMessage =
        'Selected app is null, thus the deeplink failed to enable required plugin.';
      showStatusUpdatesForDuration(
        'Please select an app and the device from the dropdown.',
        'Deeplink',
        10000,
        (payload) => {
          store.dispatch(addStatusMessage(payload));
        },
        (payload) => {
          store.dispatch(removeStatusMessage(payload));
        },
      );
    }
    store.dispatch(
      setSupportFormV2State({
        ...store.getState().supportForm.supportFormV2,
        selectedGroup: this,
      }),
    );
    const pluginsList = getExportablePlugins(store.getState());

    store.dispatch(
      setSelectedPlugins(
        this.getPluginsToSelect().filter((s) => {
          return pluginsList.map((s) => s.id).includes(s);
        }),
      ),
    );
    logPlatformSuccessRate(
      `${SUPPORT_FORM_PREFIX}-deeplink`,
      errorMessage
        ? {
            kind: 'failure',
            supportedOperation: true,
            error: errorMessage,
          }
        : {kind: 'success'},
    );
  }