-
Notifications
You must be signed in to change notification settings - Fork 60
docs: core funtionalities section #715
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: @ksienkiewicz/docs-rich-text-formatting
Are you sure you want to change the base?
Changes from all commits
c3b80cd
b2f25f5
8a54cb1
01244ae
b8933ae
b6fa9e6
5b09240
6560ad1
69ee230
03f546a
6eadff0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,4 +4,56 @@ sidebar_position: 3 | |
|
|
||
| # Handling events | ||
|
|
||
| <!-- TODO: write content for this page --> | ||
| Since the input is [uncontrolled](/fundamentals/core-concepts#the-input-is-uncontrolled), | ||
| events are how you observe it. You change content by calling ref methods; you | ||
| react to changes by listening to the callbacks below. | ||
|
|
||
| Full payload shapes of the available callbacks can be found in the `EnrichedTextInput` reference. | ||
|
|
||
| ## Content | ||
|
|
||
| - **`onChangeText`** - plain-text content changed. | ||
| - **`onChangeHtml`** - the HTML changed. | ||
|
|
||
| :::tip | ||
|
|
||
| The `onChangeHtml` callback has to parse the content into HTML on every keystroke. | ||
| This is a heavy computational operation that might slow down your app's performance. Consider using the `getHTML()` ref method instead if it meets your requirements. | ||
|
|
||
| ::: | ||
|
|
||
| ## Selection and style state | ||
|
|
||
| - **`onChangeSelection`** - the cursor moved or the selection changed. Gives you | ||
| `start`, `end`, and the selected `text`. Useful for range-based methods like | ||
| [`setLink`](/rich-text-formatting/links). | ||
| - **`onChangeState`** - the active styles at the cursor changed. This is the | ||
| event that drives a toolbar by using reported `isActive`, `isBlocking`, and | ||
| `isConflicting`, plus the current `alignment`. See the | ||
| [style state model](/fundamentals/core-concepts#the-style-state-model). | ||
|
|
||
| ## Focus | ||
|
|
||
| - **`onFocus`** / **`onBlur`** - the input gained or lost focus. | ||
|
|
||
| ## Mentions | ||
|
|
||
| - **`onStartMention`** - a mention started being edited. | ||
| - **`onChangeMention`** - the query after the indicator changed. | ||
| - **`onEndMention`** - editing a mention stopped. | ||
| - **`onMentionDetected`** - the cursor entered or left a mention. | ||
|
|
||
| ## Links | ||
|
|
||
| - **`onLinkDetected`** - the cursor entered or left a link. | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would also add some info about
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The same with mentions events, I wonder if it's the right place for that |
||
|
|
||
| ## Images | ||
|
|
||
| - **`onPasteImages`** - the user pasted one or more images; hands you each | ||
| image's data so you can upload and insert them with | ||
| [`setImage`](/rich-text-formatting/inline-images). | ||
|
|
||
| ## Keyboard and submission | ||
|
|
||
| - **`onKeyPress`** - a key was pressed. | ||
| - **`onSubmitEditing`** - the user presses return/enter key. Fires when `submitBehavior` is set to either `submit` or `blurAndSubmit`. | ||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| --- | ||
| sidebar_position: 2 | ||
| --- | ||
|
|
||
| import InteractiveExample from '@site/src/components/InteractiveExample'; | ||
| import RenderingEditor from '@site/src/examples/RenderingEditor'; | ||
| import RenderingEditorSrc from '!!raw-loader!@site/src/examples/RenderingEditor'; | ||
|
|
||
| # Rendering rich text | ||
|
|
||
| `EnrichedTextInput` is for editing. To _display_ rich text without an editor - | ||
| a chat message, a comment, an article - use its read-only counterpart, | ||
| **`EnrichedText`**. | ||
|
|
||
| Both components speak the same [HTML format](/fundamentals/html-format-and-supported-tags), | ||
| so the typical flow is: edit in `EnrichedTextInput`, persist the | ||
| `getHTML` output, and later feed that | ||
| string to `EnrichedText`. | ||
|
|
||
| ## Passing content | ||
|
|
||
| `EnrichedText` takes the HTML string as its `children`: | ||
|
|
||
| ```tsx | ||
| import { EnrichedText } from 'react-native-enriched-html'; | ||
|
|
||
| <EnrichedText>{'<p>Hello <b>world</b></p>'}</EnrichedText>; | ||
| ``` | ||
|
|
||
| ## Styling | ||
|
|
||
| Styling mirrors the input. `style` controls the container and base typography, | ||
| and `htmlStyle` controls per-element appearance. `EnrichedText` extends | ||
| `htmlStyle` with **press states** for interactive elements, since links and | ||
| mentions are pressable here: | ||
|
|
||
| ```tsx | ||
| <EnrichedText | ||
| style={{ fontSize: 16, color: '#232736' }} | ||
| htmlStyle={{ | ||
| a: { pressColor: '#1e40af' }, | ||
| mention: { pressColor: '#16a34a', pressBackgroundColor: '#dcfce7' }, | ||
| }}> | ||
| {html} | ||
| </EnrichedText> | ||
| ``` | ||
|
|
||
| The added `pressColor` / `pressBackgroundColor` fields on `a` and `mention` are | ||
| the only shape difference from the input's `htmlStyle`. See the | ||
| [`EnrichedText`](/api-reference/enriched-text) reference for the full type. | ||
|
|
||
| ## Notable props | ||
|
|
||
| - **`selectable`** - allow the user to select and copy the rendered text. | ||
| Defaults to `false`. | ||
| - **`onLinkPress` / `onMentionPress`** - fire when a link or mention is pressed. | ||
| - **`numberOfLines` / `ellipsizeMode`** - truncate long content to a fixed | ||
| number of lines with an ellipsis. | ||
| - **`useHtmlNormalizer`** - normalize external or messy HTML into the library's canonical | ||
| tag subset before rendering. Defaults to `true`. See | ||
| [Normalization](/fundamentals/core-concepts#normalization). | ||
|
|
||
| :::note | ||
|
|
||
| On web, the default behavior of the pressed `<a>` tag is suppressed. To navigate to the link's URL, you need to properly handle the `onLinkPress` event. | ||
|
|
||
| ::: | ||
|
|
||
| ## Try it out | ||
|
|
||
| Format some text in the editor, then press **Render** - the current HTML is read | ||
| with `getHTML()` and handed to an `EnrichedText` below. | ||
|
|
||
| <InteractiveExample src={RenderingEditorSrc} component={RenderingEditor} /> | ||
|
|
||
| :::caution | ||
|
|
||
| On iOS and Android, `EnrichedText` does not sanitize HTML for you. Sanitize anything you render that | ||
| came from users or other untrusted sources. To know more about the web's built-in sanitization, visit [Web support](/core-functionalities/web-support#sanitization). | ||
|
|
||
| ::: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe it would be worth mentioning that when the cursor leaves a mention, the event fires with empty values so you can clean up any related state?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good idea, but I wonder if that information should be here or in the
api-reference🤔