Notification improvements (#324)

This commit is contained in:
Andrew Prifer 2022-10-21 22:32:53 +02:00 committed by GitHub
parent 965d7085dc
commit 43714fdf17
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 47 deletions

View file

@ -36,7 +36,7 @@ const createEditable = <Keys extends keyof JSX.IntrinsicElements>(
if (Component !== 'primitive' && !type) { if (Component !== 'primitive' && !type) {
throw new Error( throw new Error(
`You must provide the type of the component out of which you're creating an editable. For example: editable(MyComponent, 'mesh').`, `You must provide the type of the component you're creating an editable for. For example: editable(MyComponent, 'mesh').`,
) )
} }
@ -103,7 +103,8 @@ const createEditable = <Keys extends keyof JSX.IntrinsicElements>(
The easiest way to create a custom animatable \`${dreiComponent}\` is to import it from \`@react-three/drei\`, and make it editable. The easiest way to create a custom animatable \`${dreiComponent}\` is to import it from \`@react-three/drei\`, and make it editable.
\`\`\` \`\`\`
import {${dreiComponent}} from '@react-three/drei' import {${dreiComponent}} from '@react-three/drei'
const EditableCamera =
const EditableCamera =
editable(${dreiComponent}, '${Component}') editable(${dreiComponent}, '${Component}')
\`\`\` \`\`\`
Then you can use it in your JSX like any other editable component. Note the makeDefault prop exposed by drei, which makes r3f use it for rendering. Then you can use it in your JSX like any other editable component. Note the makeDefault prop exposed by drei, which makes r3f use it for rendering.

View file

@ -247,12 +247,12 @@ export default class TheatreSequence implements ISequence {
"However, when using `@theatre/studio`, it takes a few milliseconds for it to load your project's state, " + "However, when using `@theatre/studio`, it takes a few milliseconds for it to load your project's state, " +
`before which your sequences cannot start playing.\n` + `before which your sequences cannot start playing.\n` +
`\n` + `\n` +
'To fix this, simply defer calling `sequence.play()` until after the project is loaded, like this:\n' + 'To fix this, simply defer calling `sequence.play()` until after the project is loaded, like this:\n\n' +
'```\n' + '```\n' +
`project.ready.then(() => {\n` + `project.ready.then(() => {\n` +
` sequence.play()\n` + ` sequence.play()\n` +
`})\n` + `})\n` +
'```\n', '```',
[ [
{ {
url: 'https://www.theatrejs.com/docs/0.5/api/core#project.ready', url: 'https://www.theatrejs.com/docs/0.5/api/core#project.ready',

View file

@ -35,6 +35,7 @@
"@types/jest": "^26.0.23", "@types/jest": "^26.0.23",
"@types/lodash": "^4.14.170", "@types/lodash": "^4.14.170",
"@types/lodash-es": "^4.17.4", "@types/lodash-es": "^4.17.4",
"@types/marked": "^4.0.7",
"@types/node": "^15.12.3", "@types/node": "^15.12.3",
"@types/react": "^17.0.9", "@types/react": "^17.0.9",
"@types/react-dom": "^17.0.6", "@types/react-dom": "^17.0.6",
@ -62,6 +63,7 @@
"json-touch-patch": "^0.11.2", "json-touch-patch": "^0.11.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"marked": "^4.1.1",
"nanoid": "^3.3.1", "nanoid": "^3.3.1",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"null-loader": "^4.0.1", "null-loader": "^4.0.1",
@ -86,7 +88,6 @@
"rollup": "^2.56.3", "rollup": "^2.56.3",
"rollup-plugin-dts": "^4.0.0", "rollup-plugin-dts": "^4.0.0",
"shallowequal": "^1.1.0", "shallowequal": "^1.1.0",
"snarkdown": "^2.0.0",
"styled-components": "^5.3.5", "styled-components": "^5.3.5",
"svg-inline-loader": "^0.8.2", "svg-inline-loader": "^0.8.2",
"timing-function": "^0.2.3", "timing-function": "^0.2.3",

View file

@ -78,6 +78,13 @@ export const notify: Notifiers = {
window?.addEventListener('error', (e) => { window?.addEventListener('error', (e) => {
notify.error( notify.error(
`An error occurred`, `An error occurred`,
`${e.message}\n\nSee **console** for details.`, `<pre>${e.message}</pre>\n\nSee **console** for details.`,
)
})
window?.addEventListener('unhandledrejection', (e) => {
notify.error(
`An error occurred`,
`<pre>${e.reason}</pre>\n\nSee **console** for details.`,
) )
}) })

View file

@ -1,7 +1,6 @@
import React, {Fragment} from 'react' import React, {Fragment} from 'react'
import toast, {useToaster} from 'react-hot-toast/headless' import toast, {useToaster} from 'react-hot-toast/headless'
import styled from 'styled-components' import styled from 'styled-components'
import snarkdown from 'snarkdown'
import {pointerEventsAutoInNormalMode} from './css' import {pointerEventsAutoInNormalMode} from './css'
import type { import type {
Notification, Notification,
@ -11,6 +10,7 @@ import type {
} from '@theatre/shared/notify' } from '@theatre/shared/notify'
import {useVal} from '@theatre/react' import {useVal} from '@theatre/react'
import getStudio from './getStudio' import getStudio from './getStudio'
import {marked} from 'marked'
/** /**
* Creates a string key unique to a notification with a certain title and message. * Creates a string key unique to a notification with a certain title and message.
@ -120,11 +120,6 @@ const NotificationMessage = styled.div`
color: rgba(255, 255, 255, 0.9); color: rgba(255, 255, 255, 0.9);
} }
hr {
visibility: hidden;
height: 8px;
}
em { em {
font-style: italic; font-style: italic;
} }
@ -134,18 +129,11 @@ const NotificationMessage = styled.div`
color: #d5d5d5; color: #d5d5d5;
} }
.code { p {
overflow: auto;
font-family: monospace;
background: rgba(0, 0, 0, 0.3);
padding: 4px;
margin-bottom: 8px; margin-bottom: 8px;
margin-top: 8px;
border-radius: 4px;
border: 1px solid rgba(255, 255, 255, 0.08);
} }
:not(.code) > code { code {
font-family: monospace; font-family: monospace;
background: rgba(0, 0, 0, 0.3); background: rgba(0, 0, 0, 0.3);
padding: 1px 1px 2px; padding: 1px 1px 2px;
@ -153,6 +141,18 @@ const NotificationMessage = styled.div`
border: 1px solid rgba(255, 255, 255, 0.08); border: 1px solid rgba(255, 255, 255, 0.08);
white-space: pre-wrap; white-space: pre-wrap;
} }
pre > code {
white-space: pre;
display: block;
overflow: auto;
padding: 4px;
}
pre {
white-space: pre-wrap;
margin-bottom: 8px;
}
` `
const DismissButton = styled.button` const DismissButton = styled.button`
@ -195,23 +195,6 @@ const IndicatorDot = styled.div<{type: NotificationType}>`
` `
//endregion //endregion
/**
* Replaces <br /> tags with <hr /> tags. We do this because snarkdown outputs <br />
* between paragraphs, which are not styleable.
*
* A better solution would be to use a markdown parser that outputs <p> tags instead of <br />.
*/
const replaceBrWithHr = (text: string) => {
return text.replace(/<br \/>/g, '<hr />')
}
/**
* Transforms the provided notification message into HTML.
*/
const massageMessage = (message: string) => {
return replaceBrWithHr(snarkdown(message))
}
/** /**
* Creates handlers for different types of notifications. * Creates handlers for different types of notifications.
*/ */
@ -236,7 +219,7 @@ const createHandler =
<NotificationTitle>{title}</NotificationTitle> <NotificationTitle>{title}</NotificationTitle>
<NotificationMessage <NotificationMessage
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: massageMessage(message), __html: marked.parse(message),
}} }}
/> />
{docs.length > 0 && ( {docs.length > 0 && (

View file

@ -8002,6 +8002,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/marked@npm:^4.0.7":
version: 4.0.7
resolution: "@types/marked@npm:4.0.7"
checksum: 4907b6a606578cd864bad429aca3c234591e6ed56bd141c575140487269b825a480ace9a85e4d003d1de1f007004c9d9b2fe600038ded5bba75aef59118e58d5
languageName: node
linkType: hard
"@types/mime@npm:^1": "@types/mime@npm:^1":
version: 1.3.2 version: 1.3.2
resolution: "@types/mime@npm:1.3.2" resolution: "@types/mime@npm:1.3.2"
@ -21367,6 +21374,15 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"marked@npm:^4.1.1":
version: 4.1.1
resolution: "marked@npm:4.1.1"
bin:
marked: bin/marked.js
checksum: 717e3357952ee53de831bf0eb110ed075bebca2376c58bcdf7ee523ef540d45308ad6d51b2c933da0968832ea4386f31c142ca65443e77c098e84f6cce73e418
languageName: node
linkType: hard
"matched@npm:^5.0.0": "matched@npm:^5.0.0":
version: 5.0.1 version: 5.0.1
resolution: "matched@npm:5.0.1" resolution: "matched@npm:5.0.1"
@ -28232,13 +28248,6 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"snarkdown@npm:^2.0.0":
version: 2.0.0
resolution: "snarkdown@npm:2.0.0"
checksum: e92bb254aad8c50da610e2f5f770360542b8412cb1dd6512aaf1f213322f474acd71c882d557cfadb54c34dd1041ee8677bc44061568d60df7cee54134e047e5
languageName: node
linkType: hard
"sockjs-client@npm:^1.5.0": "sockjs-client@npm:^1.5.0":
version: 1.5.1 version: 1.5.1
resolution: "sockjs-client@npm:1.5.1" resolution: "sockjs-client@npm:1.5.1"
@ -29673,6 +29682,7 @@ fsevents@^1.2.7:
"@types/jest": ^26.0.23 "@types/jest": ^26.0.23
"@types/lodash": ^4.14.170 "@types/lodash": ^4.14.170
"@types/lodash-es": ^4.17.4 "@types/lodash-es": ^4.17.4
"@types/marked": ^4.0.7
"@types/node": ^15.12.3 "@types/node": ^15.12.3
"@types/react": ^17.0.9 "@types/react": ^17.0.9
"@types/react-dom": ^17.0.6 "@types/react-dom": ^17.0.6
@ -29702,6 +29712,7 @@ fsevents@^1.2.7:
json-touch-patch: ^0.11.2 json-touch-patch: ^0.11.2
lodash: ^4.17.21 lodash: ^4.17.21
lodash-es: ^4.17.21 lodash-es: ^4.17.21
marked: ^4.1.1
nanoid: ^3.3.1 nanoid: ^3.3.1
npm-run-all: ^4.1.5 npm-run-all: ^4.1.5
null-loader: ^4.0.1 null-loader: ^4.0.1
@ -29726,7 +29737,6 @@ fsevents@^1.2.7:
rollup: ^2.56.3 rollup: ^2.56.3
rollup-plugin-dts: ^4.0.0 rollup-plugin-dts: ^4.0.0
shallowequal: ^1.1.0 shallowequal: ^1.1.0
snarkdown: ^2.0.0
styled-components: ^5.3.5 styled-components: ^5.3.5
svg-inline-loader: ^0.8.2 svg-inline-loader: ^0.8.2
timing-function: ^0.2.3 timing-function: ^0.2.3