2021-10-15 05:20:02 +02:00
|
|
|
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
|
|
|
import {OsmConnection} from "../Osm/OsmConnection";
|
|
|
|
import {MangroveIdentity} from "../Web/MangroveReviews";
|
2022-06-05 02:24:14 +02:00
|
|
|
import {Store, UIEventSource} from "../UIEventSource";
|
2021-10-15 05:20:02 +02:00
|
|
|
import {QueryParameters} from "../Web/QueryParameters";
|
|
|
|
import {LocalStorageSource} from "../Web/LocalStorageSource";
|
|
|
|
import {Utils} from "../../Utils";
|
|
|
|
import Locale from "../../UI/i18n/Locale";
|
|
|
|
import ElementsState from "./ElementsState";
|
|
|
|
import SelectedElementTagsUpdater from "../Actors/SelectedElementTagsUpdater";
|
2022-02-16 01:46:55 +01:00
|
|
|
import {Changes} from "../Osm/Changes";
|
|
|
|
import ChangeToElementsActor from "../Actors/ChangeToElementsActor";
|
|
|
|
import PendingChangesUploader from "../Actors/PendingChangesUploader";
|
2022-04-01 12:51:55 +02:00
|
|
|
import * as translators from "../../assets/translators.json"
|
2022-06-21 18:22:09 +02:00
|
|
|
import {post} from "jquery";
|
2022-04-01 12:51:55 +02:00
|
|
|
|
2021-10-15 05:20:02 +02:00
|
|
|
/**
|
|
|
|
* The part of the state which keeps track of user-related stuff, e.g. the OSM-connection,
|
|
|
|
* which layers they enabled, ...
|
|
|
|
*/
|
|
|
|
export default class UserRelatedState extends ElementsState {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
The user credentials
|
|
|
|
*/
|
|
|
|
public osmConnection: OsmConnection;
|
2022-02-16 01:46:55 +01:00
|
|
|
/**
|
|
|
|
THe change handler
|
|
|
|
*/
|
|
|
|
public changes: Changes;
|
2021-10-15 05:20:02 +02:00
|
|
|
/**
|
|
|
|
* The key for mangrove
|
|
|
|
*/
|
|
|
|
public mangroveIdentity: MangroveIdentity;
|
|
|
|
/**
|
|
|
|
* Which layers are enabled in the personal theme
|
|
|
|
*/
|
|
|
|
public favouriteLayers: UIEventSource<string[]>;
|
|
|
|
|
2022-06-05 02:24:14 +02:00
|
|
|
public readonly isTranslator : Store<boolean>;
|
2022-04-01 12:51:55 +02:00
|
|
|
|
2022-06-21 18:22:09 +02:00
|
|
|
public readonly installedUserThemes: UIEventSource<string[]>
|
|
|
|
|
2022-01-25 00:46:57 +01:00
|
|
|
constructor(layoutToUse: LayoutConfig, options?: { attemptLogin: true | boolean }) {
|
2021-10-15 05:20:02 +02:00
|
|
|
super(layoutToUse);
|
|
|
|
|
|
|
|
this.osmConnection = new OsmConnection({
|
2022-01-21 01:57:16 +01:00
|
|
|
dryRun: this.featureSwitchIsTesting,
|
2021-10-15 05:20:02 +02:00
|
|
|
fakeUser: this.featureSwitchFakeUser.data,
|
|
|
|
oauth_token: QueryParameters.GetQueryParameter(
|
|
|
|
"oauth_token",
|
|
|
|
undefined,
|
|
|
|
"Used to complete the login"
|
|
|
|
),
|
2021-12-13 02:05:34 +01:00
|
|
|
osmConfiguration: <'osm' | 'osm-test'>this.featureSwitchApiURL.data,
|
|
|
|
attemptLogin: options?.attemptLogin
|
2021-10-15 05:20:02 +02:00
|
|
|
})
|
2022-06-05 02:24:14 +02:00
|
|
|
const translationMode = this.osmConnection.GetPreference("translation-mode").sync(str => str === undefined ? undefined : str === "true", [], b => b === undefined ? undefined : b+"")
|
2022-05-06 12:41:24 +02:00
|
|
|
|
|
|
|
translationMode.syncWith(Locale.showLinkToWeblate)
|
|
|
|
|
2022-04-01 12:51:55 +02:00
|
|
|
this.isTranslator = this.osmConnection.userDetails.map(ud => {
|
|
|
|
if(!ud.loggedIn){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
const name= ud.name.toLowerCase().replace(/\s+/g, '')
|
|
|
|
return translators.contributors.some(c => c.contributor.toLowerCase().replace(/\s+/g, '') === name)
|
|
|
|
})
|
2022-05-06 12:41:24 +02:00
|
|
|
|
2022-04-01 12:51:55 +02:00
|
|
|
this.isTranslator.addCallbackAndRunD(ud => {
|
|
|
|
if(ud){
|
|
|
|
Locale.showLinkToWeblate.setData(true)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-02-16 01:46:55 +01:00
|
|
|
this.changes = new Changes(this, layoutToUse?.isLeftRightSensitive() ?? false)
|
|
|
|
|
|
|
|
|
|
|
|
new ChangeToElementsActor(this.changes, this.allElements)
|
|
|
|
new PendingChangesUploader(this.changes, this.selectedElement);
|
2022-04-01 12:51:55 +02:00
|
|
|
|
2021-10-15 05:20:02 +02:00
|
|
|
this.mangroveIdentity = new MangroveIdentity(
|
|
|
|
this.osmConnection.GetLongPreference("identity", "mangrove")
|
|
|
|
);
|
|
|
|
|
|
|
|
if (layoutToUse?.hideFromOverview) {
|
2021-10-15 19:58:02 +02:00
|
|
|
this.osmConnection.isLoggedIn.addCallbackAndRunD(loggedIn => {
|
2021-11-07 16:34:51 +01:00
|
|
|
if (loggedIn) {
|
2021-10-15 19:58:02 +02:00
|
|
|
this.osmConnection
|
|
|
|
.GetPreference("hidden-theme-" + layoutToUse?.id + "-enabled")
|
|
|
|
.setData("true");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
})
|
2021-10-15 05:20:02 +02:00
|
|
|
}
|
|
|
|
|
2022-02-04 14:36:26 +01:00
|
|
|
if (this.layoutToUse !== undefined && !this.layoutToUse.official) {
|
|
|
|
console.log("Marking unofficial theme as visited")
|
|
|
|
this.osmConnection.GetLongPreference("unofficial-theme-" + this.layoutToUse.id)
|
|
|
|
.setData(JSON.stringify({
|
|
|
|
id: this.layoutToUse.id,
|
|
|
|
icon: this.layoutToUse.icon,
|
|
|
|
title: this.layoutToUse.title.translations,
|
2022-02-14 15:41:14 +01:00
|
|
|
shortDescription: this.layoutToUse.shortDescription.translations,
|
|
|
|
definition: this.layoutToUse["definition"]
|
2022-02-04 14:36:26 +01:00
|
|
|
}))
|
2022-01-25 00:46:57 +01:00
|
|
|
}
|
2021-12-21 20:57:25 +01:00
|
|
|
|
|
|
|
|
2021-10-15 05:20:02 +02:00
|
|
|
// Important: the favourite layers are initialized _after_ the installed themes, as these might contain an installedTheme
|
|
|
|
this.favouriteLayers = LocalStorageSource.Get("favouriteLayers")
|
|
|
|
.syncWith(this.osmConnection.GetLongPreference("favouriteLayers"))
|
2022-06-05 02:24:14 +02:00
|
|
|
.sync(
|
2021-10-15 05:20:02 +02:00
|
|
|
(str) => Utils.Dedup(str?.split(";")) ?? [],
|
|
|
|
[],
|
|
|
|
(layers) => Utils.Dedup(layers)?.join(";")
|
|
|
|
);
|
2022-01-25 00:46:57 +01:00
|
|
|
|
2021-10-15 05:20:02 +02:00
|
|
|
this.InitializeLanguage();
|
|
|
|
new SelectedElementTagsUpdater(this)
|
2022-06-21 18:22:09 +02:00
|
|
|
this.installedUserThemes = this.InitInstalledUserThemes();
|
2021-10-15 05:20:02 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private InitializeLanguage() {
|
|
|
|
const layoutToUse = this.layoutToUse;
|
|
|
|
Locale.language.syncWith(this.osmConnection.GetPreference("language"));
|
|
|
|
Locale.language
|
|
|
|
.addCallback((currentLanguage) => {
|
|
|
|
if (layoutToUse === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
2022-04-03 03:00:45 +02:00
|
|
|
if(Locale.showLinkToWeblate.data){
|
|
|
|
return true; // Disable auto switching as we are in translators mode
|
|
|
|
}
|
2021-10-15 05:20:02 +02:00
|
|
|
if (this.layoutToUse.language.indexOf(currentLanguage) < 0) {
|
|
|
|
console.log(
|
|
|
|
"Resetting language to",
|
|
|
|
layoutToUse.language[0],
|
|
|
|
"as",
|
|
|
|
currentLanguage,
|
|
|
|
" is unsupported"
|
|
|
|
);
|
|
|
|
// The current language is not supported -> switch to a supported one
|
|
|
|
Locale.language.setData(layoutToUse.language[0]);
|
|
|
|
}
|
|
|
|
})
|
2022-06-06 19:37:22 +02:00
|
|
|
Locale.language.ping();
|
2021-10-15 05:20:02 +02:00
|
|
|
}
|
2022-06-21 18:22:09 +02:00
|
|
|
|
|
|
|
private InitInstalledUserThemes(): UIEventSource<string[]>{
|
|
|
|
const prefix = "mapcomplete-unofficial-theme-";
|
|
|
|
const postfix = "-combined-length"
|
|
|
|
return this.osmConnection.preferencesHandler.preferences.map(prefs =>
|
|
|
|
Object.keys(prefs)
|
|
|
|
.filter(k => k.startsWith(prefix) && k.endsWith(postfix))
|
|
|
|
.map(k => k.substring(prefix.length, k.length - postfix.length))
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
public GetUnofficialTheme(id: string): {
|
|
|
|
id: string
|
|
|
|
icon: string,
|
|
|
|
title: any,
|
|
|
|
shortDescription: any,
|
|
|
|
definition?: any,
|
|
|
|
isOfficial: boolean
|
|
|
|
} | undefined {
|
|
|
|
console.log("GETTING UNOFFICIAL THEME")
|
|
|
|
const pref = this.osmConnection.GetLongPreference("unofficial-theme-"+id)
|
|
|
|
const str = pref.data
|
|
|
|
|
|
|
|
if (str === undefined || str === "undefined" || str === "") {
|
|
|
|
pref.setData(null)
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const value: {
|
|
|
|
id: string
|
|
|
|
icon: string,
|
|
|
|
title: any,
|
|
|
|
shortDescription: any,
|
|
|
|
definition?: any,
|
|
|
|
isOfficial: boolean
|
|
|
|
} = JSON.parse(str)
|
|
|
|
value.isOfficial = false
|
|
|
|
return value;
|
|
|
|
} catch (e) {
|
|
|
|
console.warn("Removing theme " + id + " as it could not be parsed from the preferences; the content is:", str)
|
|
|
|
pref.setData(null)
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2021-10-15 05:20:02 +02:00
|
|
|
|
|
|
|
}
|