{
  "version": 3,
  "sources": ["../../src/web/pages/projects/components/settings/plugins/AddNewPlugin.tsx", "../../src/web/pages/projects/components/settings/plugins/AddNewPlugin.styles.ts", "../../src/web/pages/projects/components/settings/plugins/TeamPluginsProvider.tsx", "../../src/web/pages/projects/components/settings/plugins/useFetchExternalPlugins.ts", "../../src/web/pages/projects/components/settings/plugins/ListPlugins.tsx", "../../src/web/pages/projects/components/settings/plugins/CenteredSpinner.styles.ts", "../../src/web/pages/projects/components/settings/plugins/CenteredSpinner.tsx", "../../src/web/pages/projects/components/settings/plugins/ListPlugins.styles.ts", "../../src/web/pages/projects/components/settings/plugins/Plugin.tsx", "../../src/web/pages/projects/components/settings/plugins/Plugin.styles.ts", "../../src/web/pages/projects/components/settings/plugins/TeamPlugins.tsx"],
  "sourcesContent": ["import { openNewTab } from \"@framerjs/app-shared\"\nimport { Button, InputWrapper, Spinner, Stack, Translatable as T, TextInput } from \"@framerjs/fresco\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport type { PluginServicePluginInfo } from \"plugins/pluginService.ts\"\nimport type { FormEvent } from \"react\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { isObject, isString } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport * as styles from \"./AddNewPlugin.styles.ts\"\nimport { useTeamPlugins } from \"./TeamPluginsProvider.tsx\"\n\n/**\n * @internal\n * These constants are exported for testing purposes only.\n * Do not use them outside of test files.\n */\nexport const API_ENDPOINT = \"/web/v1/plugins/external\"\nexport const TOAST_SUCCESS_DURATION = 3 * 1000 // 3 seconds\nexport const TOAST_ERROR_DURATION = 8 * 1000 // 8 seconds\nexport const TOAST_ID = \"add-new-plugin-toast\"\nexport const SUCCESS_MESSAGE = \"has been added.\"\n\n// Server-side service repository: https://github.com/framer/FramerPluginsService\nexport const ERROR_MESSAGES = {\n\tMANIFEST_NOT_FOUND: \"Unable to add Plugin. Manifest cannot be found.\",\n\tINVALID_MANIFEST: \"Unable to add Plugin. Manifest is invalid.\",\n\tMISSING_MANIFEST_FIELDS: \"Unable to add Plugin. Manifest is missing required fields.\",\n\tINVALID_URL: \"Unable to add Plugin. The URL provided is invalid.\",\n\tPLUGIN_ALREADY_EXISTS: \"Unable to add Plugin. Plugin already exists.\",\n\tCANNOT_FETCH_MANIFEST: \"Unable to add Plugin. Cannot fetch the manifest.\",\n\tHTTPS_REQUIRED: \"Unable to add Plugin. HTTPS is required.\",\n\tDUPLICATE_MANIFEST_ID: `Plugin \u201C{pluginName}\u201D with the same ID already exists in the Workspace`,\n\tdefault: \"Couldn\u2019t add plugin. Please retry.\",\n} as const\n\ninterface ErrorResponse {\n\tdata?: {\n\t\treason?: keyof typeof ERROR_MESSAGES\n\t}\n}\n\nfunction openDuplicatePluginsArticle() {\n\topenNewTab(\"https://www.framer.com/developers/workspace-plugins#conflicting-plugin-ids\")\n}\n\nfunction hasDuplicateManifestId(error: unknown): boolean {\n\treturn isObject(error) && isObject(error.data) && error.data.reason === \"DUPLICATE_MANIFEST_ID\"\n}\n\nfunction hasManifestId(error: unknown): error is { data: { manifestId: string } } {\n\treturn isObject(error) && isObject(error.data) && isString(error.data.manifestId)\n}\n\nfunction isErrorMessageKey(value: unknown): value is keyof typeof ERROR_MESSAGES {\n\treturn isString(value) && value in ERROR_MESSAGES\n}\n\nfunction getMessageForError(error: unknown): string {\n\tif (!isObject(error)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\tconst errorResponse = error as ErrorResponse\n\n\tif (!isErrorMessageKey(errorResponse.data?.reason)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\treturn ERROR_MESSAGES[errorResponse.data?.reason]\n}\n\nfunction createNewPlugin(teamId: string, pluginUrl: string): Promise<PluginServicePluginInfo> {\n\treturn apiFetcher.post(`${API_ENDPOINT}`, { url: pluginUrl, ownerId: teamId, ownerType: \"team\" })\n}\n\ninterface AddNewPluginProps {\n\tteamId: string\n}\n\nexport function AddNewPlugin({ teamId }: AddNewPluginProps) {\n\tconst [inputValue, setInputValue] = useState(\"\")\n\tconst [isSubmitting, setIsSubmitting] = useState(false)\n\tconst { addNewPlugin, plugins } = useTeamPlugins()\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\ttoast({\n\t\t\t\tkey: TOAST_ID,\n\t\t\t\ttype: \"remove\",\n\t\t\t})\n\t\t}\n\t}, [])\n\n\tconst onSubmit = useCallback(\n\t\t(event: FormEvent<HTMLFormElement>) => {\n\t\t\tevent.preventDefault()\n\t\t\tsetIsSubmitting(true)\n\n\t\t\tcreateNewPlugin(teamId, inputValue)\n\t\t\t\t.then(plugin => {\n\t\t\t\t\ttoast({\n\t\t\t\t\t\tkey: TOAST_ID,\n\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\tvariant: \"success\",\n\t\t\t\t\t\tprimaryText: \"Plugin\",\n\t\t\t\t\t\tsecondaryText: SUCCESS_MESSAGE,\n\t\t\t\t\t\tduration: TOAST_SUCCESS_DURATION,\n\t\t\t\t\t})\n\n\t\t\t\t\taddNewPlugin(plugin)\n\t\t\t\t\tsetInputValue(\"\")\n\t\t\t\t})\n\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\tlet errorMessage = getMessageForError(error)\n\t\t\t\t\tconst hasDuplicateId = hasDuplicateManifestId(error)\n\n\t\t\t\t\tif (hasDuplicateId && hasManifestId(error)) {\n\t\t\t\t\t\tconst plugin = plugins.find(plugin => plugin.manifestId === error.data.manifestId)\n\t\t\t\t\t\tconst pluginName = plugin?.currentVersion.name\n\t\t\t\t\t\terrorMessage = errorMessage.replace(\"{pluginName}\", pluginName ?? \"\")\n\t\t\t\t\t}\n\n\t\t\t\t\ttoast({\n\t\t\t\t\t\tkey: TOAST_ID,\n\t\t\t\t\t\ttype: \"add\",\n\t\t\t\t\t\tvariant: \"error\",\n\t\t\t\t\t\ttext: errorMessage,\n\t\t\t\t\t\tduration: TOAST_ERROR_DURATION,\n\t\t\t\t\t\t...(hasDuplicateId && {\n\t\t\t\t\t\t\taction: {\n\t\t\t\t\t\t\t\ttitle: Dictionary.LearnMore,\n\t\t\t\t\t\t\t\tonClick: openDuplicatePluginsArticle,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tsetIsSubmitting(false)\n\t\t\t\t})\n\t\t},\n\t\t[teamId, inputValue, addNewPlugin, plugins],\n\t)\n\n\treturn (\n\t\t<form onSubmit={onSubmit} aria-label=\"add-new-plugin-form\">\n\t\t\t<Stack gap={6}>\n\t\t\t\t<Stack gap={10} direction=\"row\">\n\t\t\t\t\t<div className={styles.wrapper}>\n\t\t\t\t\t\t<InputWrapper large hasError={false}>\n\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\t\tconstantChange\n\t\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\t\tplaceholder=\"Plugin URL\u2026\"\n\t\t\t\t\t\t\t\tonChange={setInputValue}\n\t\t\t\t\t\t\t\tdata-1p-ignore\n\t\t\t\t\t\t\t\tenabled={!isSubmitting}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\tclassName={styles.button}\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tenabled={inputValue.trim().length > 0 && !isSubmitting}\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\taria-label={isSubmitting ? \"Adding plugin\u2026\" : \"Add plugin\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSubmitting ? <Spinner /> : <T>Add</T>}\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</form>\n\t)\n}\n", "import \"AddNewPlugin.styles_2fk16l.wyw.css\"; export const wrapper = \"wrapper_wd905zn\";\nexport const button = \"button_bmgr4py\";", "import type { PluginServicePluginInfo } from \"plugins/pluginService.ts\"\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from \"react\"\nimport { useFetchExternalPlugins } from \"./useFetchExternalPlugins.ts\"\n\ninterface TeamPluginsContext {\n\tplugins: PluginServicePluginInfo[]\n\taddNewPlugin: (newPlugin: PluginServicePluginInfo) => void\n\tremovePlugin: (pluginId: string) => void\n\tisLoading: boolean\n\thasError: boolean\n\tfetchPlugins: (teamId: string) => Promise<void>\n}\n\nconst TeamPluginsContext = createContext<TeamPluginsContext | undefined>(undefined)\n\nexport const useTeamPlugins = () => {\n\tconst context = useContext(TeamPluginsContext)\n\n\tif (!context) {\n\t\tthrow new Error(\"useTeamPlugins must be used within a TeamPluginsProvider\")\n\t}\n\n\treturn context\n}\n\ninterface TeamPluginsProviderProps {\n\tchildren: React.ReactNode\n}\n\nexport function TeamPluginsProvider({ children }: TeamPluginsProviderProps) {\n\tconst { fetch, isLoading, hasError, data } = useFetchExternalPlugins()\n\tconst [plugins, setPlugins] = useState<PluginServicePluginInfo[]>([])\n\n\tuseEffect(() => {\n\t\tif (data) {\n\t\t\tsetPlugins(data.plugins)\n\t\t}\n\t}, [data])\n\n\tconst removePlugin = useCallback((pluginId: string) => {\n\t\tsetPlugins(prevPlugins => prevPlugins.filter(plugin => plugin.id !== pluginId))\n\t}, [])\n\n\tconst addNewPlugin = useCallback((newPlugin: PluginServicePluginInfo) => {\n\t\tsetPlugins(prevPlugins => [newPlugin, ...prevPlugins])\n\t}, [])\n\n\tconst contextValues = useMemo(\n\t\t() => ({\n\t\t\tfetchPlugins: fetch,\n\t\t\tisLoading,\n\t\t\thasError,\n\t\t\tplugins,\n\t\t\taddNewPlugin,\n\t\t\tremovePlugin,\n\t\t}),\n\t\t[fetch, isLoading, hasError, plugins, addNewPlugin, removePlugin],\n\t)\n\n\treturn <TeamPluginsContext.Provider value={contextValues}>{children}</TeamPluginsContext.Provider>\n}\n", "import type { PluginServicePlugins } from \"plugins/pluginService.ts\"\nimport { useCallback, useState } from \"react\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\nconst buildExternalPluginsEndpoint = (teamId: string) => `/web/v1/plugins/teams/${teamId}/external`\n\nfunction fetchExternalPlugins(teamId: string): Promise<PluginServicePlugins> {\n\tconst endpoint = buildExternalPluginsEndpoint(teamId)\n\treturn apiFetcher.get(endpoint)\n}\n\nexport function useFetchExternalPlugins() {\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [hasError, setHasError] = useState(false)\n\tconst [data, setData] = useState<PluginServicePlugins | null>(null)\n\n\tconst fetch = useCallback(async (teamId: string) => {\n\t\ttry {\n\t\t\tsetIsLoading(true)\n\t\t\tsetHasError(false)\n\t\t\tconst response = await fetchExternalPlugins(teamId)\n\t\t\tsetData(response)\n\t\t} catch {\n\t\t\tsetHasError(true)\n\t\t} finally {\n\t\t\tsetIsLoading(false)\n\t\t}\n\t}, [])\n\n\treturn {\n\t\tfetch,\n\t\tisLoading,\n\t\thasError,\n\t\tdata,\n\t}\n}\n", "import { Scroll, Stack } from \"@framerjs/fresco\"\nimport { useEffect } from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { CenteredSpinner } from \"./CenteredSpinner.tsx\"\nimport * as styles from \"./ListPlugins.styles.ts\"\nimport { Plugin } from \"./Plugin.tsx\"\nimport { useTeamPlugins } from \"./TeamPluginsProvider.tsx\"\n\n/**\n * @internal\n * These constants are exported for testing purposes only.\n * Do not use them outside of test files.\n */\nexport const ERROR_LIST_MESSAGE = \"plugins list.\"\nexport const ERROR_DURATION = 3000\n\ninterface ListPluginsProps {\n\tteamId: string\n}\n\nexport function ListPlugins({ teamId }: ListPluginsProps) {\n\tconst { isLoading, hasError, plugins } = useTeamPlugins()\n\tuseEffect(() => {\n\t\tif (hasError) {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tprimaryText: \"Failed to load\",\n\t\t\t\tsecondaryText: ERROR_LIST_MESSAGE,\n\t\t\t\tduration: ERROR_DURATION,\n\t\t\t})\n\t\t}\n\t}, [hasError])\n\n\tif (isLoading) {\n\t\treturn <CenteredSpinner />\n\t}\n\n\tif (hasError || !plugins.length) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<Scroll direction=\"vertical\">\n\t\t\t<Stack gap={15} className={styles.list}>\n\t\t\t\t{plugins.map(plugin => (\n\t\t\t\t\t<Plugin\n\t\t\t\t\t\tkey={plugin.id}\n\t\t\t\t\t\tteamId={teamId}\n\t\t\t\t\t\tpluginId={plugin.id}\n\t\t\t\t\t\ticon={plugin.currentVersion.icon}\n\t\t\t\t\t\tname={plugin.currentVersion.name}\n\t\t\t\t\t\turl={plugin.currentVersion.url}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</Stack>\n\t\t</Scroll>\n\t)\n}\n", "import \"CenteredSpinner.styles_bve9if.wyw.css\"; export const wrapper = \"wrapper_w8q5k57\";", "import { Spinner } from \"@framerjs/fresco\"\nimport * as styles from \"./CenteredSpinner.styles.ts\"\n\nexport const TEST_LIST_PLUGINS_SPINNER = \"list-plugins-spinner\"\n\nexport function CenteredSpinner() {\n\treturn (\n\t\t<div className={styles.wrapper}>\n\t\t\t<Spinner size=\"normal\" data-testid={TEST_LIST_PLUGINS_SPINNER} />\n\t\t</div>\n\t)\n}\n", "import \"ListPlugins.styles_460ctr.wyw.css\"; export const list = \"list_l1m5eboz\";", "import { Button, IconPopupMenu, InputWrapper, InputWrapperError, Spinner, Stack, TextInput } from \"@framerjs/fresco\"\nimport type { MenuItemOptions } from \"app/menu.ts\"\nimport { PluginIcon } from \"plugins/PluginIcon.tsx\"\nimport type { PluginServicePluginInfo } from \"plugins/pluginService.ts\"\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\"\nimport { isObject, isString } from \"utils/typeChecks.ts\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { useContextMenu } from \"web/lib/useContextMenu.ts\"\nimport { ConfirmationModalContext } from \"../team/utils/useConfirmationModal.ts\"\nimport * as styles from \"./Plugin.styles.ts\"\nimport { useTeamPlugins } from \"./TeamPluginsProvider.tsx\"\n\n/**\n * @internal\n * These constants are exported for testing purposes only.\n * Do not use them outside of test files.\n */\nexport const TEST_BUTTON_POPUP_MENU = \"plugin-popup-menu\"\nexport const ERROR_SYNC_MESSAGE = \"plugin settings.\"\nexport const SUCCESS_EDIT_MESSAGE = \"has been updated.\"\n\nconst TOAST_DURATION = 3000\n\nexport const ERROR_MESSAGES = {\n\tINVALID_URL: \"Unable to update Plugin. Invalid URL.\",\n\tMISMATCHED_MANIFEST: \"Unable to update Plugin. ID doesn't match the latest version in `framer.json`.\",\n\tPLUGIN_ALREADY_EXISTS: \"Unable to update Plugin. Plugin already exists.\",\n\tHTTPS_REQUIRED: \"Unable to update Plugin. HTTPS is required.\",\n\tdefault: \"Failed to update plugin. Please try again.\",\n} as const\n\nfunction isErrorMessageKey(value: unknown): value is keyof typeof ERROR_MESSAGES {\n\treturn isString(value) && value in ERROR_MESSAGES\n}\n\nfunction getMessageForError(error: unknown): string {\n\tif (!isObject(error)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\tconst maybeData = error.data\n\n\tif (!isObject(maybeData)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\tif (!(\"reason\" in maybeData)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\tconst reason = maybeData.reason\n\n\tif (!isErrorMessageKey(reason)) {\n\t\treturn ERROR_MESSAGES.default\n\t}\n\n\treturn ERROR_MESSAGES[reason]\n}\n\nfunction deleteExternalPlugin(pluginId: string, teamId: string): Promise<void> {\n\tconst endpoint = `/web/v1/plugins/external/${pluginId}`\n\treturn apiFetcher.delete(endpoint, { ownerId: teamId })\n}\n\nfunction editExternalPlugin(pluginId: string, teamId: string, url?: string): Promise<PluginServicePluginInfo> {\n\tconst endpoint = `/web/v1/plugins/${pluginId}/external`\n\treturn apiFetcher.put(endpoint, { ownerId: teamId, url })\n}\n\ninterface PluginProps {\n\ticon: string\n\tname: string\n\tpluginId: string\n\tteamId: string\n\turl: string\n}\n\nexport function Plugin({ icon, url, name, pluginId, teamId }: PluginProps) {\n\tconst contextMenu = useContextMenu()\n\tconst { showConfirmationModal } = useContext(ConfirmationModalContext)\n\tconst { removePlugin } = useTeamPlugins()\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\tconst [isEditing, setIsEditing] = useState(false)\n\tconst [pluginData, setPluginData] = useState({ icon, url, name })\n\tconst [isSyncing, setIsSyncing] = useState(false)\n\tconst [errorMessage, setErrorMessage] = useState<string | null>(null)\n\tconst [newUrl, setNewUrl] = useState(url)\n\n\tconst onConfirmDelete = useCallback(async () => {\n\t\ttry {\n\t\t\tawait deleteExternalPlugin(pluginId, teamId)\n\t\t\tremovePlugin(pluginId)\n\t\t\tsetIsSyncing(false)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tprimaryText: \"Plugin\",\n\t\t\t\tsecondaryText: \"has been removed.\",\n\t\t\t\tduration: TOAST_DURATION,\n\t\t\t})\n\t\t} catch {\n\t\t\tsetIsSyncing(false)\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tprimaryText: \"Failed to remove\",\n\t\t\t\tsecondaryText: \"plugin.\",\n\t\t\t\tduration: TOAST_DURATION,\n\t\t\t})\n\t\t}\n\t}, [pluginId, removePlugin, teamId])\n\n\tconst cancelEditing = useCallback(() => {\n\t\tsetIsEditing(false)\n\t\tsetErrorMessage(null)\n\t}, [])\n\n\tconst handleOnBlur = useCallback(\n\t\t(e: React.FocusEvent<HTMLInputElement>) => {\n\t\t\tconst isSubmitButton = e.relatedTarget instanceof HTMLButtonElement && e.relatedTarget.type === \"submit\"\n\n\t\t\tif (!isSubmitButton) {\n\t\t\t\tcancelEditing()\n\t\t\t}\n\t\t},\n\t\t[cancelEditing],\n\t)\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\tcancelEditing()\n\t\t\t}\n\t\t},\n\t\t[cancelEditing],\n\t)\n\n\tconst handleSync = useCallback(async () => {\n\t\tsetIsSyncing(true)\n\n\t\ttry {\n\t\t\tconst updatedPlugin = await editExternalPlugin(pluginId, teamId)\n\n\t\t\tsetPluginData({\n\t\t\t\ticon: updatedPlugin.currentVersion.icon,\n\t\t\t\turl: updatedPlugin.currentVersion.url,\n\t\t\t\tname: updatedPlugin.currentVersion.name,\n\t\t\t})\n\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"success\",\n\t\t\t\tprimaryText: \"Plugin\",\n\t\t\t\tsecondaryText: SUCCESS_EDIT_MESSAGE,\n\t\t\t\tduration: TOAST_DURATION,\n\t\t\t})\n\t\t} catch {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tvariant: \"error\",\n\t\t\t\tprimaryText: \"Failed to sync\",\n\t\t\t\tsecondaryText: ERROR_SYNC_MESSAGE,\n\t\t\t\tduration: TOAST_DURATION,\n\t\t\t})\n\t\t} finally {\n\t\t\tsetIsSyncing(false)\n\t\t}\n\t}, [pluginId, teamId])\n\n\tconst focusAndSelectInput = useCallback(() => {\n\t\tif (!inputRef.current) return\n\n\t\tinputRef.current.focus()\n\t\tinputRef.current.setSelectionRange(0, inputRef.current.value.length)\n\n\t\t/**\n\t\t * Manually reset the scroll position so that the user sees\n\t\t * the beginning of a long URL (e.g., \"https://\u2026\") instead\n\t\t * of the end. By default, some browsers auto-scroll to the\n\t\t * end of the selected text to place the cursor in view.\n\t\t */\n\t\tinputRef.current.scrollLeft = 0\n\t}, [])\n\n\tconst handleSubmit = useCallback(\n\t\tasync (e: React.FormEvent<HTMLFormElement>) => {\n\t\t\te.preventDefault()\n\n\t\t\tif (!inputRef.current) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst newUrl = inputRef.current.value\n\n\t\t\ttry {\n\t\t\t\tconst updatedPlugin = await editExternalPlugin(pluginId, teamId, newUrl)\n\n\t\t\t\tsetPluginData({\n\t\t\t\t\ticon: updatedPlugin.currentVersion.icon,\n\t\t\t\t\turl: updatedPlugin.currentVersion.url,\n\t\t\t\t\tname: updatedPlugin.currentVersion.name,\n\t\t\t\t})\n\n\t\t\t\ttoast({\n\t\t\t\t\ttype: \"add\",\n\t\t\t\t\tvariant: \"success\",\n\t\t\t\t\tprimaryText: \"Plugin\",\n\t\t\t\t\tsecondaryText: SUCCESS_EDIT_MESSAGE,\n\t\t\t\t\tduration: TOAST_DURATION,\n\t\t\t\t})\n\n\t\t\t\tsetIsEditing(false)\n\t\t\t} catch (error: unknown) {\n\t\t\t\tconst message = getMessageForError(error)\n\t\t\t\tsetErrorMessage(message)\n\t\t\t\tfocusAndSelectInput()\n\t\t\t}\n\t\t},\n\t\t[pluginId, teamId, focusAndSelectInput],\n\t)\n\n\tconst handleMenuClick = useCallback(\n\t\tasync (event: React.MouseEvent<HTMLElement>) => {\n\t\t\tconst { top, right } = event.currentTarget.getBoundingClientRect()\n\n\t\t\tconst items: MenuItemOptions[] = [\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Edit URL\",\n\t\t\t\t\tclick: () => setIsEditing(true),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Update Info\",\n\t\t\t\t\tclick: () => void handleSync(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"separator\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: \"Remove\",\n\t\t\t\t\tclick: () => {\n\t\t\t\t\t\tshowConfirmationModal({\n\t\t\t\t\t\t\tvariant: \"destructive\",\n\t\t\t\t\t\t\ttitle: \"Remove plugin\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"This Plugin will be removed from this Workspace. CMS Collections synced via this Plugin will no longer be able to sync unless the Plugin is added again.\",\n\t\t\t\t\t\t\tcancelLabel: \"Cancel\",\n\t\t\t\t\t\t\tconfirmLabel: \"Remove\",\n\t\t\t\t\t\t\tonConfirm: onConfirmDelete,\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]\n\n\t\t\tcontextMenu.show(items, {\n\t\t\t\tlocation: { x: right + 10, y: top },\n\t\t\t})\n\t\t},\n\t\t[onConfirmDelete, showConfirmationModal, contextMenu, handleSync],\n\t)\n\n\tuseEffect(() => {\n\t\tif (isEditing) {\n\t\t\tfocusAndSelectInput()\n\t\t}\n\t}, [isEditing, focusAndSelectInput])\n\n\treturn (\n\t\t<form onSubmit={handleSubmit}>\n\t\t\t<Stack direction=\"row\" alignItems=\"flex-start\" justifyContent=\"space-between\">\n\t\t\t\t<Stack direction=\"row\" alignItems=\"flex-start\" gap={10} className={styles.row}>\n\t\t\t\t\t<div className={styles.icon}>\n\t\t\t\t\t\t<PluginIcon src={pluginData.icon} />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{isEditing ? (\n\t\t\t\t\t\t<div className={styles.container}>\n\t\t\t\t\t\t\t<InputWrapper large hasError={!!errorMessage}>\n\t\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\t\t\tvalue={pluginData.url}\n\t\t\t\t\t\t\t\t\tclassName={styles.name}\n\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t\t\tonBlur={handleOnBlur}\n\t\t\t\t\t\t\t\t\tonChange={value => {\n\t\t\t\t\t\t\t\t\t\tsetNewUrl(value)\n\t\t\t\t\t\t\t\t\t\tsetErrorMessage(null)\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</InputWrapper>\n\t\t\t\t\t\t\t<InputWrapperError visible={!!errorMessage}>{errorMessage}</InputWrapperError>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className={styles.name}>{pluginData.name}</div>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\n\t\t\t\t<Stack direction=\"row\" justifyContent=\"flex-end\">\n\t\t\t\t\t{isEditing ? (\n\t\t\t\t\t\t// Using a unique key forces React to unmount the old button and mount a brand-new one,\n\t\t\t\t\t\t// preventing any morphing animation when switching from editing to non-editing states.\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey=\"saveButton\"\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tclassName={styles.updateButton}\n\t\t\t\t\t\t\tenabled={!!newUrl.trim()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSave\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t// Using a different key ensures that this button is treated distinctly\n\t\t\t\t\t\t// from the one above, preventing a morph transition.\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tkey=\"menuButton\"\n\t\t\t\t\t\t\tvariant=\"clean\"\n\t\t\t\t\t\t\tdata-testid={TEST_BUTTON_POPUP_MENU}\n\t\t\t\t\t\t\tclassName={styles.controllerButton}\n\t\t\t\t\t\t\tonClick={handleMenuClick}\n\t\t\t\t\t\t\taria-label=\"Open plugin options\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isSyncing ? <Spinner className={styles.spinner} /> : <IconPopupMenu className={styles.iconPopupMenu} />}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</Stack>\n\t\t\t</Stack>\n\t\t</form>\n\t)\n}\n", "import \"Plugin.styles_1afu556.wyw.css\"; export const icon = \"icon_if1zadj\";\nexport const controllerButton = \"controllerButton_c5ggvdt\";\nexport const iconPopupMenu = \"iconPopupMenu_ifntok\";\nexport const updateButton = \"updateButton_ua5es8q\";\nexport const name = \"name_n5w229d\";\nexport const container = \"container_cnwipdj\";\nexport const row = \"row_r1k7ef0r\";\nexport const spinner = \"spinner_seylqu8\";", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { Button, Stack, Translatable as T } from \"@framerjs/fresco\"\nimport * as styles from \"../SettingsModal.styles.ts\"\nimport { AddNewPlugin } from \"./AddNewPlugin.tsx\"\nimport { ListPlugins } from \"./ListPlugins.tsx\"\n\nfunction openWorkspacePluginsArticle() {\n\topenNewTab(\"https://www.framer.com/developers/workspace-plugins\")\n}\n\ninterface TeamPluginsProps {\n\tteamId: string | undefined\n}\n\nexport function TeamPlugins({ teamId }: TeamPluginsProps) {\n\tif (!teamId) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<Stack className={styles.wrapper} padding={30} gap={10}>\n\t\t\t<h1 className={styles.title}>Workspace Plugins</h1>\n\t\t\t<p className={styles.description}>\n\t\t\t\t<T>\n\t\t\t\t\tThis list of private Plugins will appear in the Plugins menu. Plugin must be deployed at a URL to be added.\n\t\t\t\t\t{` `}\n\t\t\t\t</T>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"link\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\topenWorkspacePluginsArticle()\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<T>Learn more</T>\n\t\t\t\t</Button>\n\t\t\t</p>\n\t\t\t<AddNewPlugin teamId={teamId} />\n\t\t\t<ListPlugins teamId={teamId} />\n\t\t</Stack>\n\t)\n}\n"],
  "mappings": "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",
  "names": ["import_react", "wrapper", "import_react", "import_jsx_runtime", "plugin", "wrapper", "import_react", "wrapper", "import_jsx_runtime", "wrapper", "import_react", "import_jsx_runtime", "ERROR_MESSAGES", "isErrorMessageKey", "getMessageForError", "icon", "name", "newUrl", "import_jsx_runtime", "import_jsx_runtime"]
}
