Опрос списка тикетов для has_unread; настройка tickets_poll_ms

This commit is contained in:
root
2026-05-14 13:18:57 +00:00
parent 325d258bf4
commit b62c1bb7f3
4 changed files with 24 additions and 15 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<name>f7support</name> <name>f7support</name>
<summary>Support ticket client for F7cloud (F7cloud-compatible)</summary> <summary>Support ticket client for F7cloud (F7cloud-compatible)</summary>
<description>f7support client app for creating and viewing support tickets.</description> <description>f7support client app for creating and viewing support tickets.</description>
<version>0.1.3</version> <version>0.1.6</version>
<licence>AGPL</licence> <licence>AGPL</licence>
<author>f7support team</author> <author>f7support team</author>
<namespace>F7Support</namespace> <namespace>F7Support</namespace>
+9 -5
View File
@@ -8,11 +8,14 @@
const supportWsBaseOverride = (root.dataset.supportWsBase || "").trim(); const supportWsBaseOverride = (root.dataset.supportWsBase || "").trim();
/** Включается в NC: `occ config:app:set f7support client_read_receipts --value=1` после выката API `POST .../read`. */ /** Включается в NC: `occ config:app:set f7support client_read_receipts --value=1` после выката API `POST .../read`. */
const clientReadReceiptsEnabled = root.dataset.clientReadReceipts === "1"; const clientReadReceiptsEnabled = root.dataset.clientReadReceipts === "1";
const ticketsPollIntervalMs = (() => { const ticketsPollMsRaw = parseInt(
const n = parseInt(String(root.dataset.messagesPollMs || "3000"), 10); String(root.dataset.ticketsPollMs || root.dataset.messagesPollMs || "").trim(),
if (!Number.isFinite(n)) return 3000; 10
return Math.min(120000, Math.max(3000, n)); );
})(); const ticketsPollMsParsed = Number.isFinite(ticketsPollMsRaw) && ticketsPollMsRaw >= 0 ? ticketsPollMsRaw : 3000;
/** Интервал опроса GET /api/client/tickets (мс). 0 — выключить. Иначе 3000…120000. WebSocket только у открытого тикета; без опроса зелёная точка по другим тикетам не обновится. Устаревшее имя: data-messages-poll-ms. */
const ticketsPollIntervalMs =
ticketsPollMsParsed === 0 ? 0 : Math.min(120000, Math.max(3000, ticketsPollMsParsed));
const RASTER_IMAGE_EXT = new Set(["jpg", "jpeg", "png", "gif", "webp", "bmp", "tif", "tiff", "heic", "heif"]); const RASTER_IMAGE_EXT = new Set(["jpg", "jpeg", "png", "gif", "webp", "bmp", "tif", "tiff", "heic", "heif"]);
const RASTER_IMAGE_MIME = new Set([ const RASTER_IMAGE_MIME = new Set([
@@ -769,6 +772,7 @@
clearInterval(state.ticketsPollTimer); clearInterval(state.ticketsPollTimer);
state.ticketsPollTimer = null; state.ticketsPollTimer = null;
} }
if (ticketsPollIntervalMs === 0) return;
state.ticketsPollTimer = window.setInterval(() => { state.ticketsPollTimer = window.setInterval(() => {
if (document.visibilityState === "hidden") return; if (document.visibilityState === "hidden") return;
fetchTickets().catch(() => {}); fetchTickets().catch(() => {});
+13 -8
View File
@@ -50,13 +50,18 @@ class PageController extends Controller {
// Отключить вызовы с клиента: occ config:app:set f7support client_read_receipts --value=0 // Отключить вызовы с клиента: occ config:app:set f7support client_read_receipts --value=0
$clientReadReceipts = $this->config->getAppValue('f7support', 'client_read_receipts', '0'); $clientReadReceipts = $this->config->getAppValue('f7support', 'client_read_receipts', '0');
// Интервал опроса списка тикетов (мс), чтобы подтягивать has_unread без WebSocket. occ: f7support tickets_poll_ms // Периодический GET /api/client/tickets (мс): has_unread и отпечаток карточки; WebSocket только у открытого тикета.
$ticketsPollMs = (int)$this->config->getAppValue('f7support', 'tickets_poll_ms', '3000'); // 0 — отключить опрос. Иначе значение ограничивается 3000…120000. occ: f7support tickets_poll_ms
if ($ticketsPollMs < 3000) { $ticketsPollMs = (int) $this->config->getAppValue('f7support', 'tickets_poll_ms', '3000');
$ticketsPollMs = 3000; if ($ticketsPollMs < 0) {
} $ticketsPollMs = 0;
if ($ticketsPollMs > 120000) { } elseif ($ticketsPollMs > 0) {
$ticketsPollMs = 120000; if ($ticketsPollMs < 3000) {
$ticketsPollMs = 3000;
}
if ($ticketsPollMs > 120000) {
$ticketsPollMs = 120000;
}
} }
Util::addStyle('f7support', 'f7support'); Util::addStyle('f7support', 'f7support');
@@ -69,7 +74,7 @@ class PageController extends Controller {
'supportApiOrigin' => $supportApiOrigin, 'supportApiOrigin' => $supportApiOrigin,
'supportWsBase' => $supportWsBase, 'supportWsBase' => $supportWsBase,
'clientReadReceipts' => $clientReadReceipts, 'clientReadReceipts' => $clientReadReceipts,
'ticketsPollMs' => (string)$ticketsPollMs, 'ticketsPollMs' => (string) $ticketsPollMs,
]); ]);
} }
} }
+1 -1
View File
@@ -6,5 +6,5 @@
data-support-api-base="<?php p($_['supportApiBase']); ?>" data-support-api-base="<?php p($_['supportApiBase']); ?>"
data-support-ws-base="<?php p($_['supportWsBase'] ?? ''); ?>" data-support-ws-base="<?php p($_['supportWsBase'] ?? ''); ?>"
data-client-read-receipts="<?php p($_['clientReadReceipts'] ?? '0'); ?>" data-client-read-receipts="<?php p($_['clientReadReceipts'] ?? '0'); ?>"
data-messages-poll-ms="<?php p($_['ticketsPollMs'] ?? '3000'); ?>"> data-tickets-poll-ms="<?php p((string) ($_['ticketsPollMs'] ?? 3000)); ?>">
</div> </div>