{"version":3,"file":"main.DhMj6l.js","sources":["theme-309/virtual:theme","theme-309/discourse/components/whisper-warning.gjs","theme-309/discourse/api-initializers/whisper-warning.js","theme-309/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(309);\n\nexport function themePrefix(key) {\n  return `theme_translations.309.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class WhisperWarning extends Component {\n  @service currentUser;\n  @service composer;\n\n  get showWarning() {\n    const model = this.args.outletArgs.model;\n    const composerAction = model.get(\"action\");\n\n    if (\n      !this.composer.canToggleWhisper ||\n      composerAction === \"createTopic\" ||\n      composerAction === \"createSharedDraft\"\n    ) {\n      return false;\n    }\n\n    // Block new PMs (but allow replies to existing PMs)\n    if (composerAction === \"privateMessage\") {\n      return false;\n    }\n\n    if (!this.isInAllowedGroup) {\n      return false;\n    }\n\n    if (settings.whisper_only && !this.composer.isWhispering) {\n      return false;\n    }\n\n    return this.matchesContext;\n  }\n\n  // At least one context filter must match. If no context filters are\n  // configured, show everywhere.\n  get matchesContext() {\n    const hasAnyContextFilter =\n      settings.show_in_read_restricted_categories ||\n      settings.show_in_group_pms ||\n      this.parseListSetting(settings.restrict_to_categories).length > 0;\n\n    if (!hasAnyContextFilter) {\n      return true;\n    }\n\n    if (settings.show_in_read_restricted_categories && this.isReadRestricted) {\n      return true;\n    }\n\n    if (settings.show_in_group_pms && this.isGroupPMWithUser) {\n      return true;\n    }\n\n    if (this.isInExplicitCategoryList) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get isReadRestricted() {\n    return !!this.args.outletArgs.model.category?.get(\"read_restricted\");\n  }\n\n  get isGroupPMWithUser() {\n    const topic = this.args.outletArgs.model.topic;\n    if (topic?.get(\"archetype\") !== \"private_message\") {\n      return false;\n    }\n\n    const allowedGroups = topic.get(\"allowedGroups\");\n    if (!allowedGroups) {\n      return false;\n    }\n\n    const userGroups = this.currentUser.groups ?? [];\n    return allowedGroups.some((ag) =>\n      userGroups.some((ug) => ug.name === ag.name)\n    );\n  }\n\n  get isInAllowedGroup() {\n    if (Object.hasOwn(settings, \"user_in_restrict_to_groups\")) {\n      return settings.user_in_restrict_to_groups;\n    }\n\n    // TODO (martin) Remove this fallback after resolve_group_membership\n    // from core is available everywhere\n    //\n    // Old behaviour was to allow all logged-in users if no groups were configured,\n    // new behaviour is to allow logged in users only if they are in the configured group.\n    const groups = this.parseListSetting(settings.restrict_to_groups);\n\n    if (groups.length === 0) {\n      return true;\n    }\n\n    const userGroups = this.currentUser.groups ?? [];\n    return groups.some((g) => {\n      const asId = Number.parseInt(g, 10);\n      return userGroups.some(\n        (ug) =>\n          ug.name.toLowerCase() === g.toLowerCase() ||\n          (!Number.isNaN(asId) && ug.id === asId)\n      );\n    });\n  }\n\n  // Returns true if the current topic's category is in the explicit\n  // restrict_to_categories list. Matches by both category ID and slug.\n  get isInExplicitCategoryList() {\n    const categories = this.parseListSetting(settings.restrict_to_categories);\n\n    if (categories.length === 0) {\n      return false;\n    }\n\n    const category = this.args.outletArgs.model.category;\n    if (!category) {\n      return false;\n    }\n\n    const catId = category.get ? category.get(\"id\") : category.id;\n    const catSlug = category.get ? category.get(\"slug\") : category.slug;\n\n    return categories.some((c) => {\n      const asId = Number.parseInt(c, 10);\n      return (\n        (catSlug && catSlug.toLowerCase() === c.toLowerCase()) ||\n        (!Number.isNaN(asId) && catId === asId)\n      );\n    });\n  }\n\n  // Normalises a list setting value to a trimmed, non-empty string array.\n  parseListSetting(value) {\n    return (Array.isArray(value) ? value : (value?.split(\",\") ?? []))\n      .map((v) => String(v).trim())\n      .filter(Boolean);\n  }\n\n  get icon() {\n    return this.composer.isWhispering ? \"far-eye-slash\" : \"far-eye\";\n  }\n\n  get translatedLabel() {\n    if (this.composer.isWhispering) {\n      return i18n(themePrefix(\"whispering\"));\n    } else {\n      return i18n(themePrefix(\"public_reply\"));\n    }\n  }\n\n  @action\n  toggleWhisper() {\n    this.composer.toggleWhisper();\n  }\n\n  <template>\n    {{#if this.showWarning}}\n      <DButton\n        @preventFocus={{true}}\n        @action={{this.toggleWhisper}}\n        @icon={{this.icon}}\n        class={{concatClass\n          \"whisper-hint\"\n          (if this.composer.isWhispering \"whispering\" \"public\")\n        }}\n        @translatedLabel={{this.translatedLabel}}\n      />\n    {{/if}}\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport whisperWarning from \"../components/whisper-warning\";\n\nexport default apiInitializer((api) => {\n  api.renderInOutlet(\"composer-action-after\", whisperWarning);\n});\n","import * as Mod1 from \"./discourse/api-initializers/whisper-warning\";\nimport * as Mod2 from \"./discourse/components/whisper-warning\";\nconst compatModules = {\n  \"discourse/api-initializers/whisper-warning\": Mod1,\n  \"discourse/components/whisper-warning\": Mod2,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","WhisperWarning","Component","dt7948","g","this","prototype","service","currentUser","i","composer","showWarning","composerAction","args","outletArgs","model","get","canToggleWhisper","isInAllowedGroup","whisper_only","isWhispering","matchesContext","show_in_read_restricted_categories","show_in_group_pms","parseListSetting","restrict_to_categories","length","isReadRestricted","isGroupPMWithUser","isInExplicitCategoryList","category","topic","allowedGroups","userGroups","groups","some","ag","ug","name","Object","hasOwn","user_in_restrict_to_groups","restrict_to_groups","asId","Number","parseInt","toLowerCase","isNaN","id","categories","catId","catSlug","slug","c","value","Array","isArray","split","map","v","String","trim","filter","Boolean","icon","translatedLabel","i18n","toggleWhisper","n","action","setComponentTemplate","createTemplateFactory","block","moduleName","scope","DButton","concatClass","isStrictMode","whisperWarning","apiInitializer","api","renderInOutlet","compatModules","Mod2"],"mappings":"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"}