diff --git a/Logic/State/FeatureSwitchState.ts b/Logic/State/FeatureSwitchState.ts index b786a06473..94d367e20c 100644 --- a/Logic/State/FeatureSwitchState.ts +++ b/Logic/State/FeatureSwitchState.ts @@ -2,12 +2,58 @@ * The part of the global state which initializes the feature switches, based on default values and on the layoutToUse */ import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" -import { UIEventSource } from "../UIEventSource" -import { QueryParameters } from "../Web/QueryParameters" +import {UIEventSource} from "../UIEventSource" +import {QueryParameters} from "../Web/QueryParameters" import Constants from "../../Models/Constants" -import { Utils } from "../../Utils" +import {Utils} from "../../Utils" -export default class FeatureSwitchState { +class FeatureSwitchUtils { + static initSwitch( + key: string, + deflt:boolean, + documentation: string + ): UIEventSource { + const defaultValue = deflt + const queryParam = QueryParameters.GetQueryParameter( + key, + "" + defaultValue, + documentation + ) + + // It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened + return queryParam.sync( + (str) => (str === undefined ? defaultValue : str !== "false"), + [], + (b) => (b == defaultValue ? undefined : "" + b) + ) + + + } + +} + +export class OsmConnectionFeatureSwitches { + + public readonly featureSwitchFakeUser: UIEventSource + public readonly featureSwitchApiURL: UIEventSource + + constructor() { + this.featureSwitchApiURL = QueryParameters.GetQueryParameter( + "backend", + "osm", + "The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test'" + ) + + this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter( + "fake-user", + false, + "If true, 'dryrun' mode is activated and a fake user account is loaded" + ) + } +} + + +export default class FeatureSwitchState extends OsmConnectionFeatureSwitches{ /** * The layout that is being used in this run */ @@ -26,113 +72,88 @@ export default class FeatureSwitchState { public readonly featureSwitchIsTesting: UIEventSource public readonly featureSwitchIsDebugging: UIEventSource public readonly featureSwitchShowAllQuestions: UIEventSource - public readonly featureSwitchApiURL: UIEventSource public readonly featureSwitchFilter: UIEventSource public readonly featureSwitchEnableExport: UIEventSource - public readonly featureSwitchFakeUser: UIEventSource public readonly overpassUrl: UIEventSource public readonly overpassTimeout: UIEventSource public readonly overpassMaxZoom: UIEventSource public readonly osmApiTileSize: UIEventSource public readonly backgroundLayerId: UIEventSource - public constructor(layoutToUse: LayoutConfig) { + public constructor(layoutToUse?: LayoutConfig) { + super() this.layoutToUse = layoutToUse // Helper function to initialize feature switches - function featSw( - key: string, - deflt: (layout: LayoutConfig) => boolean, - documentation: string - ): UIEventSource { - const defaultValue = deflt(layoutToUse) - const queryParam = QueryParameters.GetQueryParameter( - key, - "" + defaultValue, - documentation - ) - // It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened - return queryParam.sync( - (str) => (str === undefined ? defaultValue : str !== "false"), - [], - (b) => (b == defaultValue ? undefined : "" + b) - ) - } - - this.featureSwitchUserbadge = featSw( + this.featureSwitchUserbadge = FeatureSwitchUtils.initSwitch( "fs-userbadge", - (layoutToUse) => layoutToUse?.enableUserBadge ?? true, + layoutToUse?.enableUserBadge ?? true, "Disables/Enables the user information pill (userbadge) at the top left. Disabling this disables logging in and thus disables editing all together, effectively putting MapComplete into read-only mode." ) - this.featureSwitchSearch = featSw( + this.featureSwitchSearch = FeatureSwitchUtils.initSwitch( "fs-search", - (layoutToUse) => layoutToUse?.enableSearch ?? true, + layoutToUse?.enableSearch ?? true, "Disables/Enables the search bar" ) - this.featureSwitchBackgroundSelection = featSw( + this.featureSwitchBackgroundSelection = FeatureSwitchUtils.initSwitch( "fs-background", - (layoutToUse) => layoutToUse?.enableBackgroundLayerSelection ?? true, + layoutToUse?.enableBackgroundLayerSelection ?? true, "Disables/Enables the background layer control" ) - this.featureSwitchFilter = featSw( + this.featureSwitchFilter = FeatureSwitchUtils.initSwitch( "fs-filter", - (layoutToUse) => layoutToUse?.enableLayers ?? true, + layoutToUse?.enableLayers ?? true, "Disables/Enables the filter view" ) - this.featureSwitchAddNew = featSw( + this.featureSwitchAddNew = FeatureSwitchUtils.initSwitch( "fs-add-new", - (layoutToUse) => layoutToUse?.enableAddNewPoints ?? true, + layoutToUse?.enableAddNewPoints ?? true, "Disables/Enables the 'add new feature'-popup. (A theme without presets might not have it in the first place)" ) - this.featureSwitchWelcomeMessage = featSw( + this.featureSwitchWelcomeMessage = FeatureSwitchUtils.initSwitch( "fs-welcome-message", - () => true, + true, "Disables/enables the help menu or welcome message" ) - this.featureSwitchCommunityIndex = featSw( + this.featureSwitchCommunityIndex = FeatureSwitchUtils.initSwitch( "fs-community-index", - () => true, + true, "Disables/enables the button to get in touch with the community" ) - this.featureSwitchExtraLinkEnabled = featSw( + this.featureSwitchExtraLinkEnabled = FeatureSwitchUtils.initSwitch( "fs-iframe-popout", - (_) => true, + true, "Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)" ) - this.featureSwitchMoreQuests = featSw( + this.featureSwitchMoreQuests = FeatureSwitchUtils.initSwitch( "fs-more-quests", - (layoutToUse) => layoutToUse?.enableMoreQuests ?? true, + layoutToUse?.enableMoreQuests ?? true, "Disables/Enables the 'More Quests'-tab in the welcome message" ) - this.featureSwitchShareScreen = featSw( + this.featureSwitchShareScreen = FeatureSwitchUtils.initSwitch( "fs-share-screen", - (layoutToUse) => layoutToUse?.enableShareScreen ?? true, + layoutToUse?.enableShareScreen ?? true, "Disables/Enables the 'Share-screen'-tab in the welcome message" ) - this.featureSwitchGeolocation = featSw( + this.featureSwitchGeolocation = FeatureSwitchUtils.initSwitch( "fs-geolocation", - (layoutToUse) => layoutToUse?.enableGeolocation ?? true, + layoutToUse?.enableGeolocation ?? true, "Disables/Enables the geolocation button" ) - this.featureSwitchShowAllQuestions = featSw( + this.featureSwitchShowAllQuestions = FeatureSwitchUtils.initSwitch( "fs-all-questions", - (layoutToUse) => layoutToUse?.enableShowAllQuestions ?? false, + layoutToUse?.enableShowAllQuestions ?? false, "Always show all questions" ) - this.featureSwitchEnableExport = featSw( + this.featureSwitchEnableExport = FeatureSwitchUtils.initSwitch( "fs-export", - (layoutToUse) => layoutToUse?.enableExportButton ?? true, + layoutToUse?.enableExportButton ?? true, "Enable the export as GeoJSON and CSV button" ) - this.featureSwitchApiURL = QueryParameters.GetQueryParameter( - "backend", - "osm", - "The OSM backend to use - can be used to redirect mapcomplete to the testing backend when using 'osm-test'" - ) let testingDefaultValue = false if ( @@ -155,12 +176,6 @@ export default class FeatureSwitchState { "If true, shows some extra debugging help such as all the available tags on every object" ) - this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter( - "fake-user", - false, - "If true, 'dryrun' mode is activated and a fake user account is loaded" - ) - this.overpassUrl = QueryParameters.GetQueryParameter( "overpassUrl", (layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","), diff --git a/UI/AllThemesGui.ts b/UI/AllThemesGui.ts index 111cdadd02..43c64f8cc4 100644 --- a/UI/AllThemesGui.ts +++ b/UI/AllThemesGui.ts @@ -9,11 +9,22 @@ import IndexText from "./BigComponents/IndexText" import { LoginToggle } from "./Popup/LoginButton" import { ImmutableStore } from "../Logic/UIEventSource" import { OsmConnection } from "../Logic/Osm/OsmConnection" +import {QueryParameters} from "../Logic/Web/QueryParameters"; +import {OsmConnectionFeatureSwitches} from "../Logic/State/FeatureSwitchState"; export default class AllThemesGui { setup() { try { - const osmConnection = new OsmConnection() + const featureSwitches = new OsmConnectionFeatureSwitches() + const osmConnection = new OsmConnection({ + fakeUser: featureSwitches.featureSwitchFakeUser.data, + oauth_token: QueryParameters.GetQueryParameter( + "oauth_token", + undefined, + "Used to complete the login" + ), + osmConfiguration: <"osm" | "osm-test">featureSwitches.featureSwitchApiURL.data, + }) const state = new UserRelatedState(osmConnection) const intro = new Combine([ new LanguagePicker(Translations.t.index.title.SupportedLanguages(), "").SetClass(