Whatsapp unlink and channel display fixes

This commit is contained in:
Darren Clarke 2025-11-13 14:04:16 +01:00
parent 2fbe8ac75a
commit b179ae5069
7 changed files with 42 additions and 20 deletions

View file

@ -9,6 +9,7 @@ services:
environment: environment:
PORT: 5000 PORT: 5000
NODE_ENV: production NODE_ENV: production
BRIDGE_FRONTEND_URL: http://link:3000/link
volumes: volumes:
- bridge-whatsapp-data:/home/node/baileys - bridge-whatsapp-data:/home/node/baileys
ports: ports:

View file

@ -22,6 +22,7 @@ x-bridge-vars: &common-bridge-variables
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
BRIDGE_SIGNAL_URL: ${BRIDGE_SIGNAL_URL} BRIDGE_SIGNAL_URL: ${BRIDGE_SIGNAL_URL}
BRIDGE_SIGNAL_AUTO_GROUPS: ${BRIDGE_SIGNAL_AUTO_GROUPS} BRIDGE_SIGNAL_AUTO_GROUPS: ${BRIDGE_SIGNAL_AUTO_GROUPS}
BRIDGE_WHATSAPP_URL: "http://bridge-whatsapp:5000"
LOG_LEVEL: "debug" LOG_LEVEL: "debug"
ZAMMAD_API_TOKEN: ${ZAMMAD_API_TOKEN} ZAMMAD_API_TOKEN: ${ZAMMAD_API_TOKEN}
ZAMMAD_URL: ${ZAMMAD_URL} ZAMMAD_URL: ${ZAMMAD_URL}

View file

@ -16,7 +16,7 @@ services:
LINK_URL: ${LINK_URL} LINK_URL: ${LINK_URL}
BRIDGE_URL: http://bridge-frontend:3000 BRIDGE_URL: http://bridge-frontend:3000
BRIDGE_SIGNAL_URL: http://signal-cli-rest-api:8080 BRIDGE_SIGNAL_URL: http://signal-cli-rest-api:8080
BRIDGE_WHATSAPP_URL: http://bridge-whatsapp:3000 BRIDGE_WHATSAPP_URL: http://bridge-whatsapp:5000
ZAMMAD_URL: http://zammad-nginx:8080 ZAMMAD_URL: http://zammad-nginx:8080
REDIS_URL: "redis://zammad-redis:6379" REDIS_URL: "redis://zammad-redis:6379"
NEXTAUTH_URL: ${LINK_URL}/api/auth NEXTAUTH_URL: ${LINK_URL}/api/auth

View file

@ -29,21 +29,30 @@ export const QRCode: FC<QRCodeProps> = ({
useEffect(() => { useEffect(() => {
if (!verified && getValue && refreshInterval) { if (!verified && getValue && refreshInterval) {
const interval = setInterval(async () => { // Fetch immediately on mount
const fetchQR = async () => {
const { qr, kind } = await getValue(token); const { qr, kind } = await getValue(token);
setValue(qr); setValue(qr);
setKind(kind); setKind(kind);
}, refreshInterval * 1000); };
fetchQR();
// Then set up interval for refreshes
const interval = setInterval(fetchQR, refreshInterval * 1000);
return () => clearInterval(interval); return () => clearInterval(interval);
} }
}, [getValue, refreshInterval]); }, [getValue, refreshInterval, token, verified]);
return !verified ? ( return !verified ? (
<Box sx={{ backgroundColor: white, m: 2 }}> <Box sx={{ backgroundColor: white, m: 2 }}>
{kind === "data" ? ( {value ? (
kind === "data" ? (
<QRCodeInternal value={value} /> <QRCodeInternal value={value} />
) : ( ) : (
<img src={value} alt={name} /> <img src={value} alt={name} />
)
) : (
<Box>Loading QR code...</Box>
)} )}
<Box>{helperText}</Box> <Box>{helperText}</Box>
</Box> </Box>

View file

@ -2,11 +2,28 @@ import { ServiceConfig } from "../lib/service";
// import { generateSelectOneAction } from "../lib/actions"; // import { generateSelectOneAction } from "../lib/actions";
const getQRCode = async (token: string) => { const getQRCode = async (token: string) => {
try {
const url = `/link/api/whatsapp/bots/${token}`; const url = `/link/api/whatsapp/bots/${token}`;
const result = await fetch(url, { cache: "no-store" }); const result = await fetch(url, { cache: "no-store" });
const { qr } = await result.json();
if (!result.ok) {
console.error(`Failed to fetch QR code: ${result.status} ${result.statusText}`);
return { qr: "", kind: "data" };
}
const data = await result.json();
const { qr } = data;
if (!qr) {
console.error("No QR code in response");
return { qr: "", kind: "data" };
}
return { qr, kind: "data" }; return { qr, kind: "data" };
} catch (error) {
console.error("Error fetching QR code:", error);
return { qr: "", kind: "data" };
}
}; };
export const whatsappConfig: ServiceConfig = { export const whatsappConfig: ServiceConfig = {

View file

@ -45,13 +45,6 @@ class CdrWhatsappReply
@articleTypes: (articleTypes, ticket, ui) -> @articleTypes: (articleTypes, ticket, ui) ->
return articleTypes if !ui.permissionCheck('ticket.agent') return articleTypes if !ui.permissionCheck('ticket.agent')
# Check CDR Link allowed channels setting
allowedChannels = ui.Config.get('cdr_link_allowed_channels')
if allowedChannels && allowedChannels.trim()
whitelist = (channel.trim() for channel in allowedChannels.split(','))
# Return early if 'cdr_whatsapp' or 'whatsapp message' not in whitelist
return articleTypes if 'cdr_whatsapp' not in whitelist && 'whatsapp message' not in whitelist
return articleTypes if !ticket || !ticket.create_article_type_id return articleTypes if !ticket || !ticket.create_article_type_id
articleTypeCreate = App.TicketArticleType.find(ticket.create_article_type_id).name articleTypeCreate = App.TicketArticleType.find(ticket.create_article_type_id).name

View file

@ -5,5 +5,6 @@ require '/opt/zammad/config/application'
Rails.application.initialize! Rails.application.initialize!
Setting.set('cdr_link_allowed_channels', 'note,cdr_signal,email') # Reset to default (empty = allow all channels)
puts "Setting 'cdr_link_allowed_channels' has been set to: 'note,cdr_signal,email'" Setting.set('cdr_link_allowed_channels', '')
puts "Setting 'cdr_link_allowed_channels' has been reset to default (empty = allow all channels)"