flarum / framework

Simple forum software for building great communities.
http://flarum.org/
6.36k stars 835 forks source link

There is no way to refresh the composer's preview except by modifying its content #3720

Open n-peugnet opened 1 year ago

n-peugnet commented 1 year ago

Current Behavior

TextFormatter does not allow to use asynchronous calls in the Javascript part of a filter, so I need to refresh the preview once the Promise is resolved (see https://github.com/s9e/TextFormatter/issues/208), but there is currently no way to do this in Flarum.

Steps to Reproduce

  1. In an extension, try to refresh the composer preview
  2. There is no way

Expected Behavior

There should be some kind of function, maybe in EditorDriverInterface, or directly in app.composer (ComposerState).

Screenshots

No response

Environment

Output of php flarum info

Flarum core 1.6.2
PHP version: 8.1.12
MySQL version: 10.6.11-MariaDB-1
Loaded extensions: Core, date, libxml, openssl, pcre, zlib, filter, hash, json, pcntl, Reflection, SPL, session, standard, sodium, mysqlnd, PDO, xml, calendar, ctype, curl, dom, mbstring, FFI, fileinfo, ftp, gd, gettext, iconv, intl, exif, mysqli, pdo_mysql, pdo_sqlite, Phar, posix, readline, shmop, SimpleXML, sockets, sqlite3, sysvmsg, sysvsem, sysvshm, tokenizer, xmlreader, xmlwriter, xsl, Zend OPcache
+-------------------------+-------------------------+------------------------------------------+
| Flarum Extensions       |                         |                                          |
+-------------------------+-------------------------+------------------------------------------+
| ID                      | Version                 | Commit                                   |
+-------------------------+-------------------------+------------------------------------------+
| flarum-flags            | v1.6.1                  |                                          |
| flarum-tags             | v1.6.1                  |                                          |
| flarum-approval         | v1.6.1                  |                                          |
| ianm-syndication        | dev-master              | b65feab8bc3514fe7e83b1b5d5ce4c9ff07b6b48 |
| flarum-suspend          | v1.6.1                  |                                          |
| flarum-subscriptions    | v1.6.1                  |                                          |
| flarum-sticky           | v1.6.1                  |                                          |
| flarum-statistics       | v1.6.1                  |                                          |
| flarum-mentions         | v1.6.1                  |                                          |
| flarum-markdown         | v1.6.1                  |                                          |
| flarum-lock             | v1.6.1                  |                                          |
| flarum-likes            | v1.6.1                  |                                          |
| flarum-lang-french      | v4.4.0                  |                                          |
| flarum-lang-english     | v1.6.0                  |                                          |
| flarum-emoji            | v1.6.1                  |                                          |
| flarum-bbcode           | v1.6.0                  |                                          |
| club-1-cross-references | dev-feat/text-formatter | 294ec30939e1a89239baae02f74c898bcd27fa5c |
+-------------------------+-------------------------+------------------------------------------+
Base URL: http://localhost:8080
Installation path: /home/nicolas/Source/www/flarum
Queue driver: sync
Session driver: file
Mail driver: smtp
Debug mode: ON

Possible Solution

No response

Additional Context

No response

SychO9 commented 1 year ago

It's not clear to me what it is you're trying to do or why you need an async call in the filter. I don't consider this a bug at the moment, it seems more like feature.

Can you please explain your use case.

n-peugnet commented 1 year ago

I don't consider this a bug at the moment, it seems more like feature.

Sorry you're right, this is not exactly a bug request. But as it was a technical request for the extension API, the bug tracker seemed more adequate.

It's not clear to me what it is you're trying to do or why you need an async call in the filter. Can you please explain your use case.

I am writing an extension that modifies the content of CommentPosts. Among other features, it replaces bare links to discussions into a link that contains the title of the discussion. For now this is done in the frontend.

To make the modifications in the backend instead, and to get a preview of the modifications while writing a post, I figured that I needed to add a TextFormatter configuration (https://github.com/club-1/flarum-ext-cross-references/issues/4).

As explained in https://github.com/s9e/TextFormatter/issues/208, I need to make an asynchronous call in the Javascript part of the filter, in order to fetch the title of the discussion from the API (using app.store.find()). But TextFormatter filters only works synchronously, so I was pointed to refreshing the preview once the Promise resolves.

This is indeed working, as I tried to modify the content of the composer using app.composer.editor.insertAt() to trigger a refresh. But I would need to refresh the preview without editing the content of the composer.

From what I see here (ligne 40) there seem to be no way to trigger a refresh with an unchanged content: https://github.com/flarum/framework/blob/fe8480c8f73214ce7a5bc66792d74f5646692244/framework/core/js/src/forum/components/ComposerPostPreview.js#L33-L45