Merge pull request #1540 from valadaptive/refactor-device-check

Refactor mobile device check
This commit is contained in:
Cohee 2023-12-15 17:01:32 +02:00 committed by GitHub
commit 6c16b94f9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 39 additions and 68 deletions

9
package-lock.json generated
View File

@ -20,7 +20,6 @@
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"csrf-csrf": "^2.2.3", "csrf-csrf": "^2.2.3",
"device-detector-js": "^3.0.3",
"express": "^4.18.2", "express": "^4.18.2",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"google-translate-api-browser": "^3.0.1", "google-translate-api-browser": "^3.0.1",
@ -1777,14 +1776,6 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/device-detector-js": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/device-detector-js/-/device-detector-js-3.0.3.tgz",
"integrity": "sha512-jM89LJAvP6uOd84at8OlD9dWP8KeYCCHUde0RT0HQo/stdoRH4b54Xl/fntx2nEXCmqiFhmo+/cJetS2VGUHPw==",
"engines": {
"node": ">= 8.11.4"
}
},
"node_modules/digest-fetch": { "node_modules/digest-fetch": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz", "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz",

View File

@ -10,7 +10,6 @@
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"csrf-csrf": "^2.2.3", "csrf-csrf": "^2.2.3",
"device-detector-js": "^3.0.3",
"express": "^4.18.2", "express": "^4.18.2",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"google-translate-api-browser": "^3.0.1", "google-translate-api-browser": "^3.0.1",

14
public/lib/bowser.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -169,7 +169,6 @@ import {
import { EventEmitter } from './lib/eventemitter.js'; import { EventEmitter } from './lib/eventemitter.js';
import { markdownExclusionExt } from './scripts/showdown-exclusion.js'; import { markdownExclusionExt } from './scripts/showdown-exclusion.js';
import { NOTE_MODULE_NAME, initAuthorsNote, metadata_keys, setFloatingPrompt, shouldWIAddPrompt } from './scripts/authors-note.js'; import { NOTE_MODULE_NAME, initAuthorsNote, metadata_keys, setFloatingPrompt, shouldWIAddPrompt } from './scripts/authors-note.js';
import { getDeviceInfo } from './scripts/RossAscends-mods.js';
import { registerPromptManagerMigration } from './scripts/PromptManager.js'; import { registerPromptManagerMigration } from './scripts/PromptManager.js';
import { getRegexedString, regex_placement } from './scripts/extensions/regex/engine.js'; import { getRegexedString, regex_placement } from './scripts/extensions/regex/engine.js';
import { FILTER_TYPES, FilterHelper } from './scripts/filters.js'; import { FILTER_TYPES, FilterHelper } from './scripts/filters.js';
@ -6834,8 +6833,7 @@ function openCharacterWorldPopup() {
template.find('.character_name').text(name); template.find('.character_name').text(name);
// Not needed on mobile // Not needed on mobile
const deviceInfo = getDeviceInfo(); if (!isMobile()) {
if (deviceInfo && deviceInfo.device.type === 'desktop') {
$(extraSelect).select2({ $(extraSelect).select2({
width: '100%', width: '100%',
placeholder: 'No auxillary Lorebooks set. Click here to select.', placeholder: 'No auxillary Lorebooks set. Click here to select.',
@ -7812,7 +7810,7 @@ function addDebugFunctions() {
jQuery(async function () { jQuery(async function () {
if (isMobile() === true) { if (isMobile()) {
console.debug('hiding movingUI and sheldWidth toggles for mobile'); console.debug('hiding movingUI and sheldWidth toggles for mobile');
$('#sheldWidthToggleBlock').hide(); $('#sheldWidthToggleBlock').hide();
$('#movingUIModeCheckBlock').hide(); $('#movingUIModeCheckBlock').hide();

View File

@ -36,6 +36,7 @@ import { chat_completion_sources, oai_settings } from './openai.js';
import { getTokenCount } from './tokenizers.js'; import { getTokenCount } from './tokenizers.js';
import { textgen_types, textgenerationwebui_settings as textgen_settings } from './textgen-settings.js'; import { textgen_types, textgenerationwebui_settings as textgen_settings } from './textgen-settings.js';
import Bowser from '../lib/bowser.min.js';
var RPanelPin = document.getElementById('rm_button_panel_pin'); var RPanelPin = document.getElementById('rm_button_panel_pin');
var LPanelPin = document.getElementById('lm_button_panel_pin'); var LPanelPin = document.getElementById('lm_button_panel_pin');
@ -98,43 +99,22 @@ export function humanizeGenTime(total_gen_time) {
return time_spent; return time_spent;
} }
let parsedUA = null;
try {
parsedUA = Bowser.parse(navigator.userAgent);
} catch {
// In case the user agent is an empty string or Bowser can't parse it for some other reason
}
/** /**
* Checks if the device is a mobile device. * Checks if the device is a mobile device.
* @returns {boolean} - True if the device is a mobile device, false otherwise. * @returns {boolean} - True if the device is a mobile device, false otherwise.
*/ */
export function isMobile() { export function isMobile() {
const mobileTypes = ['smartphone', 'tablet', 'phablet', 'feature phone', 'portable media player']; const mobileTypes = ['mobile', 'tablet'];
const deviceInfo = getDeviceInfo();
return mobileTypes.includes(deviceInfo?.device?.type); return mobileTypes.includes(parsedUA?.platform?.type);
}
/**
* Loads device info from the server. Caches the result in sessionStorage.
* @returns {object} - The device info object.
*/
export function getDeviceInfo() {
let deviceInfo = null;
if (sessionStorage.getItem('deviceInfo')) {
deviceInfo = JSON.parse(sessionStorage.getItem('deviceInfo'));
} else {
$.ajax({
url: '/deviceinfo',
dataType: 'json',
async: false,
cache: true,
success: function (result) {
sessionStorage.setItem('deviceInfo', JSON.stringify(result));
deviceInfo = result;
},
error: function () {
console.log('Couldn\'t load device info. Defaulting to desktop');
deviceInfo = { device: { type: 'desktop' } };
},
});
}
return deviceInfo;
} }
function shouldSendOnEnter() { function shouldSendOnEnter() {
@ -431,8 +411,7 @@ function RA_autoconnect(PrevApi) {
} }
function OpenNavPanels() { function OpenNavPanels() {
const deviceInfo = getDeviceInfo(); if (!isMobile()) {
if (deviceInfo && deviceInfo.device.type === 'desktop') {
//auto-open R nav if locked and previously open //auto-open R nav if locked and previously open
if (LoadLocalBool('NavLockOn') == true && LoadLocalBool('NavOpened') == true) { if (LoadLocalBool('NavLockOn') == true && LoadLocalBool('NavOpened') == true) {
//console.log("RA -- clicking right nav to open"); //console.log("RA -- clicking right nav to open");
@ -508,7 +487,7 @@ export function dragElement(elmnt) {
|| Number((String(target.height).replace('px', ''))) < 50 || Number((String(target.height).replace('px', ''))) < 50
|| Number((String(target.width).replace('px', ''))) < 50 || Number((String(target.width).replace('px', ''))) < 50
|| power_user.movingUI === false || power_user.movingUI === false
|| isMobile() === true || isMobile()
) { ) {
console.debug('aborting mutator'); console.debug('aborting mutator');
return; return;
@ -716,7 +695,7 @@ export function dragElement(elmnt) {
} }
export async function initMovingUI() { export async function initMovingUI() {
if (isMobile() === false && power_user.movingUI === true) { if (!isMobile() && power_user.movingUI === true) {
console.debug('START MOVING UI'); console.debug('START MOVING UI');
dragElement($('#sheld')); dragElement($('#sheld'));
dragElement($('#left-nav-panel')); dragElement($('#left-nav-panel'));

View File

@ -9,7 +9,7 @@ import {
} from '../script.js'; } from '../script.js';
import { SECRET_KEYS, writeSecret } from './secrets.js'; import { SECRET_KEYS, writeSecret } from './secrets.js';
import { delay } from './utils.js'; import { delay } from './utils.js';
import { getDeviceInfo } from './RossAscends-mods.js'; import { isMobile } from './RossAscends-mods.js';
import { autoSelectInstructPreset } from './instruct-mode.js'; import { autoSelectInstructPreset } from './instruct-mode.js';
export { export {
@ -303,8 +303,7 @@ jQuery(function () {
$('#horde_kudos').on('click', showKudos); $('#horde_kudos').on('click', showKudos);
// Not needed on mobile // Not needed on mobile
const deviceInfo = getDeviceInfo(); if (!isMobile()) {
if (deviceInfo && deviceInfo.device.type === 'desktop') {
$('#horde_model').select2({ $('#horde_model').select2({
width: '100%', width: '100%',
placeholder: 'Select Horde models', placeholder: 'Select Horde models',

View File

@ -1,5 +1,5 @@
import { setGenerationParamsFromPreset } from '../script.js'; import { setGenerationParamsFromPreset } from '../script.js';
import { getDeviceInfo } from './RossAscends-mods.js'; import { isMobile } from './RossAscends-mods.js';
import { textgenerationwebui_settings as textgen_settings } from './textgen-settings.js'; import { textgenerationwebui_settings as textgen_settings } from './textgen-settings.js';
let models = []; let models = [];
@ -52,8 +52,7 @@ function getMancerModelTemplate(option) {
jQuery(function () { jQuery(function () {
$('#mancer_model').on('change', onMancerModelSelect); $('#mancer_model').on('change', onMancerModelSelect);
const deviceInfo = getDeviceInfo(); if (!isMobile()) {
if (deviceInfo && deviceInfo.device.type === 'desktop') {
$('#mancer_model').select2({ $('#mancer_model').select2({
placeholder: 'Select a model', placeholder: 'Select a model',
searchInputPlaceholder: 'Search models...', searchInputPlaceholder: 'Search models...',

View File

@ -1530,7 +1530,7 @@ async function loadCharListState() {
} }
function loadMovingUIState() { function loadMovingUIState() {
if (isMobile() === false if (!isMobile()
&& power_user.movingUIState && power_user.movingUIState
&& power_user.movingUI === true) { && power_user.movingUI === true) {
console.debug('loading movingUI state'); console.debug('loading movingUI state');

View File

@ -3,7 +3,7 @@ import { download, debounce, initScrollHeight, resetScrollHeight, parseJsonFile,
import { extension_settings, getContext } from './extensions.js'; import { extension_settings, getContext } from './extensions.js';
import { NOTE_MODULE_NAME, metadata_keys, shouldWIAddPrompt } from './authors-note.js'; import { NOTE_MODULE_NAME, metadata_keys, shouldWIAddPrompt } from './authors-note.js';
import { registerSlashCommand } from './slash-commands.js'; import { registerSlashCommand } from './slash-commands.js';
import { getDeviceInfo } from './RossAscends-mods.js'; import { isMobile } from './RossAscends-mods.js';
import { FILTER_TYPES, FilterHelper } from './filters.js'; import { FILTER_TYPES, FilterHelper } from './filters.js';
import { getTokenCount } from './tokenizers.js'; import { getTokenCount } from './tokenizers.js';
import { power_user } from './power-user.js'; import { power_user } from './power-user.js';
@ -896,8 +896,8 @@ function getWorldEntry(name, data, entry) {
const characterFilter = template.find('select[name="characterFilter"]'); const characterFilter = template.find('select[name="characterFilter"]');
characterFilter.data('uid', entry.uid); characterFilter.data('uid', entry.uid);
const deviceInfo = getDeviceInfo();
if (deviceInfo && deviceInfo.device.type === 'desktop') { if (!isMobile()) {
$(characterFilter).select2({ $(characterFilter).select2({
width: '100%', width: '100%',
placeholder: 'All characters will pull from this entry.', placeholder: 'All characters will pull from this entry.',
@ -2551,8 +2551,7 @@ jQuery(() => {
$(document).on('click', '.chat_lorebook_button', assignLorebookToChat); $(document).on('click', '.chat_lorebook_button', assignLorebookToChat);
// Not needed on mobile // Not needed on mobile
const deviceInfo = getDeviceInfo(); if (!isMobile()) {
if (deviceInfo && deviceInfo.device.type === 'desktop') {
$('#world_info').select2({ $('#world_info').select2({
width: '100%', width: '100%',
placeholder: 'No Worlds active. Click here to select.', placeholder: 'No Worlds active. Click here to select.',

View File

@ -27,7 +27,6 @@ const responseTime = require('response-time');
// net related library imports // net related library imports
const net = require('net'); const net = require('net');
const dns = require('dns'); const dns = require('dns');
const DeviceDetector = require('device-detector-js');
const fetch = require('node-fetch').default; const fetch = require('node-fetch').default;
const ipaddr = require('ipaddr.js'); const ipaddr = require('ipaddr.js');
const ipMatching = require('ip-matching'); const ipMatching = require('ip-matching');
@ -288,12 +287,6 @@ app.use(multer({ dest: UPLOADS_PATH, limits: { fieldSize: 10 * 1024 * 1024 } }).
app.get('/', function (request, response) { app.get('/', function (request, response) {
response.sendFile(process.cwd() + '/public/index.html'); response.sendFile(process.cwd() + '/public/index.html');
}); });
app.get('/deviceinfo', function (request, response) {
const userAgent = request.header('user-agent');
const deviceDetector = new DeviceDetector();
const deviceInfo = deviceDetector.parse(userAgent || '');
return response.send(deviceInfo);
});
app.get('/version', async function (_, response) { app.get('/version', async function (_, response) {
const data = await getVersion(); const data = await getVersion();
response.send(data); response.send(data);