[object Object]

← back to Marketing Command Center

chore: lint + refactor + v1.6.0 (session close — reel/FB-page picker hardening)

540ae08e4c1b3347eb6ac7f964c2e53318b70e92 · 2026-07-20 13:21:47 -0700 · Steve

Files touched

Diff

commit 540ae08e4c1b3347eb6ac7f964c2e53318b70e92
Author: Steve <steve@designerwallcoverings.com>
Date:   Mon Jul 20 13:21:47 2026 -0700

    chore: lint + refactor + v1.6.0 (session close — reel/FB-page picker hardening)
---
 modules/channels/index.js | 4 +++-
 modules/composer/index.js | 1 +
 package-lock.json         | 4 ++--
 package.json              | 2 +-
 public/panels/composer.js | 2 +-
 5 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/modules/channels/index.js b/modules/channels/index.js
index 2776c9d..f42041e 100644
--- a/modules/channels/index.js
+++ b/modules/channels/index.js
@@ -379,7 +379,9 @@ async function postFacebook(content, opts = {}) {
     if (!targets.length) return [{ ok: false, error: 'selected Pages not in cache — click ↻ refresh on the Pages picker' }];
   } else {
     const token = env('FB_PAGE_ACCESS_TOKEN');
-    targets = env('FB_PAGE_IDS').split(',').map(s => s.trim()).filter(Boolean).map(id => ({ id, token, name: id }));
+    const ids = env('FB_PAGE_IDS');
+    if (!ids) return [{ ok: false, error: 'No Facebook Page selected and FB_PAGE_IDS not configured' }];
+    targets = ids.split(',').map(s => s.trim()).filter(Boolean).map(id => ({ id, token, name: id }));
   }
   const results = [];
   for (const t of targets) {
diff --git a/modules/composer/index.js b/modules/composer/index.js
index 61f8bf5..12ce7ab 100644
--- a/modules/composer/index.js
+++ b/modules/composer/index.js
@@ -51,6 +51,7 @@ module.exports = {
     // stays snappy. Each carries a public .mp4 URL Meta/Bluesky can fetch.
     router.get('/reels', (_req, res) => {
       const { path: manPath, reels } = readReelsManifest();
+      // cap at 40 so the picker stays snappy (more than enough for a scroll)
       const list = (Array.isArray(reels) ? reels : (reels.reels || [])).slice(0, 40).map(r => ({
         file: r.file,
         url: `${REELS_PUBLIC_BASE}/reels/${encodeURIComponent(r.file)}`,
diff --git a/package-lock.json b/package-lock.json
index 8636f60..500ad98 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "marketing-command-center",
-  "version": "1.5.0",
+  "version": "1.6.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "marketing-command-center",
-      "version": "1.5.0",
+      "version": "1.6.0",
       "dependencies": {
         "express": "^4.22.2",
         "pg": "^8.22.0"
diff --git a/package.json b/package.json
index 7046b77..83c5f9e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "marketing-command-center",
-  "version": "1.5.0",
+  "version": "1.6.0",
   "description": "DW Marketing Command Center — Constant Contact, marketing calendar, suggested copy, on-demand layouts",
   "main": "server.js",
   "scripts": {
diff --git a/public/panels/composer.js b/public/panels/composer.js
index b05b3a9..90366af 100644
--- a/public/panels/composer.js
+++ b/public/panels/composer.js
@@ -141,7 +141,7 @@ window.MCC_PANELS['composer'] = {
       state.videoUrl = r.url; state.mediaUrl = '';
       const img = $('#cmp-img'); img.style.display = 'none';
       const bf = $('#cmp-banner'); if (bf) bf.style.display = 'none';
-      const v = $('#cmp-video'); v.src = r.url; v.style.display = 'block';
+      const v = $('#cmp-video'); if (v) { v.src = r.url; v.style.display = 'block'; }   // guard: mirror select()
       $('#cmp-preview').querySelector('.cmp-ph').style.display = 'none';
       // seed the reel's own caption when the box is empty (keeps media + copy aligned)
       if (r.caption && !$('#cmp-caption').value.trim()) { $('#cmp-caption').value = r.caption; countIt(); }

← 97dcfe7 Composer: add reel/story asset picker + Facebook Page select  ·  back to Marketing Command Center  ·  calendars: filter Schumacher (internal-only) out of both cal 5ea8d24 →