From 0bf905f81fd0bf6f7e24817c7c36e096f6364aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enes=20Yak=C4=B1=C5=9Ft=C4=B1r?= Date: Fri, 4 Sep 2026 07:32:05 +0300 Subject: [PATCH] fix(search-history): reliable cross-session sync with auth server and safe logout session clearing --- client.js | 131 +++++++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/client.js b/client.js index dfa5d58..6e58c65 100644 --- a/client.js +++ b/client.js @@ -172,10 +172,7 @@ try { var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username'); if (hasToken) { console.log('[YakTube] YakNet session ended elsewhere. Clearing YakTube...'); - try { - localStorage.clear(); - sessionStorage.clear(); - } catch (e) {} + clearYakTubeAuthSession(); window.location.reload(); } } @@ -198,20 +195,32 @@ try { } else if (e.detail && e.detail.authenticated === false) { var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username'); if (hasToken) { - try { - localStorage.clear(); - sessionStorage.clear(); - } catch (err) {} + clearYakTubeAuthSession(); window.location.reload(); } } }); + // Clear YakTube auth session and cloud search cache safely + function clearYakTubeAuthSession() { + try { + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); + localStorage.removeItem('token_type'); + localStorage.removeItem('id'); + localStorage.removeItem('username'); + localStorage.removeItem('displayName'); + localStorage.removeItem('email'); + localStorage.removeItem('role'); + localStorage.removeItem('yaktube_recent_searches'); + sessionStorage.clear(); + } catch (e) {} + } + // Unified single sign-out for YakTube and YakNet function performUnifiedLogout() { + clearYakTubeAuthSession(); try { - localStorage.clear(); - sessionStorage.clear(); sessionStorage.setItem('yaknet_manual_logout', 'true'); } catch (err) {} window.location.replace( @@ -2005,37 +2014,69 @@ try { } catch (e) {} // Default initial recent searches for first-time visitors var defaults = ['Tarkan', 'Barış Manço', 'Yapay Zeka', 'Canlı Haber']; - try { - localStorage.setItem('yaktube_recent_searches', JSON.stringify(defaults)); - } catch (e) {} + if (!isUserLoggedIn()) { + try { + localStorage.setItem('yaktube_recent_searches', JSON.stringify(defaults)); + } catch (e) {} + } return defaults; } + function callCloudSearchHistory(method, queryParams, body, onSuccess, onError) { + var token = localStorage.getItem('access_token'); + var email = localStorage.getItem('email'); + var headers = {}; + if (body) headers['Content-Type'] = 'application/json'; + if (token) headers['Authorization'] = 'Bearer ' + token; + if (email) headers['X-User-Email'] = email; + + var authUrl = 'https://auth.yakhub.com.tr/api/yaktube/search-history' + (queryParams || ''); + var bridgeUrl = '/api-custom/search-history' + (queryParams || ''); + + var options = { + method: method, + headers: headers, + credentials: 'include' + }; + if (body) options.body = JSON.stringify(body); + + fetch(authUrl, options) + .then(function (res) { + if (!res.ok) throw new Error('Auth server status ' + res.status); + return res.json(); + }) + .then(function (data) { + if (typeof onSuccess === 'function') onSuccess(data); + }) + .catch(function () { + // Fallback to local PeerTube bridge proxy + fetch(bridgeUrl, options) + .then(function (res) { return res.json(); }) + .then(function (data) { + if (typeof onSuccess === 'function') onSuccess(data); + }) + .catch(function (e) { + if (typeof onError === 'function') onError(e); + }); + }); + } + var isSyncingHistory = false; function syncCloudSearchHistory(callback) { if (!isAccountSyncEnabled() || isSyncingHistory) return; isSyncingHistory = true; - var token = localStorage.getItem('access_token'); - var headers = {}; - if (token) headers['Authorization'] = 'Bearer ' + token; - - fetch('/api-custom/search-history', { - method: 'GET', - headers: headers, - credentials: 'include' - }) - .then(function (res) { return res.json(); }) - .then(function (data) { - isSyncingHistory = false; - if (data && data.status === 'success' && Array.isArray(data.history) && data.history.length > 0) { + callCloudSearchHistory('GET', '', null, function (data) { + isSyncingHistory = false; + if (data && data.status === 'success' && Array.isArray(data.history)) { + if (data.history.length > 0) { localStorage.setItem('yaktube_recent_searches', JSON.stringify(data.history)); - if (typeof callback === 'function') callback(); } - }) - .catch(function () { - isSyncingHistory = false; - }); + if (typeof callback === 'function') callback(); + } + }, function () { + isSyncingHistory = false; + }); } function saveRecentSearch(query) { @@ -2053,16 +2094,7 @@ try { // If user is logged in and sync is active, sync with YakNet account if (isAccountSyncEnabled()) { - var token = localStorage.getItem('access_token'); - var headers = { 'Content-Type': 'application/json' }; - if (token) headers['Authorization'] = 'Bearer ' + token; - - fetch('/api-custom/search-history', { - method: 'POST', - headers: headers, - credentials: 'include', - body: JSON.stringify({ query: q }) - }).catch(function () {}); + callCloudSearchHistory('POST', '', { query: q, device_name: 'YakTube Web' }); } } @@ -2072,15 +2104,7 @@ try { } catch (e) {} if (isAccountSyncEnabled()) { - var token = localStorage.getItem('access_token'); - var headers = { 'Content-Type': 'application/json' }; - if (token) headers['Authorization'] = 'Bearer ' + token; - - fetch('/api-custom/search-history', { - method: 'DELETE', - headers: headers, - credentials: 'include' - }).catch(function () {}); + callCloudSearchHistory('DELETE', '', null); } renderDynamicSearchChips(); @@ -2611,6 +2635,13 @@ try { } }); + // Automatically trigger cloud search history pull on startup if logged in + try { + if (isAccountSyncEnabled()) { + syncCloudSearchHistory(); + } + } catch (e) {} + // 7.5. Reactive Hybrid Related Videos Engine (Watch Page) var currentActiveVideoKey = null; var isFetchingRelated = false; diff --git a/package.json b/package.json index f674cd8..051692c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "peertube-plugin-yaktube-ondemand", - "version": "1.4.25", + "version": "1.4.26", "description": "Accessible On-Demand YouTube Import, Live Streams, Smart Recommendations and A11y Engine for PeerTube", "main": "main.js", "library": "./main.js",