Merge pull request #21139 from danielpetri1/show-poll-result-in-bbb-playback

refactor(bbb-html5): Remove custom poll shape
This commit is contained in:
Anton Georgiev 2024-09-25 10:39:56 -04:00 committed by GitHub
commit 6f5482dae3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 306 additions and 305 deletions

View File

@ -18,7 +18,7 @@ class PresentationModel {
presentations.values.toVector
}
def getCurrentPresentation(): Option[Presentation] = { // todo remove
def getCurrentPresentation(): Option[Presentation] = {
presentations.values find (p => p.current)
}

View File

@ -68,4 +68,4 @@ object JsonUtils {
}
}
}
}

View File

@ -8,6 +8,7 @@ import org.bigbluebutton.core.domain.MeetingState2x
import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.HashMap
import org.bigbluebutton.core.running.LiveMeeting
import org.bigbluebutton.core.models.PresentationPage
object Polls {
@ -111,7 +112,10 @@ object Polls {
for {
result <- getSimplePollResult(pollId, lm.polls)
shape = pollResultToWhiteboardShape(result)
pod <- state.presentationPodManager.getDefaultPod()
pres <- pod.getCurrentPresentation()
page <- PresentationInPod.getCurrentPage(pres)
shape = pollResultToWhiteboardShape(result, page)
annot <- send(result, shape)
} yield {
lm.wbModel.addAnnotations(annot.wbId, lm.props.meetingProp.intId, requesterId, Array[AnnotationVO](annot), isPresenter = false, isModerator = false)
@ -251,15 +255,48 @@ object Polls {
}
}
private def pollResultToWhiteboardShape(result: SimplePollResultOutVO): scala.collection.immutable.Map[String, Object] = {
private def pollResultToWhiteboardShape(result: SimplePollResultOutVO, page: PresentationPage): scala.collection.immutable.Map[String, Object] = {
val maxImageWidth = 1440
val maxImageHeight = 1080
val poll_width = 300
val poll_height = 200
val whiteboardRatio = Math.min(maxImageWidth / page.width, maxImageHeight / page.height);
val scaledWidth = page.width * whiteboardRatio
val scaledHeight = page.height * whiteboardRatio
val x: Double = scaledWidth - poll_width
val y: Double = scaledHeight - poll_height
val shape = new scala.collection.mutable.HashMap[String, Object]()
shape += "numRespondents" -> Integer.valueOf(result.numRespondents)
shape += "numResponders" -> Integer.valueOf(result.numResponders)
shape += "questionType" -> result.questionType
shape += "questionText" -> result.questionText.getOrElse("")
val props = new scala.collection.mutable.HashMap[String, Object]()
val meta = new scala.collection.mutable.HashMap[String, Object]()
props += "answers" -> result.answers
props += "numRespondents" -> Integer.valueOf(result.numRespondents)
props += "numResponders" -> Integer.valueOf(result.numResponders)
props += "questionText" -> result.questionText.getOrElse("")
props += "questionType" -> result.questionType
props += "w" -> Integer.valueOf(poll_width)
props += "h" -> Integer.valueOf(poll_height)
props += "fill" -> "black"
props += "color" -> "black"
props += "question" -> result.questionText.getOrElse("")
shape += "x" -> java.lang.Double.valueOf(x)
shape += "y" -> java.lang.Double.valueOf(y)
shape += "isLocked" -> java.lang.Boolean.valueOf(false)
shape += "index" -> "a1"
shape += "rotation" -> Integer.valueOf(0)
shape += "parentId" -> "page:1"
shape += "typeName" -> "shape"
shape += "opacity" -> Integer.valueOf(1)
shape += "id" -> s"shape:poll-result-${result.id}"
shape += "answers" -> result.answers
shape += "type" -> "geo"
shape += "meta" -> meta.toMap
shape += "type" -> "poll"
shape += "props" -> props.toMap
shape.toMap
}
@ -275,22 +312,6 @@ object Polls {
} yield poll.toPollVO()
}
//
// def numPolls(polls: Polls): Int = {
// polls.size
// }
//
// def addPoll(poll: Poll, model: PollModel) {
// model.polls += poll.id -> poll
// }
//
// def hasCurrentPoll(model: PollModel): Boolean = {
// model.currentPoll != None
// }
//
// def getCurrentPoll(model: PollModel): Option[PollVO] = {
// model.currentPoll
// }
def getPolls(polls: Polls): Array[PollVO] = {
val poll = new ArrayBuffer[PollVO]
@ -301,19 +322,6 @@ object Polls {
poll.toArray
}
// def clearPoll(pollID: String, model: PollModel): Boolean = {
// var success = false
// model.polls.get(pollID) match {
// case Some(p) => {
// p.clear
// success = true
// }
// case None => success = false
// }
//
// success
// }
//
def startPoll(pollId: String, polls: Polls) {
polls.get(pollId) foreach {
p =>
@ -321,29 +329,12 @@ object Polls {
polls.currentPoll = Some(p)
}
}
//
// def removePoll(pollID: String, model: PollModel): Boolean = {
// var success = false
// model.polls.get(pollID) match {
// case Some(p) => {
// model.polls -= p.id
// success = true
// }
// case None => success = false
// }
//
// success
// }
//
def stopPoll(pollId: String, polls: Polls) {
polls.get(pollId) foreach (p => p.stop())
PollDAO.updateEnded(pollId)
}
// def hasPoll(pollId: String, model: PollModel): Boolean = {
// model.polls.get(pollId) != None
// }
//
def getSimplePoll(pollId: String, polls: Polls): Option[SimplePollOutVO] = {
var pvo: Option[SimplePollOutVO] = None
polls.get(pollId) foreach (p => pvo = Some(p.toSimplePollOutVO()))
@ -762,14 +753,6 @@ class Polls {
poll
}
/*
private def remove(id: String): Option[Poll] = {
val poll = polls.get(id)
poll foreach (p => polls -= id)
poll
}
*/
private def get(id: String): Option[Poll] = {
polls.get(id)
}

View File

@ -103,4 +103,4 @@ object AddShapeWhiteboardRecordEvent {
protected final val NUM_RESPONDERS = "num_responders"
protected final val NUM_RESPONDENTS = "num_respondents"
protected final val RESULT = "result"
}
}

View File

@ -31,13 +31,17 @@ class AddTldrawShapeWhiteboardRecordEvent extends AbstractWhiteboardRecordEvent
implicit object AnyJsonFormat extends JsonFormat[Any] {
def write(x: Any) = x match {
case n: Int => JsNumber(n)
case s: String => JsString(s)
case d: Double => JsNumber(d)
case n: Int => JsNumber(n)
case s: String => JsString(s)
case d: Double => JsNumber(d)
case m: scala.collection.immutable.Map[String, _] => mapFormat[String, Any].write(m)
case l: List[_] => listFormat[Any].write(l)
case b: Boolean if b == true => JsTrue
case b: Boolean if b == false => JsFalse
case l: List[_] => listFormat[Any].write(l)
case b: Boolean if b == true => JsTrue
case b: Boolean if b == false => JsFalse
case v: SimpleVoteOutVO => JsObject("id" -> JsNumber(v.id), "key" -> JsString(v.key), "numVotes" -> JsNumber(v.numVotes))
case arr: Array[_] => JsArray(arr.map(write).toVector)
case null => JsNull
case _ => throw new IllegalArgumentException(s"Unsupported type: ${x.getClass.getName}")
}
def read(value: JsValue) = {}

View File

@ -291,8 +291,7 @@ class RedisRecorderActor(
}
private def handleSendWhiteboardAnnotationsEvtMsg(msg: SendWhiteboardAnnotationsEvtMsg) {
// filter poll annotations that are still not tldraw ready
msg.body.annotations.filter(!_.annotationInfo.contains("answers")).foreach(annotation => {
msg.body.annotations.foreach(annotation => {
val ev = new AddTldrawShapeWhiteboardRecordEvent()
ev.setMeetingId(msg.header.meetingId)
ev.setPresentation(getPresentationId(annotation.wbId))

View File

@ -32,8 +32,6 @@ import { notifyShapeNumberExceeded, getCustomEditorAssetUrls, getCustomAssetUrls
import NoopTool from './custom-tools/noop-tool/component';
import { PollShapeUtil } from './custom-shapes/poll/component';
const CAMERA_TYPE = 'camera';
// Helper functions
@ -161,8 +159,6 @@ const Whiteboard = React.memo((props) => {
// eslint-disable-next-line no-unused-vars
const [shapesVersion, setShapesVersion] = React.useState(0);
const customShapeUtils = [PollShapeUtil];
const customTools = [NoopTool];
const presenterChanged = usePrevious(isPresenter) !== isPresenter;
@ -1546,7 +1542,6 @@ const Whiteboard = React.memo((props) => {
forceMobile
hideUi={!(hasWBAccessRef.current || isPresenter)}
onMount={handleTldrawMount}
shapeUtils={customShapeUtils}
tools={customTools}
/>
<Styled.TldrawV2GlobalStyle

View File

@ -1,117 +0,0 @@
import React from 'react';
import {
HTMLContainer,
Rectangle2d,
ShapeUtil,
TLOnResizeHandler,
getDefaultColorTheme,
resizeBox,
} from '@bigbluebutton/tldraw';
import { pollShapeMigrations } from './poll-shape-migrations';
import { pollShapeProps } from './poll-shape-props';
import { IPollShape } from './poll-shape-types';
import ChatPollContent from '/imports/ui/components/chat/chat-graphql/chat-message-list/page/chat-message/message-content/poll-content/component';
export class PollShapeUtil extends ShapeUtil<IPollShape> {
static override type = 'poll' as const;
static override props = pollShapeProps;
static override migrations = pollShapeMigrations;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
override isAspectRatioLocked = (_shape: IPollShape) => false;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
override canResize = (_shape: IPollShape) => true;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
override canBind = (_shape: IPollShape) => true;
getDefaultProps(): IPollShape['props'] {
return {
w: 300,
h: 300,
color: 'black',
fill: 'white',
question: '',
numRespondents: 0,
numResponders: 0,
questionText: '',
questionType: '',
answers: [],
};
}
// eslint-disable-next-line class-methods-use-this
getGeometry(shape: IPollShape) {
return new Rectangle2d({
width: shape.props.w,
height: shape.props.h,
isFilled: true,
});
}
component(shape: IPollShape) {
const { bounds } = this.editor.getShapeGeometry(shape);
const theme = getDefaultColorTheme({
isDarkMode: this.editor.user.getIsDarkMode(),
});
const contentRef = React.useRef<HTMLDivElement>(null);
const pollMetadata = JSON.stringify({
id: shape.id,
question: shape.props.question,
numRespondents: shape.props.numRespondents,
numResponders: shape.props.numResponders,
questionText: shape.props.questionText,
questionType: shape.props.questionType,
answers: shape.props.answers,
});
const adjustedHeight = shape.props.questionText.length > 0 ? bounds.height - 75 : bounds.height;
return (
<HTMLContainer
id={shape.id}
style={{
border: '1px solid #8B9AA8',
borderRadius: '4px',
boxShadow: '0px 0px 4px 0px rgba(0, 0, 0, 0.20)',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
pointerEvents: 'all',
backgroundColor: theme[shape.props.color].semi,
color: theme[shape.props.color].solid,
}}
>
<div
ref={contentRef}
style={{
width: `${bounds.width}px`,
overflow: 'hidden',
position: 'relative',
}}
>
<ChatPollContent
metadata={pollMetadata}
height={adjustedHeight}
/>
</div>
</HTMLContainer>
);
}
// eslint-disable-next-line class-methods-use-this
indicator(shape: IPollShape) {
return <rect width={shape.props.w} height={shape.props.h} />;
}
override onResize: TLOnResizeHandler<IPollShape> = (shape, info) => {
return resizeBox(shape, info);
}
}
export default PollShapeUtil;

View File

@ -1,25 +0,0 @@
// @ts-nocheck
import { defineMigrations } from '@bigbluebutton/tldraw';
// Migrations for the custom poll shape (optional but very helpful)
export const pollShapeMigrations = defineMigrations({
currentVersion: 1,
migrators: {
1: {
// example, removing a property from the shape
up(shape) {
const migratedUpShape = { ...shape };
delete migratedUpShape.somePropertyToRemove;
return migratedUpShape;
},
down(shape) {
const migratedDownShape = { ...shape };
migratedDownShape.somePropertyToRemove = 'some value';
return migratedDownShape;
},
},
},
});
export default pollShapeMigrations;

View File

@ -1,17 +0,0 @@
import { DefaultColorStyle, ShapeProps, T } from '@bigbluebutton/tldraw';
import { IPollShape } from './poll-shape-types';
export const pollShapeProps: ShapeProps<IPollShape> = {
w: T.number,
h: T.number,
color: DefaultColorStyle,
fill: T.string,
question: T.string,
numRespondents: T.number,
numResponders: T.number,
questionText: T.string,
questionType: T.string,
answers: T.any,
};
export default pollShapeProps;

View File

@ -1,21 +0,0 @@
import { TLBaseShape, TLDefaultColorStyle } from '@bigbluebutton/tldraw';
export type IPollShape = TLBaseShape<
'poll',
{
w: number,
h: number,
color: TLDefaultColorStyle,
fill: string,
question: string,
numRespondents: number,
numResponders: number,
questionText: string,
questionType: string,
answers: Array<{
id: number,
key: string,
numVotes: number,
}>,
}
>

View File

@ -9,7 +9,7 @@
"dependencies": {
"@apollo/client": "^3.10.4",
"@babel/runtime": "^7.17.9",
"@bigbluebutton/tldraw": "^2.0.0-alpha.24",
"@bigbluebutton/tldraw": "^2.0.0-alpha.25",
"@browser-bunyan/console-formatted-stream": "^1.8.0",
"@browser-bunyan/console-raw-stream": "^1.8.0",
"@browser-bunyan/server-stream": "^1.8.0",
@ -1978,15 +1978,16 @@
}
},
"node_modules/@bigbluebutton/editor": {
"version": "2.0.0-alpha.23",
"resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.23.tgz",
"integrity": "sha512-PZMYJ+dzBJv/XIVDxhVf/J0z6yAxadCTp26U9TA/2ptR04Y249xN7bOUb+KIuGSbjKrr6QxVLXJdN8RrMo35Fg==",
"version": "2.0.0-alpha.24",
"resolved": "https://registry.npmjs.org/@bigbluebutton/editor/-/editor-2.0.0-alpha.24.tgz",
"integrity": "sha512-bLhnBpuVo3YqtWktPY8I1nZ4A/eZ7WZP9hDfE+BmSc2ZGwAl0TIzzcUQKBoWAkA0I85ir7/Xim3fAZZm2lbK7Q==",
"license": "Apache-2.0",
"dependencies": {
"@bigbluebutton/state": "2.0.0-alpha.20",
"@bigbluebutton/store": "2.0.0-alpha.20",
"@bigbluebutton/tlschema": "2.0.0-alpha.20",
"@bigbluebutton/utils": "2.0.0-alpha.20",
"@bigbluebutton/validate": "2.0.0-alpha.20",
"@bigbluebutton/state": "2.0.0-alpha.21",
"@bigbluebutton/store": "2.0.0-alpha.21",
"@bigbluebutton/tlschema": "2.0.0-alpha.21",
"@bigbluebutton/utils": "2.0.0-alpha.21",
"@bigbluebutton/validate": "2.0.0-alpha.21",
"@types/core-js": "^2.5.5",
"@use-gesture/react": "^10.2.27",
"classnames": "^2.3.2",
@ -2004,40 +2005,47 @@
}
},
"node_modules/@bigbluebutton/editor/node_modules/core-js": {
"version": "3.38.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz",
"integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==",
"version": "3.38.1",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz",
"integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==",
"hasInstallScript": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/@bigbluebutton/state": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.20.tgz",
"integrity": "sha512-NWLlKFPZrznrascQMMALe6wXrlONfb4LBPY/VsDESkVxhDfC1IafbtZ45bI70UjuO7KpM6IqzhSNttZXLdI3og==",
"version": "2.0.0-alpha.21",
"resolved": "https://registry.npmjs.org/@bigbluebutton/state/-/state-2.0.0-alpha.21.tgz",
"integrity": "sha512-yioRXoBWzPtLZdzO0rCxaymfBewDmZ3098F6drncFz++InACBzmaqhZXXkAZFxLtsTwQQi4wL8vw9uYgcES8vA==",
"license": "Apache-2.0",
"dependencies": {
"@testing-library/react": "^16.0.0"
},
"peerDependencies": {
"react": "^18"
}
},
"node_modules/@bigbluebutton/store": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.20.tgz",
"integrity": "sha512-JlUjff+pclpo2SH/4WE8cM7ONPYsCH3YaQcYFHm6AeepnD3SK7eXn8xUBREI56kmeENNsOK2AnYz1smZEb0zpg==",
"version": "2.0.0-alpha.21",
"resolved": "https://registry.npmjs.org/@bigbluebutton/store/-/store-2.0.0-alpha.21.tgz",
"integrity": "sha512-cgBcekfkW0AZMCVCNpopfuGEmlEziqQI1bnUdbOZAA8aWCTG5/WuqM9anknZKccg+Dvfr2d/g2FcCSMKDlUH4w==",
"license": "Apache-2.0",
"dependencies": {
"@bigbluebutton/state": "2.0.0-alpha.20",
"@bigbluebutton/utils": "2.0.0-alpha.20",
"@bigbluebutton/state": "2.0.0-alpha.21",
"@bigbluebutton/utils": "2.0.0-alpha.21",
"lodash.isequal": "^4.5.0",
"nanoid": "4.0.2"
}
},
"node_modules/@bigbluebutton/tldraw": {
"version": "2.0.0-alpha.24",
"resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.24.tgz",
"integrity": "sha512-MCNkpvkd4nqHXA4pfeQwA286CUZkIeQ+CFSAlkT48MBmZsa6de+mg9kKHmeOU0BnK4F/W2BOBHfDYDKrR6T6hw==",
"version": "2.0.0-alpha.25",
"resolved": "https://registry.npmjs.org/@bigbluebutton/tldraw/-/tldraw-2.0.0-alpha.25.tgz",
"integrity": "sha512-0DlcHUOryCxhNmZhvXXJNaOi1N99F00OPJj6HHnTXlf/qAIRFBWJn6o1w288ORRULL6gE9WVG2K7+xuN17zaew==",
"license": "Apache-2.0",
"dependencies": {
"@bigbluebutton/editor": "2.0.0-alpha.23",
"@bigbluebutton/editor": "2.0.0-alpha.24",
"@radix-ui/react-alert-dialog": "^1.0.0",
"@radix-ui/react-context-menu": "^2.1.5",
"@radix-ui/react-dialog": "^1.0.5",
@ -2058,28 +2066,31 @@
}
},
"node_modules/@bigbluebutton/tlschema": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.20.tgz",
"integrity": "sha512-Pl7mhU19zNtUBEE/QkTU1W18Uci+qH8MvYd+p2AlbGRk63uDqULQDWCoQuBSYWvDmmgrlvgOpvB+x3YeFuMnuw==",
"version": "2.0.0-alpha.21",
"resolved": "https://registry.npmjs.org/@bigbluebutton/tlschema/-/tlschema-2.0.0-alpha.21.tgz",
"integrity": "sha512-redk2SmrU8hG0Rwl4cYn8mkp4iqT0Bk3A3pmlqMuI+c0O1r6Ko41C0gviKqfHRlnNqObq5JcYFirxc/UO+L75g==",
"license": "Apache-2.0",
"dependencies": {
"@bigbluebutton/state": "2.0.0-alpha.20",
"@bigbluebutton/store": "2.0.0-alpha.20",
"@bigbluebutton/utils": "2.0.0-alpha.20",
"@bigbluebutton/validate": "2.0.0-alpha.20",
"@bigbluebutton/state": "2.0.0-alpha.21",
"@bigbluebutton/store": "2.0.0-alpha.21",
"@bigbluebutton/utils": "2.0.0-alpha.21",
"@bigbluebutton/validate": "2.0.0-alpha.21",
"nanoid": "4.0.2"
}
},
"node_modules/@bigbluebutton/utils": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.20.tgz",
"integrity": "sha512-ikED5jKof9fDYsx7d75r/b6l6U/qlVTD0tnX/eB7khvZEyrdsmPpxeZeRx3B6nz5XogndupozoWqJCQAlP7nqA=="
"version": "2.0.0-alpha.21",
"resolved": "https://registry.npmjs.org/@bigbluebutton/utils/-/utils-2.0.0-alpha.21.tgz",
"integrity": "sha512-4Cc90N6HJMTdCtk8lm9mTEI6oBF3Sg3b1rWLeSNWCIfCed/lrfilTw80PrskGzznwkWkGbtmFCE9vQmpB6Ppbg==",
"license": "Apache-2.0"
},
"node_modules/@bigbluebutton/validate": {
"version": "2.0.0-alpha.20",
"resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.20.tgz",
"integrity": "sha512-RK3VF1WrLRmOMejcNSTKW0eHs2h3Rxci+LU8AA6373ICSGuviT5HCxGkT9caixMX4+A20wd969nPaCurqoxFDQ==",
"version": "2.0.0-alpha.21",
"resolved": "https://registry.npmjs.org/@bigbluebutton/validate/-/validate-2.0.0-alpha.21.tgz",
"integrity": "sha512-fQ7DBLPVCos1HMCC8KA52Lhm4uRAdg3PCsUuAU+fgHF2sMzuCIinjKX86U1f2MPSZKpbEWeKOIhojQnWErC5tw==",
"license": "Apache-2.0",
"dependencies": {
"@bigbluebutton/utils": "2.0.0-alpha.20"
"@bigbluebutton/utils": "2.0.0-alpha.21"
}
},
"node_modules/@browser-bunyan/console-formatted-stream": {
@ -4338,6 +4349,146 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@testing-library/dom": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
"integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
"@types/aria-query": "^5.0.1",
"aria-query": "5.3.0",
"chalk": "^4.1.0",
"dom-accessibility-api": "^0.5.9",
"lz-string": "^1.5.0",
"pretty-format": "^27.0.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@testing-library/dom/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@testing-library/dom/node_modules/aria-query": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
"integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"dequal": "^2.0.3"
}
},
"node_modules/@testing-library/dom/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"license": "MIT",
"peer": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@testing-library/dom/node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@testing-library/dom/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT",
"peer": true
},
"node_modules/@testing-library/dom/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/dom/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"license": "MIT",
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/react": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz",
"integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@testing-library/dom": "^10.0.0",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"@types/react-dom": {
"optional": true
}
}
},
"node_modules/@types/aria-query": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
"integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
"license": "MIT",
"peer": true
},
"node_modules/@types/body-parser": {
"version": "1.19.5",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
@ -4379,7 +4530,8 @@
"node_modules/@types/core-js": {
"version": "2.5.8",
"resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.8.tgz",
"integrity": "sha512-VgnAj6tIAhJhZdJ8/IpxdatM8G4OD3VWGlp6xIxUGENZlpbob9Ty4VVdC1FIEp0aK6DBscDDjyzy5FB60TuNqg=="
"integrity": "sha512-VgnAj6tIAhJhZdJ8/IpxdatM8G4OD3VWGlp6xIxUGENZlpbob9Ty4VVdC1FIEp0aK6DBscDDjyzy5FB60TuNqg==",
"license": "MIT"
},
"node_modules/@types/d3-array": {
"version": "3.2.1",
@ -4935,12 +5087,14 @@
"node_modules/@use-gesture/core": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz",
"integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="
"integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==",
"license": "MIT"
},
"node_modules/@use-gesture/react": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz",
"integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==",
"license": "MIT",
"dependencies": {
"@use-gesture/core": "10.3.1"
},
@ -5345,7 +5499,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"engines": {
"node": ">=8"
}
@ -7261,6 +7414,13 @@
"node": ">=6.0.0"
}
},
"node_modules/dom-accessibility-api": {
"version": "0.5.16",
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
"integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
"license": "MIT",
"peer": true
},
"node_modules/dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@ -9746,7 +9906,8 @@
"node_modules/idb": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==",
"license": "ISC"
},
"node_modules/ignore": {
"version": "5.3.1",
@ -10952,7 +11113,8 @@
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@ -10962,7 +11124,8 @@
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
"license": "MIT"
},
"node_modules/lodash.truncate": {
"version": "4.4.2",
@ -10973,7 +11136,8 @@
"node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"license": "MIT"
},
"node_modules/log-update": {
"version": "4.0.0",
@ -11813,6 +11977,7 @@
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.js"
},
@ -12925,6 +13090,41 @@
"renderkid": "^3.0.0"
}
},
"node_modules/pretty-format": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
"integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
"react-is": "^17.0.1"
},
"engines": {
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
"node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/pretty-format/node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"license": "MIT",
"peer": true
},
"node_modules/probe-image-size": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz",

View File

@ -38,7 +38,7 @@
"dependencies": {
"@apollo/client": "^3.10.4",
"@babel/runtime": "^7.17.9",
"@bigbluebutton/tldraw": "^2.0.0-alpha.24",
"@bigbluebutton/tldraw": "^2.0.0-alpha.25",
"@browser-bunyan/console-formatted-stream": "^1.8.0",
"@browser-bunyan/console-raw-stream": "^1.8.0",
"@browser-bunyan/server-stream": "^1.8.0",