Skip to content

New API with command context #22

@Webbrother

Description

@Webbrother

At the moment there is no way to pass command context which could be necessary for such a command like attachment to pass Promise to the command.

Current implementation: commandController.executeCommand('myCommandName');

1st Idea

The idea: commandController.executeCommand('myCommandName', commandContext);

To implement such functionality it is necessary

  • update the command type ICommand make it generic something like ICommand<CommandContext>
  • update CommandController so the instance could understand ICommand generic type
  const commandWithoutContext: ICommand = {...};
  const commandWithContext: ICommand<number> = {...};

  const { ref, commandController } = useTextAreaMarkdownEditor({
    commandMap: {
      commandName1: commandWithoutContext,
      commandName2: commandWithContext,
    },
  });

  commandController.executeCommand('commandName1'); // No error
  commandController.executeCommand('commandName1', 42); // Error: only 1 argument expected
  
  commandController.executeCommand('commandName2'); // Error: only 2 arguments expected
  commandController.executeCommand('commandName2', 42); // No error

2nd Idea

Current API can be changed this way:

  class CommandWithoutContext extends BaseCommand {...};
  class CommandWithContext extends BaseCommand<number> {...};

  const { ref, commands {
     commandName1,
     commandName2,
  }} = useTextAreaMarkdownEditor({
    commandMap: {
      commandName1: CommandWithoutContext,
      commandName2: CommandWithContext,
    },
  });

  commandName1(); // No error
  commandName1(42); // Error: 0 arguments expected
  
  commandName2(); // Error: 1 argument expected
  commandName2(42); // No error

Such changes require complex types inference logic wich I didn't implement at the moment.
If anyone has code examples of such type inference logic please share them here. Any idea will be highly appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions