Files
christianandClaude Opus 5 96ac2dec2d Band Lineup Display, the backstage app itself
The Electron app that runs on the backstage PC: stage lineup photos with
mic/pack labels, packaged for Windows. It also carries the ProPresenter
Now/Next feature in two forms that share one engine — propresenter-core, where
every ProPresenter 7/20 quirk lives, and propresenter-app, the standalone
display it serves.

Until now this existed only on the production machine and as a read-only
snapshot inside the ProdDash repo. Source only: the 231 MB dist/ is build
output, and credentials, photos and processed images are written to the
Electron userData directory, never here. tmp/pp-mock.js stays — it is the
ProPresenter mock ProdDash's own CLAUDE.md tells people to run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 15:41:21 -04:00

40 lines
2.0 KiB
JavaScript

const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('lineup', {
addImagesDialog: () => ipcRenderer.invoke('add-images-dialog'),
addImagesPaths: (paths) => ipcRenderer.invoke('add-images-paths', paths),
loadState: () => ipcRenderer.invoke('load-state'),
saveState: (payload) => ipcRenderer.invoke('save-state', payload),
deleteLibraryImage: (fileName) => ipcRenderer.invoke('delete-library-image', fileName),
imageUrl: (fileName) => ipcRenderer.invoke('image-url', fileName),
parallaxAssets: (fileName) => ipcRenderer.invoke('parallax-assets', fileName),
pcoStatus: () => ipcRenderer.invoke('pco-status'),
pcoConnect: (payload) => ipcRenderer.invoke('pco-connect', payload),
pcoDisconnect: () => ipcRenderer.invoke('pco-disconnect'),
pcoServiceTypes: () => ipcRenderer.invoke('pco-service-types'),
pcoPositionOptions: (serviceTypeId) => ipcRenderer.invoke('pco-position-options', serviceTypeId),
pcoSyncUpcomingPlan: (payload) => ipcRenderer.invoke('pco-sync-upcoming-plan', payload),
pcoTestBirthdays: () => ipcRenderer.invoke('pco-test-birthdays'),
onMenuAddPhotos: (cb) => {
ipcRenderer.on('menu-add-photos', () => cb());
},
appVersion: () => ipcRenderer.invoke('app-version'),
display: {
status: () => ipcRenderer.invoke('display-status'),
setEnabled: (enabled) => ipcRenderer.invoke('display-set-enabled', enabled),
setPort: (port) => ipcRenderer.invoke('display-set-port', port),
copyUrl: (url) => ipcRenderer.invoke('display-copy-url', url),
},
proPresenter: {
status: () => ipcRenderer.invoke('pp-status'),
connect: (payload) => ipcRenderer.invoke('pp-connect', payload),
disconnect: () => ipcRenderer.invoke('pp-disconnect'),
start: () => ipcRenderer.invoke('pp-start'),
listPlaylists: () => ipcRenderer.invoke('pp-playlists'),
selectPlaylist: (payload) => ipcRenderer.invoke('pp-select-playlist', payload),
onData: (cb) => {
ipcRenderer.on('pp-data', (_event, data) => cb(data));
},
},
});