Files
WPS3Media/ui/pro/stores.js
Malin dec5ad7f2d feat: remove licensing system and bump version to 4.0.0-cloudhost
- Remove AS3CF_Pro_Licences_Updates instantiation and all $this->licence
  references from the PHP backend; stub methods return safe defaults
  (is_valid_licence → true, is_licence_over_media_limit → false,
  feature_enabled → true, is_pro_plugin_setup bypasses licence check)
- Remove Licences REST API endpoint from add_api_endpoints()
- Remove 'licence' from allowed settings keys
- Bump version from 3.2.12 to 4.0.0-cloudhost in version.php and plugin header
- Replace licence derived store with hardcoded always-valid writable store
- Simplify enableAssets store to depend only on config.assets_settings
- Remove licence panel row from Nav flyout; remove licence check from
  offload remaining button disabled logic
- Replace Header licence display with "Internal Build" label
- Remove LicencePage route registration from pages.js; drop licence
  import and is_valid guards from all isNextRoute functions
- Rebuild compiled Svelte bundle

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-03 12:57:35 +01:00

239 lines
6.9 KiB
JavaScript

import {derived, get, writable} from "svelte/store";
import {api, config, state} from "../js/stores";
import {objectsDiffer} from "../js/objectsDiffer";
// Hardcoded always-valid licence for internal build (licensing removed).
export const licence = writable( { is_set: true, is_valid: true, plan_plus_licence: 'Internal Build', customer: '', plan_usage: '', limit_info: { counts_toward_limit: false, total: 0, limit: 0 } } );
// Convenience readable store of offload remaining with count message, derived from config.
export const offloadRemainingWithCount = derived( config, $config => $config.offload_remaining_with_count );
// Convenience readable store of documentation, derived from config.
export const documentation = derived( config, $config => $config.documentation );
/*
* Tools.
*/
// Whether tools are locked due to background activity such as upgrade.
export const toolsLocked = writable( false );
// Keeps track of the currently running background tool.
export const running = writable( "" );
const toolIcons = {
"add-metadata": "offload",
"reverse-add-metadata": "analyzerepair",
"verify-add-metadata": "analyzerepair",
"copy-buckets": "move",
"download-and-remover": "remove",
"downloader": "download",
"elementor-analyze-and-repair": "analyzerepair",
"move-objects": "move",
"move-private-objects": "move",
"move-public-objects": "move",
"remove-local-files": "clean",
"update-acls": "analyzerepair",
"uploader": "offload",
"woocommerce-product-urls": "analyzerepair",
};
/**
* Creates store of tools info and API access methods.
*
* @return {Object}
*/
function createTools() {
const { subscribe, set, update } = writable( {} );
return {
subscribe,
set,
async action( tool, action ) {
state.pausePeriodicFetch();
// Set the status text to the default busy description
// until the API returns a calculated status description.
tool.status_description = tool.busy_description;
tool.short_status_description = tool.busy_description;
// Ensure all subscribers know the tool status is changing.
update( _tools => {
_tools[ tool.id ] = tool;
return _tools;
} );
let result = {};
const json = await api.put( "tools", {
id: tool.id,
action: action
} );
if ( json.hasOwnProperty( "ok" ) ) {
result = json;
}
await state.resumePeriodicFetch();
return result;
},
async start( tool ) {
// Ensure all subscribers know that a tool is running.
running.update( _running => tool.id );
tool.is_queued = true;
return await this.action( tool, "start" );
},
async cancel( tool ) {
tool.is_cancelled = true;
return await this.action( tool, "cancel" );
},
async pauseResume( tool ) {
tool.is_paused = !tool.is_paused;
return await this.action( tool, "pause_resume" );
},
updateTools( json ) {
if ( json.hasOwnProperty( "tools" ) ) {
// Update our understanding of what the server's tools status is.
update( _tools => {
return { ...json.tools };
} );
// Update our understanding of the currently running tool.
const runningTool = Object.values( json.tools ).find( ( tool ) => tool.is_processing || tool.is_queued || tool.is_paused || tool.is_cancelled );
if ( runningTool ) {
running.update( _running => runningTool.id );
} else {
running.update( _running => "" );
}
}
},
icon( tool, isRunning, animated ) {
let icon = "tool-generic";
let type = "default";
if ( isRunning ) {
if ( tool.is_paused ) {
type = "paused";
} else if ( animated ) {
type = "running-animated";
} else {
type = "active";
}
}
if ( tool && tool.hasOwnProperty( "slug" ) && toolIcons.hasOwnProperty( tool.slug ) ) {
icon = "tool-" + toolIcons[ tool.slug ];
}
if ( ["active", "default", "paused", "running-animated"].includes( type ) ) {
icon = icon + "-" + type + ".svg";
} else {
icon = icon + "-default.svg";
}
return icon;
}
};
}
export const tools = createTools();
/*
* Assets.
*/
// Does the app need a page refresh to resolve conflicts?
export const assetsNeedsRefresh = writable( false );
// Whether assets settings are locked due to background activity such as upgrade.
export const assetsSettingsLocked = writable( false );
// Convenience readable store of server's assets settings, derived from config.
export const currentAssetsSettings = derived( config, $config => $config.assets_settings );
// Convenience readable store of defined assets settings keys, derived from config.
export const assetsDefinedSettings = derived( config, $config => $config.assets_defined_settings );
// Convenience readable store of assets domain check info, derived from config.
export const assetsDomainCheck = derived( config, $config => $config.assets_domain_check );
// Assets functionality always enabled in internal build.
export const enableAssets = derived( config, $config => $config.hasOwnProperty( "assets_settings" ) );
/**
* Creates store of assets settings.
*
* @return {Object}
*/
function createAssetsSettings() {
const { subscribe, set, update } = writable( [] );
return {
subscribe,
set,
async save() {
const json = await api.put( "assets-settings", get( this ) );
if ( json.hasOwnProperty( "saved" ) && true === json.saved ) {
// Sync settings with what the server has.
this.updateSettings( json );
return json;
}
return {};
},
reset() {
set( { ...get( currentAssetsSettings ) } );
},
async fetch() {
const json = await api.get( "assets-settings", {} );
this.updateSettings( json );
},
updateSettings( json ) {
if (
json.hasOwnProperty( "assets_defined_settings" ) &&
json.hasOwnProperty( "assets_settings" )
) {
const dirty = get( assetsSettingsChanged );
const previousSettings = { ...get( currentAssetsSettings ) }; // cloned
// Update our understanding of what the server's settings are.
config.update( _config => {
return {
..._config,
assets_defined_settings: json.assets_defined_settings,
assets_settings: json.assets_settings,
};
} );
// No need to check for changes from state if we've just saved these settings.
if ( json.hasOwnProperty( "saved" ) && true === json.saved ) {
return;
}
// If the settings weren't changed before, they shouldn't be now.
if ( !dirty && get( assetsSettingsChanged ) ) {
assetsSettings.reset();
}
// If settings are in middle of being changed when changes come in
// from server, reset to server version.
if ( dirty && objectsDiffer( [previousSettings, get( currentAssetsSettings )] ) ) {
assetsNeedsRefresh.update( _needsRefresh => true );
assetsSettings.reset();
}
}
}
};
}
export const assetsSettings = createAssetsSettings();
// Have the assets settings been changed from current server side settings?
export const assetsSettingsChanged = derived( [assetsSettings, currentAssetsSettings], objectsDiffer );