InboxZone: a PixiJS Container positioned at (-500,-500) with a

dashed border and "Inbox" label. Auto-synced media slides in with
spring animations and random offset/rotation for a natural look.

MattermostImport: modal dialog for pulling images from a MM thread
URL and managing linked channels for auto-sync. Uses the existing
dark modal styling pattern from ShortcutsHelp.

Editor wiring: toolbar button for MM import, InboxZone added to
viewport on init, socket listener for board:media-arrived events
that routes assets into the InboxZone with a toast notification.
This commit is contained in:
Hiren Kangad
2026-03-09 23:36:04 +05:30
parent 51afce9674
commit 21b2a433c7
4 changed files with 566 additions and 0 deletions
+12
View File
@@ -30,6 +30,7 @@ interface ToolbarProps {
onToggleLayers?: () => void;
showLayers?: boolean;
onToggleHelp?: () => void;
onMmImport?: () => void;
boardName?: string;
}
@@ -142,6 +143,7 @@ export default function Toolbar({
onToggleLayers,
showLayers,
onToggleHelp,
onMmImport,
}: ToolbarProps) {
const showStroke = activeTool === ToolType.PEN;
const showFontSize = activeTool === ToolType.TEXT;
@@ -281,6 +283,16 @@ export default function Toolbar({
</ActionBtn>
)}
{/* Mattermost import */}
{onMmImport && (
<ActionBtn onClick={onMmImport} title="Import from Mattermost">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3">
<path d="M2 10V4a2 2 0 012-2h6a2 2 0 012 2v6a2 2 0 01-2 2H4a2 2 0 01-2-2z" />
<path d="M5 7h4M7 5v4" strokeLinecap="round" />
</svg>
</ActionBtn>
)}
{/* Spacer */}
<div style={{ flex: 1 }} />