{
  "version": 3,
  "sources": ["../../src/web/lib/trackUserAuthenticated.ts", "../../../../../node_modules/@framerjs/framer-events/lib/esm/generated/AppBackground.js", "../../../../../node_modules/@framerjs/framer-events/lib/esm/generated/AppForeground.js", "../../src/web/lib/usePastDueSubscriptionToast.ts", "../../src/web/lib/useElectronUpdate.ts", "../../src/web/lib/useTracker.ts", "../../src/web/components/TermOfServiceUpdateModal.tsx", "../../src/web/components/TermOfServiceUpdateModal.styles.ts", "../../src/web/lib/useAccountAPI.ts", "../../src/web/lib/useFavIcon.ts", "../../src/web/pages/project/components/useMaintenanceToast.ts", "../../../../../node_modules/zod/v4/mini/schemas.js", "../../src/web/pages/projects/lib/useTeamRecommendations.ts", "../../src/web/components/ConfirmMoveProjectModal.tsx", "../../src/web/lib/showMoveProjectErrorToast.ts", "../../src/web/lib/truncate.ts", "../../src/web/pages/projects/components/ProjectActionConfirmModal.tsx", "../../src/web/pages/projects/lib/useMoveProjectPermissions.ts", "../../src/web/pages/project/lib/useMoveToCollections.ts", "../../src/web/lib/getSpaceName.ts"],
  "sourcesContent": ["import type { WindowWithCurrentUser } from \"@framerjs/app-shared\"\n\ndeclare global {\n\tinterface Window {\n\t\tdataLayer?: Array<Record<string, unknown>>\n\t}\n}\n\nexport function trackUserAuthenticated() {\n\twindow.dataLayer = window.dataLayer || []\n\n\tconst framerUser = (window as WindowWithCurrentUser).framerUser\n\tconst userId = framerUser?.id || null\n\n\tif (userId) {\n\t\twindow.dataLayer.push({\n\t\t\tevent: \"User Authenticated\",\n\t\t\tuser_id: userId,\n\t\t})\n\t}\n}\n", "import { triggerEvent } from \"../listeners\";\nfunction createAppBackgroundEvent(payload) {\n  console.warn(\"[DEPRECATED] Use triggerAppBackgroundEvent instead of createAppBackgroundEvent.\");\n  return {\n    ...payload,\n    event: \"app_background\"\n  };\n}\nconst meta = {\n  track: true\n};\nfunction triggerAppBackgroundEvent(payload) {\n  const event = {\n    ...payload,\n    event: \"app_background\"\n  };\n  triggerEvent(event, meta);\n}\nexport {\n  createAppBackgroundEvent,\n  triggerAppBackgroundEvent\n};\n", "import { triggerEvent } from \"../listeners\";\nfunction createAppForegroundEvent(payload) {\n  console.warn(\"[DEPRECATED] Use triggerAppForegroundEvent instead of createAppForegroundEvent.\");\n  return {\n    ...payload,\n    event: \"app_foreground\"\n  };\n}\nconst meta = {\n  track: true\n};\nfunction triggerAppForegroundEvent(payload) {\n  const event = {\n    ...payload,\n    event: \"app_foreground\"\n  };\n  triggerEvent(event, meta);\n}\nexport {\n  createAppForegroundEvent,\n  triggerAppForegroundEvent\n};\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { triggerUiImpressionEvent, triggerUiInteractionEvent } from \"@framerjs/framer-events\"\nimport { unhandledError } from \"@framerjs/shared\"\nimport {\n\tSubscriptionStatus,\n\tgetBillingPortalUrl,\n} from \"document/components/chrome/siteSettings/Plans/Stripe/api/subscriptions.ts\"\nimport { type ReactNode, useEffect } from \"react\"\nimport { contactSupportURL } from \"utils/staticURLs.ts\"\nimport { apiFetcher } from \"./apiFetcher.ts\"\nimport { toast } from \"./toaster.ts\"\nimport { Pages, UIInteraction } from \"./tracker.ts\"\n\nexport function usePastDueSubscriptionToast(projectId?: string): void {\n\tuseEffect(() => {\n\t\tcheckPastDueSubscriptionsAndShowToast(projectId).catch(unhandledError)\n\t}, [projectId])\n}\n\ninterface ProjectSubscriptionBanner {\n\tprojectId: string\n\taction: string | null // null -> the frontend should show \"contact support\" in this case\n\tstatus: SubscriptionStatus\n\tteamId: string\n}\n\ninterface TeamSubscriptionBanner {\n\tteamId: string\n\tteamDisplayName: string\n\taction: string | null // null -> the frontend should show \"contact support\" in this case\n\tstatus: SubscriptionStatus\n}\n\nfunction showToast(\n\tkey: string,\n\tprimaryText: ReactNode,\n\tsecondaryText: ReactNode | undefined,\n\tlink: string | null,\n\ttitle?: string,\n): void {\n\ttriggerUiImpressionEvent({ page: Pages.subscriptionPastDueToast })\n\ttoast({\n\t\ttype: \"add\",\n\t\tvariant: \"alert\",\n\t\tkey,\n\t\tprimaryText,\n\t\tsecondaryText,\n\t\taction: link\n\t\t\t? {\n\t\t\t\t\ttitle: title ?? \"Update\",\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\ttriggerUiInteractionEvent({\n\t\t\t\t\t\t\tpage: Pages.subscriptionPastDueToast,\n\t\t\t\t\t\t\tid: UIInteraction.updateBilling,\n\t\t\t\t\t\t})\n\t\t\t\t\t\topenNewTab(link)\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttitle: \"Contact Support\",\n\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\ttriggerUiInteractionEvent({\n\t\t\t\t\t\t\tpage: Pages.subscriptionPastDueToast,\n\t\t\t\t\t\t\tid: UIInteraction.contactSupport,\n\t\t\t\t\t\t})\n\t\t\t\t\t\topenNewTab(contactSupportURL)\n\t\t\t\t\t},\n\t\t\t\t},\n\t\tduration: Infinity,\n\t})\n}\n\nasync function checkPastDueSubscriptionsAndShowToast(projectId?: string) {\n\tif (projectId) {\n\t\tconst response = await fetchProjectSubscriptionBanner(projectId)\n\t\tif (response?.status !== SubscriptionStatus.PastDue) {\n\t\t\treturn\n\t\t}\n\t\tshowToast(\n\t\t\t`past-due-project-${projectId}`,\n\t\t\t\"Payment overdue.\",\n\t\t\t\"Update payment method.\",\n\t\t\tgetBillingPortalUrl(response.teamId),\n\t\t\t\"Update\",\n\t\t)\n\t} else {\n\t\tconst response = await fetchTeamSubscriptionBanners()\n\t\tif (response?.status === SubscriptionStatus.PastDue) {\n\t\t\tshowToast(\n\t\t\t\t`past-due-team-${response.teamId}`,\n\t\t\t\t\"Payment overdue\",\n\t\t\t\t`for \u201C${response.teamDisplayName}\u201D.`,\n\t\t\t\tgetBillingPortalUrl(response.teamId),\n\t\t\t\t\"Update\",\n\t\t\t)\n\t\t}\n\t}\n}\n\n/**\n * subscription-banners API\n * - Backend will transparently handle user capabibilites (only return if team editor/admin)\n * - Team past-due subscriptions can be multiple but we only show banner one at a time for simplicity\n */\n\nasync function fetchProjectSubscriptionBanner(projectId?: string): Promise<ProjectSubscriptionBanner | undefined> {\n\tconst response = await apiFetcher.get(`/web/projects/${projectId}/subscription-banners`)\n\treturn response?.banners?.[0]\n}\n\nasync function fetchTeamSubscriptionBanners(): Promise<TeamSubscriptionBanner | undefined> {\n\tconst response = await apiFetcher.get(`/web/teams/subscription-banners`)\n\treturn response?.banners?.[0]\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { isWindows } from \"@framerjs/shared/src/environment.ts\"\nimport { useEffect } from \"react\"\n\nconst updateMessage =\n\t\"There is an update available. This update must be downloaded and installed manually. Future updates will be installed automatically.\"\n\nexport function useElectronUpdate() {\n\tuseEffect(() => {\n\t\tconst needsManualUpdate = isWindows() && navigator.userAgent.includes(\"FramerElectron/2021.8.11\")\n\n\t\tif (needsManualUpdate) {\n\t\t\talert(updateMessage)\n\t\t\topenNewTab(\"https://framer.com/downloads\")\n\t\t}\n\t}, [])\n}\n", "import { triggerAppBackgroundEvent, triggerAppForegroundEvent } from \"@framerjs/framer-events\"\nimport { useCallback, useEffect } from \"react\"\nimport { setContextLegacyProject, setContextProjectId, tracker } from \"./tracker.ts\"\nimport { useVisibleAndFocused } from \"./useVisibleAndFocused.ts\"\n\nexport function useTracker(userId: string, projectId?: string, legacyProject?: boolean) {\n\t// Set project and user ids on the tracker.\n\tuseEffect(() => {\n\t\tif (projectId) setContextProjectId(projectId)\n\t\tsetContextLegacyProject(legacyProject)\n\t\ttracker.setUserId(userId)\n\t}, [projectId, userId, legacyProject])\n\tconst handleStateChange = useCallback((isVisibleAndFocused: boolean) => {\n\t\tif (isVisibleAndFocused) {\n\t\t\ttriggerAppForegroundEvent({})\n\t\t} else {\n\t\t\ttriggerAppBackgroundEvent({})\n\t\t}\n\t}, [])\n\t// Trigger backgrounding/foregrounding of the tab.\n\tuseVisibleAndFocused(handleStateChange)\n}\n", "import { Button, CustomModal, IconFramerLogo, Stack } from \"@framerjs/fresco\"\nimport type { ModalThemeProps } from \"@framerjs/fresco/components/CustomModal\"\nimport * as React from \"react\"\nimport { apiFetcher } from \"../lib/apiFetcher.ts\"\nimport { Separator } from \"./Separator.tsx\"\nimport * as styles from \"./TermOfServiceUpdateModal.styles.ts\"\n\ntype Props = ModalThemeProps & {\n\tfetchMe: () => void\n}\n\nexport function TermOfServiceUpdateModal({ fetchMe, ...modalThemeProps }: Props) {\n\tconst [inProgress, setInProgress] = React.useState(false)\n\n\tconst onConfirm = React.useCallback(\n\t\tasync (event: React.FormEvent) => {\n\t\t\tevent.preventDefault()\n\t\t\tif (inProgress) return\n\t\t\tsetInProgress(true)\n\t\t\tawait postConfirm()\n\t\t\tawait fetchMe()\n\t\t\tsetInProgress(false)\n\t\t},\n\t\t[inProgress, fetchMe],\n\t)\n\n\treturn (\n\t\t<CustomModal\n\t\t\tdata-testid=\"update-terms-of-service\"\n\t\t\thasBackdrop\n\t\t\tvisible\n\t\t\tclassName={styles.modal}\n\t\t\t{...modalThemeProps}\n\t\t>\n\t\t\t<form onSubmit={onConfirm}>\n\t\t\t\t<Stack gap={18} padding={35}>\n\t\t\t\t\t<div className={styles.framerLogo}>\n\t\t\t\t\t\t<IconFramerLogo />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className={styles.title}>Terms Update</div>\n\t\t\t\t\t<div className={styles.description}>\n\t\t\t\t\t\tWe updated our{\" \"}\n\t\t\t\t\t\t<a target=\"_blank\" href=\"https://www.framer.com/legal/terms-of-service/\">\n\t\t\t\t\t\t\tTerms of Service\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t. Please review these updates and opt-in to continue using Framer.\n\t\t\t\t\t</div>\n\t\t\t\t\t<Separator height={15} />\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\ttitle=\"Agree & Continue\"\n\t\t\t\t\t\tenabled={!inProgress}\n\t\t\t\t\t\taria-label=\"agree-and-confirm\"\n\t\t\t\t\t>\n\t\t\t\t\t\tAgree & Continue\n\t\t\t\t\t</Button>\n\t\t\t\t</Stack>\n\t\t\t</form>\n\t\t</CustomModal>\n\t)\n}\n\nfunction postConfirm(): Promise<void> {\n\treturn apiFetcher.post(\"/web/users/consent\")\n}\n", "import \"TermOfServiceUpdateModal.styles_tz2mmk.wyw.css\"; export const modal = \"modal_m5o513k\";\nexport const title = \"title_t1q5o0b1\";\nexport const description = \"description_d1gsacgx\";\nexport const framerLogo = \"framerLogo_f1r27xga\";", "import type { CurrentUser, TeamConfiguration, TeamLicense, UserEnrichmentInfo } from \"@framerjs/app-shared\"\nimport { TeamMemberRole, isOrganizationSpace, isTrustedFontAsset } from \"@framerjs/app-shared\"\nimport type { Asset, AssetFontProperties } from \"@framerjs/assets\"\nimport { getAssetFilename } from \"@framerjs/assets\"\nimport { experiments } from \"app/experiments.ts\"\nimport { fontStore } from \"library/render/fonts/fontStore.ts\"\nimport type { Dispatch, SetStateAction } from \"react\"\nimport { useMemo, useState } from \"react\"\nimport type { FontData, FontInfo } from \"web/pages/project/lib/UploadService.ts\"\nimport { shutdownIntercom } from \"web/pages/projects/lib/contactSupport.ts\"\nimport type { AccountSettings, Preferences, Profile, ProfileUpdate, Session } from \"./AccountSettings.ts\"\nimport type { InvitedUser, MaybeTeam, Team } from \"./TeamSettings.ts\"\nimport { apiFetcher } from \"./apiFetcher.ts\"\nimport { fileFromURL } from \"./fileFromURL.ts\"\nimport type { FormFieldSet } from \"./files.ts\"\nimport { UploadError, upload } from \"./files.ts\"\nimport { toast } from \"./toaster.ts\"\nimport type { OnToastCallbackAction } from \"./upload.ts\"\nimport { uploadWithToast } from \"./upload.ts\"\n\ninterface UpdateOrganizationAvatarParams {\n\torganizationId: string\n\tavatar: string\n}\n\ninterface UpdateOrganizationDisplayNameParams {\n\torganizationId: string\n\tdisplayName: string\n}\n\nexport interface UpdateTeamInviteByLinkPermissionParams {\n\tteamId: string\n\tjoinLinkEnabled: boolean\n}\n\n// See https://github.com/framer/font-metadata-extractor for the source of these error reasons.\nenum FontUploadErrorReason {\n\tMissingWeightStyleMetadata = \"missing_weight_style_metadata\",\n\tInvalidWeight = \"invalid_weight\",\n\tUnsupportedFontCollection = \"unsupported_font_collection\",\n\tInvalidFontFile = \"invalid_font_file\",\n}\n\nfunction getFontUploadErrorMessage(reason: string): string | undefined {\n\tswitch (reason) {\n\t\tcase FontUploadErrorReason.MissingWeightStyleMetadata:\n\t\t\treturn \"Font is missing weight and style information\"\n\t\tcase FontUploadErrorReason.InvalidWeight:\n\t\t\treturn \"Invalid font weight\"\n\t\tcase FontUploadErrorReason.UnsupportedFontCollection:\n\t\t\treturn \"Font collections are not supported\"\n\t\tcase FontUploadErrorReason.InvalidFontFile:\n\t\t\treturn \"Invalid font file\"\n\t\tdefault:\n\t\t\treturn undefined\n\t}\n}\n\nclass AccountAPI {\n\tconstructor(private readonly apiBaseURL: string) {}\n\n\tasync getMe(): Promise<CurrentUser> {\n\t\treturn apiFetcher.get(\"/web/users/me\")\n\t}\n\n\tasync getEnrichmentInfo(): Promise<UserEnrichmentInfo> {\n\t\tconst response = await apiFetcher.get(\"/web/enrichment/users/me\")\n\t\treturn { companySize: response?.companySize ?? 0 }\n\t}\n\n\tasync getProfile(): Promise<Profile> {\n\t\treturn apiFetcher.get(\"/account/profile\")\n\t}\n\n\tasync updateProfile(update: ProfileUpdate): Promise<void> {\n\t\treturn apiFetcher.put(\"/account/profile\", update)\n\t}\n\n\tasync uploadUserAvatar(fields: FormFieldSet): Promise<{ avatar: string }> {\n\t\treturn upload(`${this.apiBaseURL}/account/avatars/users`, fields)\n\t}\n\n\tasync getSessions(): Promise<Session[]> {\n\t\treturn apiFetcher.get(\"/account/sessions\")\n\t}\n\n\tasync getAssets(teamId: string): Promise<Asset[]> {\n\t\tconst response: { assets: Asset[] } = await apiFetcher.get(`/web/teams/${teamId}/assets`)\n\t\treturn response.assets\n\t}\n\n\tasync uploadFonts(teamId: string, fontsData?: FontData[]): Promise<FontInfo[]> {\n\t\tconst result: FontInfo[] = []\n\n\t\tif (!fontsData) {\n\t\t\treturn result\n\t\t}\n\n\t\t// TODO: Parallel.\n\t\tfor (const font of fontsData) {\n\t\t\tconst file = await fileFromURL(font.content, font.originalFilename)\n\t\t\tconst info = await uploadWithToast<Asset>({\n\t\t\t\tendpoint: `${this.apiBaseURL}/web/teams/${teamId}/assets`,\n\t\t\t\tfieldName: \"file\",\n\t\t\t\tfile,\n\t\t\t\ticon: \"image\",\n\t\t\t\tonToast: (opts: OnToastCallbackAction) => {\n\t\t\t\t\t// Disable progress and success toasts - we will instead show a single success toast ourselves after all uploads are complete.\n\t\t\t\t\t// We will allow error toasts - they provide useful information which may differ for each font.\n\t\t\t\t\tif (opts.variant === \"progress\" || opts.variant === \"success\") return\n\t\t\t\t\ttoast(opts)\n\t\t\t\t},\n\t\t\t\tgetErrorMessage: (error: Error) => {\n\t\t\t\t\tif (error instanceof UploadError) {\n\t\t\t\t\t\tconst reason = error.data?.reason\n\t\t\t\t\t\tif (typeof reason === \"string\") {\n\t\t\t\t\t\t\treturn getFontUploadErrorMessage(reason)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined\n\t\t\t\t},\n\t\t\t})\n\n\t\t\tif (!info || !info.properties) continue\n\t\t\tresult.push({\n\t\t\t\tfilename: getAssetFilename(info),\n\t\t\t\toriginalFontName: info.name,\n\t\t\t\tproperties: info.properties.font,\n\t\t\t})\n\t\t}\n\n\t\treturn result\n\t}\n\n\tasync endSession(sessionId: string): Promise<void> {\n\t\tshutdownIntercom()\n\t\treturn apiFetcher.delete(`/account/sessions/${sessionId}`)\n\t}\n\n\tasync getTeam(id: string): Promise<Team> {\n\t\treturn apiFetcher.get(`/account/teams/${id}?includeContentEditors=true&includeUsageData=true`)\n\t}\n\n\tasync getLicenseForTeam(teamId: string): Promise<TeamLicense> {\n\t\treturn apiFetcher.get(`/account/teams/${teamId}/license`)\n\t}\n\n\tasync cancelTeamSubscription(teamId: string) {\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/subscription`)\n\t}\n\n\tasync inviteMembers(options: { teamId: string; members: string[]; role: string }): Promise<InvitedUser[]> {\n\t\treturn apiFetcher.post(\"/account/teams/createTeamInvites\", options)\n\t}\n\n\tasync createTeam(options: { teamName: string }): Promise<Team> {\n\t\treturn apiFetcher.post(\"/account/teams\", options)\n\t}\n\n\tasync updateTeam(options: { teamId: string; name?: string; configuration?: Partial<TeamConfiguration> }) {\n\t\tconst { teamId, name, configuration } = options\n\t\treturn apiFetcher.put(`/account/teams/${teamId}`, { name, configuration })\n\t}\n\n\tasync updateTeamInviteByLinkPermission(options: UpdateTeamInviteByLinkPermissionParams) {\n\t\tconst { teamId, joinLinkEnabled } = options\n\t\treturn apiFetcher.post(`/web/teams/${teamId}/join-link`, { joinLinkEnabled })\n\t}\n\n\tasync uploadTeamAvatar(fields: FormFieldSet): Promise<{ avatar: string }> {\n\t\treturn upload(`${this.apiBaseURL}/account/avatars/teams`, fields)\n\t}\n\n\tasync deleteTeam(teamId: string) {\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}`)\n\t}\n\n\t/**\n\t * Deletes one or more assets from the team by key.\n\t * The deletion is idempotent, any keys not found (e.g. already deleted) will be silently ignored.\n\t * @param teamId - The id of the team to delete the assets from.\n\t * @param keys - The keys of the assets to delete.\n\t */\n\tasync deleteTeamAssets(teamId: string, keys: string[]) {\n\t\treturn apiFetcher.delete(`/web/teams/${teamId}/assets/batch`, { keys })\n\t}\n\n\tasync updateMemberRole(options: { teamId: string; memberId: string; role: TeamMemberRole }) {\n\t\tconst { teamId, memberId, role } = options\n\t\treturn apiFetcher.put(`/account/teams/${teamId}/members/${memberId}`, { role })\n\t}\n\n\tasync removeMember(options: { teamId: string; memberId: string }) {\n\t\tconst { teamId, memberId } = options\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/members/${memberId}`)\n\t}\n\n\tasync removeSelfFromMembers(options: { teamId: string }) {\n\t\tconst { teamId } = options\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/members/self`)\n\t}\n\n\tasync removeExternalEditor(options: { teamId: string; memberId: string }) {\n\t\tconst { teamId, memberId } = options\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/members/${memberId}/external`)\n\t}\n\n\tasync removeSelfAsExternalEditor(options: { teamId: string }) {\n\t\tconst { teamId } = options\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/members/self/external`)\n\t}\n\n\tasync removeInvitedUser(options: { teamId: string; inviteId: string }) {\n\t\tconst { teamId, inviteId } = options\n\t\treturn apiFetcher.delete(`/account/teams/${teamId}/invites/${inviteId}`)\n\t}\n\n\tasync getPasskeys() {\n\t\treturn apiFetcher.get(\"/auth/passkeys\")\n\t}\n\n\tasync getPreferences<K extends keyof Preferences>(keys: K[]): Promise<Pick<Preferences, K>> {\n\t\treturn apiFetcher.post(\"/web/users/preferences/query\", { keys })\n\t}\n\n\tasync patchPreferences(preferences: Partial<Preferences>): Promise<void> {\n\t\tawait apiFetcher.patch(\"/web/users/preferences\", preferences)\n\t}\n}\n\nexport interface AccountApi {\n\t// Exposed API calls\n\tcancelTeamSubscription: (teamId: string) => Promise<void>\n\tfetchMe: () => Promise<void>\n\tfetchEnrichmentInfo: () => Promise<void>\n\tdeleteTeam: (teamId: string) => Promise<void>\n\tdeleteTeamAssets: (teamId: string, keys: string[]) => Promise<void>\n\tfetchProfile: () => Promise<void>\n\tupdateProfile: (update: ProfileUpdate) => Promise<void>\n\tfetchFonts: (teamId: string) => Promise<void>\n\tfetchSessions: () => Promise<void>\n\tfetchPasskeys: () => Promise<void>\n\tfetchPreferences: (keys: (keyof Preferences)[]) => Promise<void>\n\tupdatePreferences: (preferences: Partial<Preferences>) => Promise<void>\n\tendSession: (sessionId: string) => Promise<void>\n\tfetchTeam: (teamId: string) => Promise<void>\n\tinviteMembers: (options: { teamId: string; members: string[]; role: TeamMemberRole }) => Promise<void>\n\tcreateTeam: (options: { teamName: string; organizationId: string | undefined }) => Promise<Team>\n\tupdateTeam: (options: { teamId: string; name?: string; configuration?: Partial<TeamConfiguration> }) => Promise<void>\n\tupdateTeamInviteByLinkPermission: (options: UpdateTeamInviteByLinkPermissionParams) => void\n\tuploadFonts: (teamId: string, fontsData?: FontData[]) => Promise<FontInfo[]>\n\tuploadTeamAvatar: (options: { teamId: string; avatar: File }) => Promise<void>\n\tuploadUserAvatar: (options: { avatar: File }) => Promise<void>\n\tupdateOrganizationAvatar: (options: UpdateOrganizationAvatarParams) => void\n\tupdateOrganizationDisplayName: (options: UpdateOrganizationDisplayNameParams) => void\n\tupdateMemberRole: (options: { teamId: string; memberId: string; role: TeamMemberRole }) => Promise<void>\n\tremoveMember: (options: { teamId: string; memberId: string }) => Promise<void>\n\tremoveSelf: (teamId: string, externalEditor: boolean) => Promise<void>\n\tremoveExternalEditor: (options: { teamId: string; memberId: string }) => Promise<void>\n\tremoveInvitedUser: (options: { teamId: string; inviteId: string }) => Promise<void>\n\tresetAccount: () => void\n\tresetTeam: () => void\n\tresetFonts: () => void\n\t// Exposed values\n\tfonts: (Asset & { properties: AssetFontProperties })[]\n\tteam: MaybeTeam\n\taccount: Partial<AccountSettings> | undefined\n\tuserEnrichmentInfo: UserEnrichmentInfo | undefined\n}\n\nexport function useAccountAPI(apiBaseURL: string, setUser: Dispatch<SetStateAction<CurrentUser>>): AccountApi {\n\tconst api = useMemo(() => new AccountAPI(apiBaseURL), [apiBaseURL])\n\tconst [account, setAccount] = useState<Partial<AccountSettings>>()\n\tconst [team, setTeam] = useState<MaybeTeam>(null)\n\tconst [fonts, setFonts] = useState<(Asset & { properties: AssetFontProperties })[]>([])\n\tconst [userEnrichmentInfo, setUserEnrichmentInfo] = useState<UserEnrichmentInfo | undefined>()\n\n\tconst exposedApiCalls = useMemo(() => {\n\t\tasync function fetchMe() {\n\t\t\tconst response = await api.getMe()\n\t\t\tsetUser(response)\n\t\t}\n\n\t\tasync function fetchEnrichmentInfo() {\n\t\t\tconst response = await api.getEnrichmentInfo()\n\t\t\tsetUserEnrichmentInfo(response)\n\t\t}\n\n\t\tasync function fetchProfile() {\n\t\t\tconst profile = await api.getProfile()\n\t\t\tsetAccount(prevState => ({\n\t\t\t\t...prevState,\n\t\t\t\tprofile,\n\t\t\t}))\n\t\t}\n\n\t\tasync function updateProfile(update: ProfileUpdate) {\n\t\t\tawait api.updateProfile(update)\n\t\t\tsetAccount(prevState => {\n\t\t\t\tif (!prevState?.profile) {\n\t\t\t\t\treturn prevState\n\t\t\t\t}\n\t\t\t\tconst newProfileData: {\n\t\t\t\t\tfirstName: string\n\t\t\t\t\tlastName: string\n\t\t\t\t\tpendingEmail: string | undefined\n\t\t\t\t} = {\n\t\t\t\t\tfirstName: update.firstName,\n\t\t\t\t\tlastName: update.lastName,\n\t\t\t\t\tpendingEmail: update.email,\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tprofile: { ...prevState.profile, ...newProfileData },\n\t\t\t\t}\n\t\t\t})\n\t\t\tsetUser(prevState => {\n\t\t\t\treturn { ...prevState, name: `${update.firstName} ${update.lastName}` }\n\t\t\t})\n\t\t}\n\n\t\tasync function uploadUserAvatar(options: { avatar: File }) {\n\t\t\tconst { avatar } = await api.uploadUserAvatar(options)\n\t\t\tsetUser(prevState => ({ ...prevState, avatar }))\n\t\t\tsetAccount(prevState => {\n\t\t\t\tif (!prevState?.profile) {\n\t\t\t\t\treturn prevState\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tprofile: {\n\t\t\t\t\t\t...prevState.profile,\n\t\t\t\t\t\tavatar,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function fetchFonts(teamId: string) {\n\t\t\tconst assets = await api.getAssets(teamId)\n\t\t\tconst fontAssets: (Asset & { properties: AssetFontProperties })[] = assets.filter(isTrustedFontAsset)\n\n\t\t\tsetFonts(fontAssets)\n\t\t\t// Mapping the ownerType to ownerTypes is not really nice, but we do not use the AssetMap here,\n\t\t\t// which usually does this conversion. We can safely map it here because we know all of\n\t\t\t// these fonts are team fonts.\n\t\t\tconst assetWithOwnerTypes = fontAssets.map(asset => ({\n\t\t\t\t...asset,\n\t\t\t\townerTypes: [asset.ownerType],\n\t\t\t}))\n\t\t\tconst isCustomFontGroupingEnabled = experiments.isOn(\"customFontGrouping\")\n\n\t\t\t// This synchronously updates the font store.\n\t\t\tfontStore.importCustomFonts(assetWithOwnerTypes, isCustomFontGroupingEnabled)\n\t\t}\n\n\t\tasync function fetchSessions() {\n\t\t\tconst sessionsData = await api.getSessions()\n\n\t\t\t// Separate sessions from CLI tokens\n\t\t\tconst sessions = sessionsData.filter(session => !session.isRegistryOnly)\n\t\t\tconst tokens = sessionsData.filter(session => session.isRegistryOnly)\n\n\t\t\tsetAccount(prevState => ({\n\t\t\t\t...prevState,\n\t\t\t\tsessions,\n\t\t\t\ttokens,\n\t\t\t}))\n\t\t}\n\n\t\tasync function endSession(sessionId: string) {\n\t\t\tawait api.endSession(sessionId)\n\t\t\tawait fetchSessions()\n\t\t}\n\n\t\tasync function fetchTeam(teamId: string) {\n\t\t\tconst response = await api.getTeam(teamId)\n\t\t\tsetTeam(response)\n\t\t}\n\n\t\tasync function inviteMembers(options: { teamId: string; members: string[]; role: TeamMemberRole }) {\n\t\t\tconst { teamId } = options\n\t\t\tconst invites = await api.inviteMembers(options)\n\t\t\tconst license = await api.getLicenseForTeam(teamId)\n\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tlicense,\n\t\t\t\t\tinvitedUsers: [...invites, ...(prevState.invitedUsers || [])],\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function createTeam(options: { teamName: string; organizationId?: string }) {\n\t\t\tconst createdTeam = await api.createTeam(options)\n\t\t\tsetTeam(createdTeam)\n\t\t\treturn createdTeam\n\t\t}\n\n\t\tasync function updateTeam(options: { teamId: string; name?: string; configuration?: Partial<TeamConfiguration> }) {\n\t\t\tconst { name, configuration, teamId } = options\n\t\t\tawait api.updateTeam(options)\n\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tteamName: name || prevState.teamName,\n\t\t\t\t\tconfiguration: { ...prevState.configuration, ...configuration },\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Update the sidebar accordingly when we update the team's name\n\t\t\tif (name) {\n\t\t\t\tsetUser(prevState => ({\n\t\t\t\t\t...prevState,\n\t\t\t\t\tspaces: prevState.spaces.map(space => {\n\t\t\t\t\t\tif (isOrganizationSpace(space) && space.ownerId === teamId) {\n\t\t\t\t\t\t\treturn { ...space, displayName: name }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn space\n\t\t\t\t\t}),\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\n\t\tasync function updateTeamInviteByLinkPermission(options: UpdateTeamInviteByLinkPermissionParams) {\n\t\t\tconst { joinLinkEnabled, teamId } = options\n\t\t\tawait api.updateTeamInviteByLinkPermission(options)\n\n\t\t\t// Sidebar item \"Copy Invite Link\" relies on the space configuration\n\t\t\tsetUser(prevState => {\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tspaces: prevState.spaces.map(space => {\n\t\t\t\t\t\tif (isOrganizationSpace(space) && space.ownerId === teamId) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...space,\n\t\t\t\t\t\t\t\tconfiguration: {\n\t\t\t\t\t\t\t\t\t...space.configuration,\n\t\t\t\t\t\t\t\t\tjoinLinkEnabled,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn space\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tsetTeam(prevState => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tconfiguration: {\n\t\t\t\t\t\t...prevState.configuration,\n\t\t\t\t\t\tjoinLinkEnabled,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function uploadFonts(teamId: string, fontsData?: FontData[]) {\n\t\t\treturn api.uploadFonts(teamId, fontsData)\n\t\t}\n\n\t\tasync function uploadTeamAvatar(options: { teamId: string; avatar: File }) {\n\t\t\tconst { teamId } = options\n\t\t\tconst { avatar } = await api.uploadTeamAvatar(options)\n\n\t\t\tsetTeam(prevState => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn { ...prevState, avatar }\n\t\t\t})\n\t\t\tsetUser(prevState => {\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tspaces: prevState.spaces.map(space => {\n\t\t\t\t\t\tif (isOrganizationSpace(space) && space.ownerId === teamId) {\n\t\t\t\t\t\t\treturn { ...space, avatar }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn space\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function deleteTeam(teamId: string) {\n\t\t\tawait api.deleteTeam(teamId)\n\t\t\tawait fetchMe()\n\t\t}\n\n\t\t/**\n\t\t * Deletes one or more assets from the team by key.\n\t\t * The deletion is idempotent, any keys not found (e.g. already deleted) will be silently ignored.\n\t\t * @param teamId - The id of the team to delete the assets from.\n\t\t * @param keys - The keys of the assets to delete.\n\t\t */\n\t\tasync function deleteTeamAssets(teamId: string, keys: string[]) {\n\t\t\tawait api.deleteTeamAssets(teamId, keys)\n\t\t}\n\n\t\tasync function cancelTeamSubscription(teamId: string) {\n\t\t\tawait api.cancelTeamSubscription(teamId)\n\t\t\tconst [license] = await Promise.all([api.getLicenseForTeam(teamId)])\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tlicense,\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function updateMemberRole(options: { teamId: string; memberId: string; role: TeamMemberRole }) {\n\t\t\tconst { teamId, memberId, role } = options\n\t\t\tlet previousRole: TeamMemberRole | undefined = undefined\n\n\t\t\t// Update UI right away\n\t\t\tsetTeam(prevState => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tmembers: prevState.members.map(member => {\n\t\t\t\t\t\tif (member.userId === memberId) {\n\t\t\t\t\t\t\t// Keep track of previous role assigned to this member\n\t\t\t\t\t\t\tpreviousRole = member.role\n\t\t\t\t\t\t\treturn { ...member, role }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn member\n\t\t\t\t\t}),\n\t\t\t\t}\n\t\t\t})\n\n\t\t\ttry {\n\t\t\t\tawait api.updateMemberRole(options)\n\t\t\t\tconst license = await api.getLicenseForTeam(teamId)\n\n\t\t\t\t// Update state with fetched license, so we can eg. prevent more invites to be sent\n\t\t\t\tsetTeam(prevState => {\n\t\t\t\t\tif (!prevState) return prevState\n\t\t\t\t\treturn { ...prevState, license }\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\t// Reset member to old role if something went wrong\n\t\t\t\tsetTeam(prevState => {\n\t\t\t\t\tif (!prevState) return prevState\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prevState,\n\t\t\t\t\t\tmembers: prevState.members.map(member => {\n\t\t\t\t\t\t\tif (member.userId === memberId && previousRole) {\n\t\t\t\t\t\t\t\treturn { ...member, role: previousRole }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn member\n\t\t\t\t\t\t}),\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tasync function removeMember(options: { teamId: string; memberId: string }) {\n\t\t\tconst { teamId, memberId } = options\n\n\t\t\tawait api.removeMember({ teamId, memberId })\n\n\t\t\tconst license = await api.getLicenseForTeam(teamId)\n\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tlicense,\n\t\t\t\t\tmembers: prevState.members.filter(member => member.userId !== memberId),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function removeSelf(teamId: string, externalEditor: boolean) {\n\t\t\tif (externalEditor) {\n\t\t\t\tawait api.removeSelfAsExternalEditor({ teamId })\n\t\t\t} else {\n\t\t\t\tawait api.removeSelfFromMembers({ teamId })\n\t\t\t}\n\t\t}\n\n\t\tasync function removeExternalEditor(options: { teamId: string; memberId: string }) {\n\t\t\tconst { teamId, memberId } = options\n\t\t\tawait api.removeExternalEditor({ teamId, memberId })\n\t\t\tconst license = await api.getLicenseForTeam(teamId)\n\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) {\n\t\t\t\t\treturn prevState\n\t\t\t\t}\n\n\t\t\t\tconst updatedMembers = prevState.members\n\t\t\t\t\t// This action is called to remove any \"edit\" permissions from projects\n\t\t\t\t\t// of a member that does not have \"edit\" permissions in a team:\n\t\t\t\t\t// 1. If this team member has an \"external\" role, this member will get\n\t\t\t\t\t//    removed from the team.\n\t\t\t\t\t.filter(member => !(member.userId === memberId && member.role === TeamMemberRole.ExternalEditor))\n\t\t\t\t\t// 2. If this team member has a \"viewer\" role, this member will\n\t\t\t\t\t//    will remain on the team as a viewer and only get project\n\t\t\t\t\t//    \"edit\" permissions removed\n\t\t\t\t\t.map(member => {\n\t\t\t\t\t\tif (member.userId !== memberId) {\n\t\t\t\t\t\t\treturn member\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { ...member, isProjectEditor: false }\n\t\t\t\t\t})\n\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tlicense,\n\t\t\t\t\tmembers: updatedMembers,\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tasync function removeInvitedUser(options: { teamId: string; inviteId: string }) {\n\t\t\tconst { inviteId } = options\n\t\t\tawait api.removeInvitedUser(options)\n\n\t\t\tsetTeam((prevState: MaybeTeam) => {\n\t\t\t\tif (!prevState) return prevState\n\t\t\t\treturn {\n\t\t\t\t\t...prevState,\n\t\t\t\t\tinvitedUsers: prevState.invitedUsers.filter(invitedUser => invitedUser.id !== inviteId),\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tfunction resetAccount() {\n\t\t\tsetAccount(undefined)\n\t\t}\n\n\t\tfunction resetTeam() {\n\t\t\tsetTeam(null)\n\t\t}\n\n\t\tfunction resetFonts() {\n\t\t\tsetFonts([])\n\t\t}\n\n\t\tfunction updateOrganizationAvatar(options: UpdateOrganizationAvatarParams) {\n\t\t\tconst { organizationId, avatar } = options\n\n\t\t\tsetUser(prevState => ({\n\t\t\t\t...prevState,\n\t\t\t\tspaces: prevState.spaces.map(space => {\n\t\t\t\t\tif (isOrganizationSpace(space) && space.organization?.id === organizationId) {\n\t\t\t\t\t\treturn { ...space, organization: { ...space.organization, avatar } }\n\t\t\t\t\t}\n\n\t\t\t\t\treturn space\n\t\t\t\t}),\n\t\t\t}))\n\t\t}\n\n\t\tfunction updateOrganizationDisplayName(options: UpdateOrganizationDisplayNameParams) {\n\t\t\tconst { organizationId, displayName } = options\n\n\t\t\tsetUser(prevState => ({\n\t\t\t\t...prevState,\n\t\t\t\tspaces: prevState.spaces.map(space => {\n\t\t\t\t\tif (isOrganizationSpace(space) && space.organization?.id === organizationId) {\n\t\t\t\t\t\treturn { ...space, organization: { ...space.organization, displayName } }\n\t\t\t\t\t}\n\n\t\t\t\t\treturn space\n\t\t\t\t}),\n\t\t\t}))\n\t\t}\n\n\t\tasync function fetchPasskeys() {\n\t\t\tif (experiments.isOn(\"passkeys\")) {\n\t\t\t\tconst passkeys = await api.getPasskeys()\n\t\t\t\tsetAccount(prevState => ({\n\t\t\t\t\t...prevState,\n\t\t\t\t\tpasskeys,\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\n\t\tasync function fetchPreferences(keys: (keyof Preferences)[]) {\n\t\t\tif (experiments.isOn(\"passkeys\")) {\n\t\t\t\tconst preferences = await api.getPreferences(keys)\n\t\t\t\tsetAccount(prevState => ({\n\t\t\t\t\t...prevState,\n\t\t\t\t\tpreferences: { ...prevState?.preferences, ...preferences },\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\n\t\tasync function updatePreferences(preferences: Partial<Preferences>) {\n\t\t\tawait api.patchPreferences(preferences)\n\t\t\tsetAccount(prevState => ({\n\t\t\t\t...prevState,\n\t\t\t\tpreferences: { ...prevState?.preferences, ...preferences },\n\t\t\t}))\n\t\t}\n\n\t\treturn {\n\t\t\tcancelTeamSubscription,\n\t\t\tdeleteTeam,\n\t\t\tdeleteTeamAssets,\n\t\t\tendSession,\n\t\t\tfetchMe,\n\t\t\tfetchEnrichmentInfo,\n\t\t\tfetchProfile,\n\t\t\tfetchPasskeys,\n\t\t\tfetchPreferences,\n\t\t\tupdatePreferences,\n\t\t\tfetchTeam,\n\t\t\tfetchFonts,\n\t\t\tfetchSessions,\n\t\t\tinviteMembers,\n\t\t\tcreateTeam,\n\t\t\tupdateTeam,\n\t\t\tupdateTeamInviteByLinkPermission,\n\t\t\tuploadFonts,\n\t\t\tuploadTeamAvatar,\n\t\t\tuploadUserAvatar,\n\t\t\tupdateMemberRole,\n\t\t\tupdateProfile,\n\t\t\tupdateOrganizationAvatar,\n\t\t\tupdateOrganizationDisplayName,\n\t\t\tremoveMember,\n\t\t\tremoveSelf,\n\t\t\tremoveExternalEditor,\n\t\t\tremoveInvitedUser,\n\t\t\tresetAccount,\n\t\t\tresetTeam,\n\t\t\tresetFonts,\n\t\t}\n\t}, [api, setUser])\n\n\treturn useMemo(() => {\n\t\treturn { ...exposedApiCalls, team, fonts, account, userEnrichmentInfo }\n\t}, [exposedApiCalls, team, fonts, account, userEnrichmentInfo])\n}\n", "import { useEffect } from \"react\"\nimport faviconLight from \"../assets/favicon-light@2x.png\"\nimport favicon from \"../assets/favicon.png\"\nimport faviconDark from \"../assets/favicon@2x.png\"\nimport safariPinnedTab from \"../assets/safari-pinned-tab.svg\"\n\nfunction applyLogo(isDark: boolean) {\n\tconst color = isDark ? \"#fff\" : \"#000\"\n\tconst url = isDark ? faviconLight : faviconDark\n\tdocument.querySelectorAll(\"link[rel='mask-icon']\").forEach(link => {\n\t\tlink.setAttribute(\"color\", color)\n\t})\n\tdocument.querySelectorAll(\"link[rel='icon']\").forEach(link => {\n\t\tlink.setAttribute(\"href\", url)\n\t})\n\n\t// Expressions that don\u2019t not do anything, but keeps the import in the code,\n\t// so the referred files can be included in the HTML templates.\n\t// NOTE: These are part of a function body, else the minification will\n\t// optimize them out.\n\t// eslint-disable-next-line no-unused-expressions\n\tfavicon\n\t// eslint-disable-next-line no-unused-expressions\n\tsafariPinnedTab\n}\n\nfunction isDarkHandler(event: MediaQueryListEvent) {\n\tapplyLogo(event.matches)\n}\n\nexport function swapFavIcons() {\n\tconst isDarkQuery = window.matchMedia(\"(prefers-color-scheme: dark)\")\n\tapplyLogo(isDarkQuery.matches)\n\tisDarkQuery.addListener(isDarkHandler)\n\treturn () => {\n\t\tisDarkQuery.removeListener(isDarkHandler)\n\t}\n}\n\nexport function useFavIcon() {\n\tuseEffect(() => {\n\t\treturn swapFavIcons()\n\t}, [])\n}\n", "import { openNewTab } from \"@framerjs/app-shared\"\nimport { getLogger } from \"@framerjs/shared\"\nimport React from \"react\"\nimport { toast } from \"web/lib/toaster.ts\"\nimport { useLocalStorage } from \"web/lib/useLocalStorage.ts\"\nimport * as z from \"zod/v4-mini\"\n\nconst logger = getLogger(\"useMaintenanceToast\")\n\ninterface MaintenanceInfo {\n\tid: string\n\ttitle: string\n\tmessage: string\n\tstartsAt: Date\n\tendsAt: Date\n\tstatusPageUrl: string\n}\n\nconst toastKey = \"maintenanceToast\"\n// These are the resource IDs from BetterStack that apply to the editor\nconst editorResourceIds = [\"8530143\", \"8530144\"]\nconst maintenanceAcknowledgedIdKey = \"maintenanceAcknowledgedId\"\n\nconst StatusUpdateSchema = z.looseObject({\n\tid: z.string(),\n\ttype: z.literal(\"status_update\"),\n\tattributes: z.looseObject({\n\t\tmessage: z.string(),\n\t}),\n})\n\nconst StatusReportSchema = z.looseObject({\n\tid: z.string(),\n\ttype: z.literal(\"status_report\"),\n\tattributes: z.looseObject({\n\t\ttitle: z.string(),\n\t\treport_type: z.enum([\"maintenance\", \"incident\", \"outage\"]),\n\t\tstarts_at: z.string(),\n\t\tends_at: z.union([z.string(), z.literal(null)]),\n\t\taffected_resources: z.array(\n\t\t\tz.looseObject({\n\t\t\t\tstatus_page_resource_id: z.string(),\n\t\t\t}),\n\t\t),\n\t}),\n\trelationships: z.looseObject({\n\t\tstatus_updates: z.looseObject({\n\t\t\tdata: z.array(\n\t\t\t\tz.looseObject({\n\t\t\t\t\tid: z.string(),\n\t\t\t\t\ttype: z.literal(\"status_update\"),\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t}),\n})\n\nconst BetterStackResponseSchema = z.looseObject({\n\tdata: z.looseObject({\n\t\tattributes: z.looseObject({\n\t\t\tcustom_domain: z.string(),\n\t\t}),\n\t}),\n\tincluded: z.array(\n\t\tz.union([\n\t\t\tStatusUpdateSchema,\n\t\t\tStatusReportSchema,\n\t\t\tz.looseObject({\n\t\t\t\tid: z.string(),\n\t\t\t\ttype: z.string(),\n\t\t\t}),\n\t\t]),\n\t),\n})\n\ntype StatusReport = z.infer<typeof StatusReportSchema>\ntype StatusUpdate = z.infer<typeof StatusUpdateSchema>\n\n// Maintenance reports always have an end time, see https://betterstack.com/docs/uptime/api/create-a-new-status-page-report/\ntype MaintenanceStatusReport = StatusReport & {\n\tattributes: StatusReport[\"attributes\"] & {\n\t\treport_type: \"maintenance\"\n\t\tends_at: string\n\t}\n}\n\nfunction isEditorMaintenanceReport(report: StatusReport): report is MaintenanceStatusReport {\n\tif (report.attributes.report_type !== \"maintenance\") {\n\t\treturn false\n\t}\n\tif (report.attributes.ends_at === null) {\n\t\tlogger.reportError(new Error(`Maintenance report ${report.id} is missing an end time`))\n\t\treturn false\n\t}\n\tconst affectedResourceIds = report.attributes.affected_resources.map(resource => resource.status_page_resource_id)\n\treturn editorResourceIds.some(id => affectedResourceIds.includes(id))\n}\n\nasync function fetchMaintenanceData(signal?: AbortSignal): Promise<MaintenanceInfo | undefined> {\n\tlet response: Response | undefined\n\ttry {\n\t\tresponse = await fetch(\"https://status.framer.com/index.json\", { signal })\n\t} catch {\n\t\treturn\n\t}\n\n\tif (!response.ok) {\n\t\tlogger.reportError(new Error(`Failed to fetch maintenance data: ${response.status}`))\n\t\treturn\n\t}\n\n\tconst data = await response.json()\n\tconst parsedData = BetterStackResponseSchema.parse(data)\n\tconst customDomain = parsedData.data.attributes.custom_domain\n\n\tconst now = new Date()\n\tconst statusReports = parsedData.included.filter((item): item is StatusReport => item.type === \"status_report\")\n\n\tconst upcomingMaintenances = statusReports\n\t\t.filter(isEditorMaintenanceReport)\n\t\t.map(report => {\n\t\t\tconst startsAt = new Date(report.attributes.starts_at)\n\t\t\tconst endsAt = new Date(report.attributes.ends_at)\n\n\t\t\tconst statusUpdateId = report.relationships.status_updates.data[0]?.id\n\t\t\tconst statusUpdate = parsedData.included.find(\n\t\t\t\t(item): item is StatusUpdate => item.type === \"status_update\" && item.id === statusUpdateId,\n\t\t\t)\n\n\t\t\treturn {\n\t\t\t\tid: report.id,\n\t\t\t\ttitle: report.attributes.title,\n\t\t\t\tmessage: statusUpdate?.attributes.message || report.attributes.title,\n\t\t\t\tstartsAt,\n\t\t\t\tendsAt,\n\t\t\t\tstatusPageUrl: `https://${customDomain}/maintenance/${report.id}`,\n\t\t\t}\n\t\t})\n\t\t.filter(maintenance => maintenance.startsAt > now)\n\t\t.sort((a, b) => a.startsAt.getTime() - b.startsAt.getTime())\n\n\treturn upcomingMaintenances[0]\n}\n\nexport function useMaintenanceToast() {\n\tconst [maintenanceInfo, setMaintenanceInfo] = React.useState<MaintenanceInfo | undefined>(undefined)\n\tconst [acknowledgedId, setAcknowledgedId] = useLocalStorage(maintenanceAcknowledgedIdKey, \"\")\n\tconst [currentTime, setCurrentTime] = React.useState(() => Date.now())\n\tconst hasAcknowledgedToast = acknowledgedId === maintenanceInfo?.id\n\n\tReact.useEffect(() => {\n\t\tconst controller = new AbortController()\n\t\tvoid (async () => {\n\t\t\tconst info = await fetchMaintenanceData(controller.signal)\n\t\t\tsetMaintenanceInfo(info)\n\t\t})()\n\n\t\t// Refetch every day to get updated maintenance info\n\t\tconst interval = setInterval(\n\t\t\tasync () => {\n\t\t\t\tconst info = await fetchMaintenanceData(controller.signal)\n\t\t\t\tsetMaintenanceInfo(info)\n\t\t\t},\n\t\t\t24 * 60 * 60 * 1000,\n\t\t)\n\t\treturn () => {\n\t\t\tcontroller.abort()\n\t\t\tclearInterval(interval)\n\t\t}\n\t}, [])\n\n\tconst onLearnMoreClick = React.useCallback(() => {\n\t\tif (!maintenanceInfo) return\n\t\tsetAcknowledgedId(maintenanceInfo.id)\n\t\topenNewTab(maintenanceInfo.statusPageUrl)\n\t}, [maintenanceInfo, setAcknowledgedId])\n\n\tconst onDismissClick = React.useCallback(() => {\n\t\tif (!maintenanceInfo) return\n\t\tsetAcknowledgedId(maintenanceInfo.id)\n\t}, [maintenanceInfo, setAcknowledgedId])\n\n\tconst shouldShowToast = React.useMemo(() => {\n\t\tif (!maintenanceInfo || hasAcknowledgedToast) {\n\t\t\treturn false\n\t\t}\n\n\t\tconst startTime = maintenanceInfo.startsAt.getTime()\n\t\tconst endTime = maintenanceInfo.endsAt.getTime()\n\n\t\t// Show toast starting two weeks before maintenance\n\t\tconst showFromTime = startTime - 14 * 24 * 60 * 60 * 1000\n\n\t\treturn currentTime >= showFromTime && currentTime < endTime\n\t}, [currentTime, maintenanceInfo, hasAcknowledgedToast])\n\n\tconst isMaintenanceOngoing = React.useMemo(() => {\n\t\tif (!maintenanceInfo) return false\n\t\treturn currentTime >= maintenanceInfo.startsAt.getTime()\n\t}, [currentTime, maintenanceInfo])\n\n\tReact.useEffect(() => {\n\t\tif (!maintenanceInfo) return\n\n\t\tconst now = Date.now()\n\t\tconst timeoutIds: number[] = []\n\t\tconst startsAt = maintenanceInfo.startsAt.getTime()\n\t\tconst endsAt = maintenanceInfo.endsAt.getTime()\n\t\tconst showFromTime = startsAt - 14 * 24 * 60 * 60 * 1000\n\n\t\tconst scheduleBoundaryUpdate = (time: number) => {\n\t\t\tif (time <= now) return\n\t\t\ttimeoutIds.push(\n\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\tsetCurrentTime(Date.now())\n\t\t\t\t}, time - now),\n\t\t\t)\n\t\t}\n\n\t\t// Keep time-based toast state accurate when maintenance status boundaries are crossed.\n\t\tscheduleBoundaryUpdate(showFromTime)\n\t\tscheduleBoundaryUpdate(startsAt)\n\t\tscheduleBoundaryUpdate(endsAt)\n\n\t\treturn () => {\n\t\t\ttimeoutIds.forEach(id => clearTimeout(id))\n\t\t}\n\t}, [maintenanceInfo])\n\n\tReact.useEffect(() => {\n\t\tif (shouldShowToast && maintenanceInfo) {\n\t\t\ttoast({\n\t\t\t\ttype: \"add\",\n\t\t\t\tkey: toastKey,\n\t\t\t\tvariant: \"info\",\n\t\t\t\tprimaryText: isMaintenanceOngoing ? \"Ongoing maintenance.\" : \"Upcoming maintenance.\",\n\t\t\t\tsecondaryText: isMaintenanceOngoing ? \"Please reload later.\" : \"Please save and reload during maintenance.\",\n\t\t\t\tduration: Infinity,\n\t\t\t\tshowCloseButton: \"never\",\n\t\t\t\textraAction: {\n\t\t\t\t\ttitle: \"Dismiss\",\n\t\t\t\t\tonClick: onDismissClick,\n\t\t\t\t},\n\t\t\t\taction: {\n\t\t\t\t\ttitle: \"Learn more\",\n\t\t\t\t\tonClick: onLearnMoreClick,\n\t\t\t\t},\n\t\t\t})\n\t\t} else {\n\t\t\ttoast({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tkey: toastKey,\n\t\t\t})\n\t\t}\n\t}, [shouldShowToast, maintenanceInfo, onDismissClick, onLearnMoreClick, isMaintenanceOngoing])\n}\n", "import * as core from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nimport * as parse from \"./parse.js\";\nexport const ZodMiniType = /*@__PURE__*/ core.$constructor(\"ZodMiniType\", (inst, def) => {\n    if (!inst._zod)\n        throw new Error(\"Uninitialized schema in ZodMiniType.\");\n    core.$ZodType.init(inst, def);\n    inst.def = def;\n    inst.type = def.type;\n    inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n    inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n    inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n    inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n    inst.check = (...checks) => {\n        return inst.clone({\n            ...def,\n            checks: [\n                ...(def.checks ?? []),\n                ...checks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n            ],\n        }, { parent: true });\n    };\n    inst.with = inst.check;\n    inst.clone = (_def, params) => core.clone(inst, _def, params);\n    inst.brand = () => inst;\n    inst.register = ((reg, meta) => {\n        reg.add(inst, meta);\n        return inst;\n    });\n    inst.apply = (fn) => fn(inst);\n});\nexport const ZodMiniString = /*@__PURE__*/ core.$constructor(\"ZodMiniString\", (inst, def) => {\n    core.$ZodString.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function string(params) {\n    return core._string(ZodMiniString, params);\n}\nexport const ZodMiniStringFormat = /*@__PURE__*/ core.$constructor(\"ZodMiniStringFormat\", (inst, def) => {\n    core.$ZodStringFormat.init(inst, def);\n    ZodMiniString.init(inst, def);\n});\nexport const ZodMiniEmail = /*@__PURE__*/ core.$constructor(\"ZodMiniEmail\", (inst, def) => {\n    core.$ZodEmail.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function email(params) {\n    return core._email(ZodMiniEmail, params);\n}\nexport const ZodMiniGUID = /*@__PURE__*/ core.$constructor(\"ZodMiniGUID\", (inst, def) => {\n    core.$ZodGUID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function guid(params) {\n    return core._guid(ZodMiniGUID, params);\n}\nexport const ZodMiniUUID = /*@__PURE__*/ core.$constructor(\"ZodMiniUUID\", (inst, def) => {\n    core.$ZodUUID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function uuid(params) {\n    return core._uuid(ZodMiniUUID, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function uuidv4(params) {\n    return core._uuidv4(ZodMiniUUID, params);\n}\n// ZodMiniUUIDv6\n// @__NO_SIDE_EFFECTS__\nexport function uuidv6(params) {\n    return core._uuidv6(ZodMiniUUID, params);\n}\n// ZodMiniUUIDv7\n// @__NO_SIDE_EFFECTS__\nexport function uuidv7(params) {\n    return core._uuidv7(ZodMiniUUID, params);\n}\nexport const ZodMiniURL = /*@__PURE__*/ core.$constructor(\"ZodMiniURL\", (inst, def) => {\n    core.$ZodURL.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function url(params) {\n    return core._url(ZodMiniURL, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function httpUrl(params) {\n    return core._url(ZodMiniURL, {\n        protocol: /^https?$/,\n        hostname: core.regexes.domain,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniEmoji = /*@__PURE__*/ core.$constructor(\"ZodMiniEmoji\", (inst, def) => {\n    core.$ZodEmoji.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function emoji(params) {\n    return core._emoji(ZodMiniEmoji, params);\n}\nexport const ZodMiniNanoID = /*@__PURE__*/ core.$constructor(\"ZodMiniNanoID\", (inst, def) => {\n    core.$ZodNanoID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function nanoid(params) {\n    return core._nanoid(ZodMiniNanoID, params);\n}\nexport const ZodMiniCUID = /*@__PURE__*/ core.$constructor(\"ZodMiniCUID\", (inst, def) => {\n    core.$ZodCUID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function cuid(params) {\n    return core._cuid(ZodMiniCUID, params);\n}\nexport const ZodMiniCUID2 = /*@__PURE__*/ core.$constructor(\"ZodMiniCUID2\", (inst, def) => {\n    core.$ZodCUID2.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function cuid2(params) {\n    return core._cuid2(ZodMiniCUID2, params);\n}\nexport const ZodMiniULID = /*@__PURE__*/ core.$constructor(\"ZodMiniULID\", (inst, def) => {\n    core.$ZodULID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function ulid(params) {\n    return core._ulid(ZodMiniULID, params);\n}\nexport const ZodMiniXID = /*@__PURE__*/ core.$constructor(\"ZodMiniXID\", (inst, def) => {\n    core.$ZodXID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function xid(params) {\n    return core._xid(ZodMiniXID, params);\n}\nexport const ZodMiniKSUID = /*@__PURE__*/ core.$constructor(\"ZodMiniKSUID\", (inst, def) => {\n    core.$ZodKSUID.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function ksuid(params) {\n    return core._ksuid(ZodMiniKSUID, params);\n}\nexport const ZodMiniIPv4 = /*@__PURE__*/ core.$constructor(\"ZodMiniIPv4\", (inst, def) => {\n    core.$ZodIPv4.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function ipv4(params) {\n    return core._ipv4(ZodMiniIPv4, params);\n}\nexport const ZodMiniIPv6 = /*@__PURE__*/ core.$constructor(\"ZodMiniIPv6\", (inst, def) => {\n    core.$ZodIPv6.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function ipv6(params) {\n    return core._ipv6(ZodMiniIPv6, params);\n}\nexport const ZodMiniCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodMiniCIDRv4\", (inst, def) => {\n    core.$ZodCIDRv4.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function cidrv4(params) {\n    return core._cidrv4(ZodMiniCIDRv4, params);\n}\nexport const ZodMiniCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodMiniCIDRv6\", (inst, def) => {\n    core.$ZodCIDRv6.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function cidrv6(params) {\n    return core._cidrv6(ZodMiniCIDRv6, params);\n}\nexport const ZodMiniMAC = /*@__PURE__*/ core.$constructor(\"ZodMiniMAC\", (inst, def) => {\n    core.$ZodMAC.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function mac(params) {\n    return core._mac(ZodMiniMAC, params);\n}\nexport const ZodMiniBase64 = /*@__PURE__*/ core.$constructor(\"ZodMiniBase64\", (inst, def) => {\n    core.$ZodBase64.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function base64(params) {\n    return core._base64(ZodMiniBase64, params);\n}\nexport const ZodMiniBase64URL = /*@__PURE__*/ core.$constructor(\"ZodMiniBase64URL\", (inst, def) => {\n    core.$ZodBase64URL.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function base64url(params) {\n    return core._base64url(ZodMiniBase64URL, params);\n}\nexport const ZodMiniE164 = /*@__PURE__*/ core.$constructor(\"ZodMiniE164\", (inst, def) => {\n    core.$ZodE164.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function e164(params) {\n    return core._e164(ZodMiniE164, params);\n}\nexport const ZodMiniJWT = /*@__PURE__*/ core.$constructor(\"ZodMiniJWT\", (inst, def) => {\n    core.$ZodJWT.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function jwt(params) {\n    return core._jwt(ZodMiniJWT, params);\n}\nexport const ZodMiniCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodMiniCustomStringFormat\", (inst, def) => {\n    core.$ZodCustomStringFormat.init(inst, def);\n    ZodMiniStringFormat.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n    return core._stringFormat(ZodMiniCustomStringFormat, format, fnOrRegex, _params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function hostname(_params) {\n    return core._stringFormat(ZodMiniCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function hex(_params) {\n    return core._stringFormat(ZodMiniCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function hash(alg, params) {\n    const enc = params?.enc ?? \"hex\";\n    const format = `${alg}_${enc}`;\n    const regex = core.regexes[format];\n    // check for unrecognized format\n    if (!regex)\n        throw new Error(`Unrecognized hash format: ${format}`);\n    return core._stringFormat(ZodMiniCustomStringFormat, format, regex, params);\n}\nexport const ZodMiniNumber = /*@__PURE__*/ core.$constructor(\"ZodMiniNumber\", (inst, def) => {\n    core.$ZodNumber.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function number(params) {\n    return core._number(ZodMiniNumber, params);\n}\nexport const ZodMiniNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodMiniNumberFormat\", (inst, def) => {\n    core.$ZodNumberFormat.init(inst, def);\n    ZodMiniNumber.init(inst, def);\n});\n// int\n// @__NO_SIDE_EFFECTS__\nexport function int(params) {\n    return core._int(ZodMiniNumberFormat, params);\n}\n// float32\n// @__NO_SIDE_EFFECTS__\nexport function float32(params) {\n    return core._float32(ZodMiniNumberFormat, params);\n}\n// float64\n// @__NO_SIDE_EFFECTS__\nexport function float64(params) {\n    return core._float64(ZodMiniNumberFormat, params);\n}\n// int32\n// @__NO_SIDE_EFFECTS__\nexport function int32(params) {\n    return core._int32(ZodMiniNumberFormat, params);\n}\n// uint32\n// @__NO_SIDE_EFFECTS__\nexport function uint32(params) {\n    return core._uint32(ZodMiniNumberFormat, params);\n}\nexport const ZodMiniBoolean = /*@__PURE__*/ core.$constructor(\"ZodMiniBoolean\", (inst, def) => {\n    core.$ZodBoolean.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function boolean(params) {\n    return core._boolean(ZodMiniBoolean, params);\n}\nexport const ZodMiniBigInt = /*@__PURE__*/ core.$constructor(\"ZodMiniBigInt\", (inst, def) => {\n    core.$ZodBigInt.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function bigint(params) {\n    return core._bigint(ZodMiniBigInt, params);\n}\nexport const ZodMiniBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodMiniBigIntFormat\", (inst, def) => {\n    core.$ZodBigIntFormat.init(inst, def);\n    ZodMiniBigInt.init(inst, def);\n});\n// int64\n// @__NO_SIDE_EFFECTS__\nexport function int64(params) {\n    return core._int64(ZodMiniBigIntFormat, params);\n}\n// uint64\n// @__NO_SIDE_EFFECTS__\nexport function uint64(params) {\n    return core._uint64(ZodMiniBigIntFormat, params);\n}\nexport const ZodMiniSymbol = /*@__PURE__*/ core.$constructor(\"ZodMiniSymbol\", (inst, def) => {\n    core.$ZodSymbol.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function symbol(params) {\n    return core._symbol(ZodMiniSymbol, params);\n}\nexport const ZodMiniUndefined = /*@__PURE__*/ core.$constructor(\"ZodMiniUndefined\", (inst, def) => {\n    core.$ZodUndefined.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nfunction _undefined(params) {\n    return core._undefined(ZodMiniUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodMiniNull = /*@__PURE__*/ core.$constructor(\"ZodMiniNull\", (inst, def) => {\n    core.$ZodNull.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nfunction _null(params) {\n    return core._null(ZodMiniNull, params);\n}\nexport { _null as null };\nexport const ZodMiniAny = /*@__PURE__*/ core.$constructor(\"ZodMiniAny\", (inst, def) => {\n    core.$ZodAny.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function any() {\n    return core._any(ZodMiniAny);\n}\nexport const ZodMiniUnknown = /*@__PURE__*/ core.$constructor(\"ZodMiniUnknown\", (inst, def) => {\n    core.$ZodUnknown.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function unknown() {\n    return core._unknown(ZodMiniUnknown);\n}\nexport const ZodMiniNever = /*@__PURE__*/ core.$constructor(\"ZodMiniNever\", (inst, def) => {\n    core.$ZodNever.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function never(params) {\n    return core._never(ZodMiniNever, params);\n}\nexport const ZodMiniVoid = /*@__PURE__*/ core.$constructor(\"ZodMiniVoid\", (inst, def) => {\n    core.$ZodVoid.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nfunction _void(params) {\n    return core._void(ZodMiniVoid, params);\n}\nexport { _void as void };\nexport const ZodMiniDate = /*@__PURE__*/ core.$constructor(\"ZodMiniDate\", (inst, def) => {\n    core.$ZodDate.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function date(params) {\n    return core._date(ZodMiniDate, params);\n}\nexport const ZodMiniArray = /*@__PURE__*/ core.$constructor(\"ZodMiniArray\", (inst, def) => {\n    core.$ZodArray.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function array(element, params) {\n    return new ZodMiniArray({\n        type: \"array\",\n        element: element,\n        ...util.normalizeParams(params),\n    });\n}\n// .keyof\n// @__NO_SIDE_EFFECTS__\nexport function keyof(schema) {\n    const shape = schema._zod.def.shape;\n    return _enum(Object.keys(shape));\n}\nexport const ZodMiniObject = /*@__PURE__*/ core.$constructor(\"ZodMiniObject\", (inst, def) => {\n    core.$ZodObject.init(inst, def);\n    ZodMiniType.init(inst, def);\n    util.defineLazy(inst, \"shape\", () => def.shape);\n});\n// @__NO_SIDE_EFFECTS__\nexport function object(shape, params) {\n    const def = {\n        type: \"object\",\n        shape: shape ?? {},\n        ...util.normalizeParams(params),\n    };\n    return new ZodMiniObject(def);\n}\n// strictObject\n// @__NO_SIDE_EFFECTS__\nexport function strictObject(shape, params) {\n    return new ZodMiniObject({\n        type: \"object\",\n        shape,\n        catchall: never(),\n        ...util.normalizeParams(params),\n    });\n}\n// looseObject\n// @__NO_SIDE_EFFECTS__\nexport function looseObject(shape, params) {\n    return new ZodMiniObject({\n        type: \"object\",\n        shape,\n        catchall: unknown(),\n        ...util.normalizeParams(params),\n    });\n}\n// object methods\n// @__NO_SIDE_EFFECTS__\nexport function extend(schema, shape) {\n    return util.extend(schema, shape);\n}\n// @__NO_SIDE_EFFECTS__\nexport function safeExtend(schema, shape) {\n    return util.safeExtend(schema, shape);\n}\n// @__NO_SIDE_EFFECTS__\nexport function merge(schema, shape) {\n    return util.extend(schema, shape);\n}\n// @__NO_SIDE_EFFECTS__\nexport function pick(schema, mask) {\n    return util.pick(schema, mask);\n}\n// .omit\n// @__NO_SIDE_EFFECTS__\nexport function omit(schema, mask) {\n    return util.omit(schema, mask);\n}\n// @__NO_SIDE_EFFECTS__\nexport function partial(schema, mask) {\n    return util.partial(ZodMiniOptional, schema, mask);\n}\n// @__NO_SIDE_EFFECTS__\nexport function required(schema, mask) {\n    return util.required(ZodMiniNonOptional, schema, mask);\n}\n// @__NO_SIDE_EFFECTS__\nexport function catchall(inst, catchall) {\n    return inst.clone({ ...inst._zod.def, catchall: catchall });\n}\nexport const ZodMiniUnion = /*@__PURE__*/ core.$constructor(\"ZodMiniUnion\", (inst, def) => {\n    core.$ZodUnion.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function union(options, params) {\n    return new ZodMiniUnion({\n        type: \"union\",\n        options: options,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniXor = /*@__PURE__*/ core.$constructor(\"ZodMiniXor\", (inst, def) => {\n    ZodMiniUnion.init(inst, def);\n    core.$ZodXor.init(inst, def);\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n    return new ZodMiniXor({\n        type: \"union\",\n        options: options,\n        inclusive: false,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodMiniDiscriminatedUnion\", (inst, def) => {\n    core.$ZodDiscriminatedUnion.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function discriminatedUnion(discriminator, options, params) {\n    return new ZodMiniDiscriminatedUnion({\n        type: \"union\",\n        options,\n        discriminator,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniIntersection = /*@__PURE__*/ core.$constructor(\"ZodMiniIntersection\", (inst, def) => {\n    core.$ZodIntersection.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function intersection(left, right) {\n    return new ZodMiniIntersection({\n        type: \"intersection\",\n        left: left,\n        right: right,\n    });\n}\nexport const ZodMiniTuple = /*@__PURE__*/ core.$constructor(\"ZodMiniTuple\", (inst, def) => {\n    core.$ZodTuple.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function tuple(items, _paramsOrRest, _params) {\n    const hasRest = _paramsOrRest instanceof core.$ZodType;\n    const params = hasRest ? _params : _paramsOrRest;\n    const rest = hasRest ? _paramsOrRest : null;\n    return new ZodMiniTuple({\n        type: \"tuple\",\n        items: items,\n        rest,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniRecord = /*@__PURE__*/ core.$constructor(\"ZodMiniRecord\", (inst, def) => {\n    core.$ZodRecord.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function record(keyType, valueType, params) {\n    return new ZodMiniRecord({\n        type: \"record\",\n        keyType,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\n// @__NO_SIDE_EFFECTS__\nexport function partialRecord(keyType, valueType, params) {\n    const k = core.clone(keyType);\n    k._zod.values = undefined;\n    return new ZodMiniRecord({\n        type: \"record\",\n        keyType: k,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport function looseRecord(keyType, valueType, params) {\n    return new ZodMiniRecord({\n        type: \"record\",\n        keyType,\n        valueType: valueType,\n        mode: \"loose\",\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniMap = /*@__PURE__*/ core.$constructor(\"ZodMiniMap\", (inst, def) => {\n    core.$ZodMap.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function map(keyType, valueType, params) {\n    return new ZodMiniMap({\n        type: \"map\",\n        keyType: keyType,\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniSet = /*@__PURE__*/ core.$constructor(\"ZodMiniSet\", (inst, def) => {\n    core.$ZodSet.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function set(valueType, params) {\n    return new ZodMiniSet({\n        type: \"set\",\n        valueType: valueType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniEnum = /*@__PURE__*/ core.$constructor(\"ZodMiniEnum\", (inst, def) => {\n    core.$ZodEnum.init(inst, def);\n    ZodMiniType.init(inst, def);\n    inst.options = Object.values(def.entries);\n});\n// @__NO_SIDE_EFFECTS__\nfunction _enum(values, params) {\n    const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n    return new ZodMiniEnum({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\nexport { _enum as enum };\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n    return new ZodMiniEnum({\n        type: \"enum\",\n        entries,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniLiteral = /*@__PURE__*/ core.$constructor(\"ZodMiniLiteral\", (inst, def) => {\n    core.$ZodLiteral.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function literal(value, params) {\n    return new ZodMiniLiteral({\n        type: \"literal\",\n        values: Array.isArray(value) ? value : [value],\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniFile = /*@__PURE__*/ core.$constructor(\"ZodMiniFile\", (inst, def) => {\n    core.$ZodFile.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function file(params) {\n    return core._file(ZodMiniFile, params);\n}\nexport const ZodMiniTransform = /*@__PURE__*/ core.$constructor(\"ZodMiniTransform\", (inst, def) => {\n    core.$ZodTransform.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function transform(fn) {\n    return new ZodMiniTransform({\n        type: \"transform\",\n        transform: fn,\n    });\n}\nexport const ZodMiniOptional = /*@__PURE__*/ core.$constructor(\"ZodMiniOptional\", (inst, def) => {\n    core.$ZodOptional.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function optional(innerType) {\n    return new ZodMiniOptional({\n        type: \"optional\",\n        innerType: innerType,\n    });\n}\nexport const ZodMiniExactOptional = /*@__PURE__*/ core.$constructor(\"ZodMiniExactOptional\", (inst, def) => {\n    core.$ZodExactOptional.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function exactOptional(innerType) {\n    return new ZodMiniExactOptional({\n        type: \"optional\",\n        innerType: innerType,\n    });\n}\nexport const ZodMiniNullable = /*@__PURE__*/ core.$constructor(\"ZodMiniNullable\", (inst, def) => {\n    core.$ZodNullable.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function nullable(innerType) {\n    return new ZodMiniNullable({\n        type: \"nullable\",\n        innerType: innerType,\n    });\n}\n// nullish\n// @__NO_SIDE_EFFECTS__\nexport function nullish(innerType) {\n    return optional(nullable(innerType));\n}\nexport const ZodMiniDefault = /*@__PURE__*/ core.$constructor(\"ZodMiniDefault\", (inst, def) => {\n    core.$ZodDefault.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function _default(innerType, defaultValue) {\n    return new ZodMiniDefault({\n        type: \"default\",\n        innerType: innerType,\n        get defaultValue() {\n            return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n        },\n    });\n}\nexport const ZodMiniPrefault = /*@__PURE__*/ core.$constructor(\"ZodMiniPrefault\", (inst, def) => {\n    core.$ZodPrefault.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function prefault(innerType, defaultValue) {\n    return new ZodMiniPrefault({\n        type: \"prefault\",\n        innerType: innerType,\n        get defaultValue() {\n            return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n        },\n    });\n}\nexport const ZodMiniNonOptional = /*@__PURE__*/ core.$constructor(\"ZodMiniNonOptional\", (inst, def) => {\n    core.$ZodNonOptional.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function nonoptional(innerType, params) {\n    return new ZodMiniNonOptional({\n        type: \"nonoptional\",\n        innerType: innerType,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniSuccess = /*@__PURE__*/ core.$constructor(\"ZodMiniSuccess\", (inst, def) => {\n    core.$ZodSuccess.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function success(innerType) {\n    return new ZodMiniSuccess({\n        type: \"success\",\n        innerType: innerType,\n    });\n}\nexport const ZodMiniCatch = /*@__PURE__*/ core.$constructor(\"ZodMiniCatch\", (inst, def) => {\n    core.$ZodCatch.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nfunction _catch(innerType, catchValue) {\n    return new ZodMiniCatch({\n        type: \"catch\",\n        innerType: innerType,\n        catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n    });\n}\nexport { _catch as catch };\nexport const ZodMiniNaN = /*@__PURE__*/ core.$constructor(\"ZodMiniNaN\", (inst, def) => {\n    core.$ZodNaN.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function nan(params) {\n    return core._nan(ZodMiniNaN, params);\n}\nexport const ZodMiniPipe = /*@__PURE__*/ core.$constructor(\"ZodMiniPipe\", (inst, def) => {\n    core.$ZodPipe.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function pipe(in_, out) {\n    return new ZodMiniPipe({\n        type: \"pipe\",\n        in: in_,\n        out: out,\n    });\n}\nexport const ZodMiniCodec = /*@__PURE__*/ core.$constructor(\"ZodMiniCodec\", (inst, def) => {\n    ZodMiniPipe.init(inst, def);\n    core.$ZodCodec.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function codec(in_, out, params) {\n    return new ZodMiniCodec({\n        type: \"pipe\",\n        in: in_,\n        out: out,\n        transform: params.decode,\n        reverseTransform: params.encode,\n    });\n}\nexport const ZodMiniReadonly = /*@__PURE__*/ core.$constructor(\"ZodMiniReadonly\", (inst, def) => {\n    core.$ZodReadonly.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function readonly(innerType) {\n    return new ZodMiniReadonly({\n        type: \"readonly\",\n        innerType: innerType,\n    });\n}\nexport const ZodMiniTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodMiniTemplateLiteral\", (inst, def) => {\n    core.$ZodTemplateLiteral.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function templateLiteral(parts, params) {\n    return new ZodMiniTemplateLiteral({\n        type: \"template_literal\",\n        parts,\n        ...util.normalizeParams(params),\n    });\n}\nexport const ZodMiniLazy = /*@__PURE__*/ core.$constructor(\"ZodMiniLazy\", (inst, def) => {\n    core.$ZodLazy.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// export function lazy<T extends object>(getter: () => T): T {\n//   return util.createTransparentProxy<T>(getter);\n// }\n// @__NO_SIDE_EFFECTS__\nfunction _lazy(getter) {\n    return new ZodMiniLazy({\n        type: \"lazy\",\n        getter: getter,\n    });\n}\nexport { _lazy as lazy };\nexport const ZodMiniPromise = /*@__PURE__*/ core.$constructor(\"ZodMiniPromise\", (inst, def) => {\n    core.$ZodPromise.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function promise(innerType) {\n    return new ZodMiniPromise({\n        type: \"promise\",\n        innerType: innerType,\n    });\n}\nexport const ZodMiniCustom = /*@__PURE__*/ core.$constructor(\"ZodMiniCustom\", (inst, def) => {\n    core.$ZodCustom.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// custom checks\n// @__NO_SIDE_EFFECTS__\nexport function check(fn, params) {\n    const ch = new core.$ZodCheck({\n        check: \"custom\",\n        ...util.normalizeParams(params),\n    });\n    ch._zod.check = fn;\n    return ch;\n}\n// ZodCustom\n// custom schema\n// @__NO_SIDE_EFFECTS__\nexport function custom(fn, _params) {\n    return core._custom(ZodMiniCustom, fn ?? (() => true), _params);\n}\n// refine\n// @__NO_SIDE_EFFECTS__\nexport function refine(fn, _params = {}) {\n    return core._refine(ZodMiniCustom, fn, _params);\n}\n// superRefine\n// @__NO_SIDE_EFFECTS__\nexport function superRefine(fn) {\n    return core._superRefine(fn);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\n// instanceof\nclass Class {\n    constructor(..._args) { }\n}\n// @__NO_SIDE_EFFECTS__\nfunction _instanceof(cls, params = {}) {\n    const inst = custom((data) => data instanceof cls, params);\n    inst._zod.bag.Class = cls;\n    // Override check to emit invalid_type instead of custom\n    inst._zod.check = (payload) => {\n        if (!(payload.value instanceof cls)) {\n            payload.issues.push({\n                code: \"invalid_type\",\n                expected: cls.name,\n                input: payload.value,\n                inst,\n                path: [...(inst._zod.def.path ?? [])],\n            });\n        }\n    };\n    return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n    Codec: ZodMiniCodec,\n    Boolean: ZodMiniBoolean,\n    String: ZodMiniString,\n}, ...args);\n// @__NO_SIDE_EFFECTS__\nexport function json() {\n    const jsonSchema = _lazy(() => {\n        return union([string(), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n    });\n    return jsonSchema;\n}\nexport const ZodMiniFunction = /*@__PURE__*/ core.$constructor(\"ZodMiniFunction\", (inst, def) => {\n    core.$ZodFunction.init(inst, def);\n    ZodMiniType.init(inst, def);\n});\n// @__NO_SIDE_EFFECTS__\nexport function _function(params) {\n    return new ZodMiniFunction({\n        type: \"function\",\n        input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n        output: params?.output ?? unknown(),\n    });\n}\nexport { _function as function };\n", "import type { OrganizationSpace, Space } from \"@framerjs/app-shared\"\nimport { TeamMemberRole, isOrganizationSpace } from \"@framerjs/app-shared\"\nimport { getLogger } from \"@framerjs/shared\"\nimport React, { useState } from \"react\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\nimport type { AutoJoinedMember, TeamRecommendation } from \"../../../lib/TeamSettings.ts\"\nimport type { AccountApi } from \"../../../lib/useAccountAPI.ts\"\nimport { useLocalStorage } from \"../../../lib/useLocalStorage.ts\"\n\nconst log = getLogger(\"useTeamRecommendations\")\n\nexport function useTeamRecommendations(api: AccountApi) {\n\tconst { fetchMe } = api\n\n\tconst [recommendedTeams, setRecommendedTeams] = useState<TeamRecommendation[]>([])\n\tconst [recommendedTeamToNavigateTo, setRecommendedTeamToNavigateTo] = useState<string | null>(null)\n\n\tconst [teamsPendingWelcomeModal, setTeamsPendingWelcomeModal] = useLocalStorage<string[]>(\n\t\t\"recommended-teams-joined-pending-welcome-modal\",\n\t\t[],\n\t)\n\tconst [dismissedRecommendedTeams, setDismissedRecommendedTeams] = useLocalStorage<string[]>(\n\t\t\"dismissed-recommended-teams\",\n\t\t[],\n\t)\n\n\tReact.useEffect(() => {\n\t\tlet active = true\n\t\tfetchRecommendedTeams()\n\t\t\t.then(teams => {\n\t\t\t\tif (!active) return\n\t\t\t\tsetRecommendedTeams(teams)\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tlog.error(\"failed to load recommended teams\", err)\n\t\t\t})\n\t\treturn () => {\n\t\t\tactive = false\n\t\t}\n\t}, [])\n\n\tasync function joinRecommendedTeams(teamIds: string[]) {\n\t\ttry {\n\t\t\t// Join team(s)\n\t\t\tawait Promise.all(teamIds.map(id => joinRecommendedTeam({ teamId: id, source: \"recommended-dashboard\" })))\n\t\t\t// Fetch the list of teams the user has joined now in order to update the sidebar\n\t\t\tawait fetchMe()\n\n\t\t\t// Add team(s) joined to the list of modals we have to open automatically when navigating to them for\n\t\t\t// the first time\n\t\t\tsetTeamsPendingWelcomeModal(prevState => [...prevState, ...teamIds])\n\n\t\t\t// Navigate to the first team joined\n\t\t\tsetRecommendedTeamToNavigateTo(teamIds[0] ?? null)\n\n\t\t\t// Update recommended teams state\n\t\t\tsetRecommendedTeams(currentState => currentState.filter(team => !teamIds.includes(team.id)))\n\t\t} catch (e: unknown) {\n\t\t\tconst teamsFailedToJoin = recommendedTeams.filter(team => teamIds.includes(team.id))\n\t\t\tconst errorMessage =\n\t\t\t\tteamsFailedToJoin.length === 1\n\t\t\t\t\t? `Failed to join ${teamsFailedToJoin[0]?.displayName}`\n\t\t\t\t\t: \"Failed to join workspaces.\"\n\n\t\t\tthrow new Error(errorMessage, { cause: e })\n\t\t}\n\t}\n\n\tfunction shouldShowTeamRecommendationWelcomeModal(userSpaces: Space[]): OrganizationSpace | false {\n\t\tconst teamsPendingWelcomeModalSet = new Set(teamsPendingWelcomeModal)\n\t\treturn userSpaces.filter(isOrganizationSpace).find(space => teamsPendingWelcomeModalSet.has(space.ownerId)) ?? false\n\t}\n\n\tfunction dismissTeamRecommendationWelcomeModal(teamId: string) {\n\t\tsetTeamsPendingWelcomeModal(prevState => prevState.filter(id => id !== teamId))\n\t\tsetRecommendedTeamToNavigateTo(null)\n\t}\n\n\tfunction dismissTeamRecommendation(teamId: string) {\n\t\tsetDismissedRecommendedTeams(prevState => [...prevState, teamId])\n\t}\n\n\tfunction removeRecommendedTeam(teamId: string) {\n\t\tsetRecommendedTeams(teams => teams.filter(team => team.id !== teamId))\n\t}\n\n\treturn {\n\t\trecommendedTeams: recommendedTeams.filter(({ id }) => !dismissedRecommendedTeams.includes(id)),\n\t\tjoinRecommendedTeams,\n\t\tdismissTeamRecommendationWelcomeModal,\n\t\tdismissTeamRecommendation,\n\t\tremoveRecommendedTeam,\n\t\trecommendedTeamToNavigateTo,\n\t\tshouldShowTeamRecommendationWelcomeModal,\n\t}\n}\n\nexport async function fetchRecommendedTeams(): Promise<TeamRecommendation[]> {\n\treturn apiFetcher.get(\"/web/users/recommended-teams\")\n}\n\nexport async function joinRecommendedTeam({\n\tteamId,\n\tsource,\n}: {\n\tteamId: string\n\t// Note: When updating the source type, make sure to also update the corresponding type in:\n\t// 1. https://github.com/framer/FramerTeamsService/blob/219b59657ffe5528313af2bfef8175b5f3fb55b8/types/teams.go\n\t// 2. https://github.com/framer/FramerTeamsService/blob/219b59657ffe5528313af2bfef8175b5f3fb55b8/services/team_service.go#L595\n\tsource: \"recommended-canvas\" | \"recommended-dashboard\"\n}): Promise<AutoJoinedMember> {\n\treturn apiFetcher.post(`/account/teams/${teamId}/members/self`, { role: TeamMemberRole.Editor, source })\n}\n", "import type { ProjectLicense } from \"@framerjs/app-shared\"\nimport { isPaidLicenseType } from \"@framerjs/app-shared\"\nimport { ConfirmationModal, Translatable as T } from \"@framerjs/fresco\"\nimport { ZIndex } from \"@framerjs/fresco/tokens\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { useRecordEffect } from \"utils/useRecordEffect.ts\"\nimport { Pages } from \"web/lib/tracker.ts\"\n\ninterface Props {\n\tisMovedFromDrafts: boolean\n\tisLoading?: boolean\n\tprojectLicense?: ProjectLicense\n\tisLastPaidProject?: boolean\n\tteamName: string\n\tonCancel: () => void\n\tonConfirm: () => void\n\tonDismiss: () => void\n}\nexport function ConfirmMoveProjectModal({\n\tisMovedFromDrafts,\n\tisLoading,\n\tprojectLicense,\n\tisLastPaidProject,\n\tteamName,\n\tonCancel,\n\tonConfirm,\n\tonDismiss,\n}: Props) {\n\tconst isAgentExperimentOn = useExperimentIsOn(\"agent\")\n\tuseRecordEffect(\"ui_impression\", { page: Pages.moveProjectConfirmationModal })\n\tconst isPaidNonEnterpriseProject = projectLicense && isPaidLicenseType(projectLicense.type)\n\n\tconst description = getDescription(\n\t\tisMovedFromDrafts,\n\t\tteamName,\n\t\tisPaidNonEnterpriseProject,\n\t\tisLastPaidProject,\n\t\tprojectLicense,\n\t)\n\treturn (\n\t\t<ConfirmationModal\n\t\t\tvariant={isMovedFromDrafts ? \"primary\" : \"destructive\"}\n\t\t\ttitle={`Move Project to ${teamName}`}\n\t\t\tdescription={description}\n\t\t\tcancelLabel=\"Cancel\"\n\t\t\tonCancel={onCancel}\n\t\t\tconfirmLabel=\"Move\"\n\t\t\tonConfirm={onConfirm}\n\t\t\tonDismiss={onDismiss}\n\t\t\tzIndex={ZIndex.modalWithoutPopovers}\n\t\t\tconfirmButtonLoading={isLoading}\n\t\t\tlegacy={!isAgentExperimentOn}\n\t\t/>\n\t)\n}\nfunction getDescription(\n\tisMovedFromDrafts: boolean,\n\tteamName: string,\n\tisPaidNonEnterpriseProject: boolean | undefined,\n\tisLastPaidProject: boolean | undefined,\n\tprojectLicense?: ProjectLicense,\n) {\n\tif (isMovedFromDrafts) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<T>All the members of</T> {teamName} <T>will be able to view this project.</T>\n\t\t\t</>\n\t\t)\n\t}\n\tif (!isPaidNonEnterpriseProject) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<T>Editors added to this project will be</T>\n\t\t\t\t<br />\n\t\t\t\t<T>downgraded to viewers. Subscribe to a</T>\n\t\t\t\t<br />\n\t\t\t\t<T>paid plan to publish to a custom domain</T>\n\t\t\t\t<br />\n\t\t\t\t<T>and unlock other powerful features.</T>\n\t\t\t</>\n\t\t)\n\t}\n\n\tconst sharedDescriptionText = (\n\t\t<>\n\t\t\t<T>Any active subscriptions will be</T>\n\t\t\t<br />\n\t\t\t<T>canceled immediately, and you&lsquo;ll need</T>\n\t\t\t<br />\n\t\t\t<T>to resubscribe to retain access to your</T>\n\t\t\t<br />\n\t\t\t<T>custom domain and other features.</T>\n\t\t</>\n\t)\n\n\tif (!projectLicense?.subscriptionIsActive) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{sharedDescriptionText}\n\t\t\t\t<T>\n\t\t\t\t\t{\" \"}\n\t\t\t\t\tSince the plan was already set to cancel, no credit will be applied to the original workspace. To retain\n\t\t\t\t\tcredit for unused time, reactivate the project before moving it.\n\t\t\t\t</T>\n\t\t\t</>\n\t\t)\n\t}\n\n\tif (isLastPaidProject) {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{sharedDescriptionText}\n\t\t\t\t<T> Reach out to Support to receive credit for unused time on your subscription.</T>\n\t\t\t</>\n\t\t)\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{sharedDescriptionText}\n\t\t\t<T> The </T>\n\t\t\t<br />\n\t\t\t<T>unused time on your subscription will</T>\n\t\t\t<br />\n\t\t\t<T>be credited to the current workspace.</T>\n\t\t</>\n\t)\n}\n", "import { ApiError } from \"@framerjs/app-shared\"\nimport type { ToasterAction } from \"@framerjs/fresco\"\nimport { Dictionary } from \"app/dictionary.ts\"\nimport { toast } from \"./toaster.ts\"\n\nenum ErrorReasons {\n\t// ProjectMoveBlockedSubscriptionActive means the project move\n\t// (to another team) was blocked because the project subscription\n\t// is active or has not expired yet.\n\t// This error reason is returned by the FramerProjectsService which\n\t// performs the subscription check when a project is moved (between teams).\n\tProjectMoveBlockedSubscriptionActive = \"project_move_blocked_subscription_active\",\n}\n\nexport function showMoveProjectErrorToast(params: {\n\terr: Error\n\ttargetTeamId: string\n\tprojectId: string\n\tprojectTitle: null | string\n\tdestination: string\n\tonClickOpenPlans: () => void\n}): void {\n\tconst { err, targetTeamId, projectId, projectTitle, destination, onClickOpenPlans } = params\n\n\tconst defaultOptions: ToasterAction = {\n\t\ttype: \"add\",\n\t\tvariant: \"error\",\n\t\tkey: `move-${projectId}-to-${targetTeamId}`,\n\t\tprimaryText: `Failed to move ${projectTitle ?? Dictionary.Unknown}`,\n\t\tsecondaryText: `to ${destination}.`,\n\t\ticon: \"error\",\n\n\t\t// Duration is explicitly omitted by default because we don't want\n\t\t// to show the \"Dismiss\" action for \"regular\" project move errors.\n\t\tduration: undefined,\n\t}\n\n\tif (err instanceof ApiError) {\n\t\tconst { reason } = err.data\n\t\tswitch (reason) {\n\t\t\tcase ErrorReasons.ProjectMoveBlockedSubscriptionActive: {\n\t\t\t\ttoast({\n\t\t\t\t\t...defaultOptions,\n\t\t\t\t\tprimaryText: \"Can\u2019t move project\",\n\t\t\t\t\tsecondaryText: \"with a subscription.\",\n\t\t\t\t\tduration: 5_000,\n\t\t\t\t\taction: {\n\t\t\t\t\t\ttitle: \"Open Plans\",\n\t\t\t\t\t\tonClick: onClickOpenPlans,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\t// NOTE: re-throwing the error results in <ConfirmMoveProjectModal/>\n\t\t\t\t// to stay visible when an error occurred (dashboard + canvas).\n\t\t\t\t// When moving is blocked we want to close the confirm modal.\n\t\t\t\t// But for other errors the confirm modal may stay visible, so\n\t\t\t\t// moving can be tried again.\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\t// When we got back an unknown reason we show the \"regular\" error toast.\n\t\t\tdefault: {\n\t\t\t\ttoast(defaultOptions)\n\t\t\t\tthrow err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// When we got back a non-api-error we show the \"regular\" error toast.\n\t\ttoast(defaultOptions)\n\t\tthrow err\n\t}\n}\n", "export function truncate(s: string, maxLength: number) {\n\treturn s.length > maxLength ? `${s.substr(0, maxLength - 1)}\u2026` : s\n}\n", "import type { ProjectBase } from \"@framerjs/app-shared\"\nimport { isTeamTemplate } from \"@framerjs/app-shared\"\nimport { ConfirmationModal, Translatable as T } from \"@framerjs/fresco\"\nimport { useExperimentIsOn } from \"app/experiments.ts\"\nimport { assertNever } from \"library/utils/assert.ts\"\nimport React from \"react\"\n\ninterface Props {\n\tproject: ProjectBase\n\tonClose: () => void\n\tonConfirm: (project: ProjectBase) => Promise<void>\n\taction: \"leave\" | \"archive\" | \"delete\"\n}\n\nexport function ProjectActionConfirmModal({ project, onConfirm, onClose, action }: Props) {\n\tconst isAgentExperimentOn = useExperimentIsOn(\"agent\")\n\tconst [isLoading, setIsLoading] = React.useState<boolean>(false)\n\n\tasync function handleConfirm() {\n\t\tsetIsLoading(true)\n\t\tawait onConfirm(project)\n\t\tsetIsLoading(false)\n\t}\n\tconst { title, description } = infoForAction(action, project)\n\n\treturn (\n\t\t<ConfirmationModal\n\t\t\tvariant=\"destructive\"\n\t\t\ttitle={title}\n\t\t\tdescription={description}\n\t\t\tcancelLabel=\"Cancel\"\n\t\t\tonCancel={onClose}\n\t\t\tconfirmLabel={title}\n\t\t\tonConfirm={handleConfirm}\n\t\t\tonDismiss={onClose}\n\t\t\tconfirmButtonLoading={isLoading}\n\t\t\tlegacy={!isAgentExperimentOn}\n\t\t/>\n\t)\n}\n\nfunction infoForAction(action: \"leave\" | \"archive\" | \"delete\", project: ProjectBase) {\n\tconst noun = isTeamTemplate(project) ? \"Template\" : \"Project\"\n\n\tswitch (action) {\n\t\tcase \"leave\":\n\t\t\treturn {\n\t\t\t\ttitle: `Leave ${noun}`,\n\t\t\t\tdescription: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<T>You will leave this</T> {noun.toLocaleLowerCase()}\n\t\t\t\t\t\t<T>, and it will no longer be visible on your dashboard.</T>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t}\n\n\t\tcase \"archive\": {\n\t\t\tconst spaceName = project.space.displayName\n\t\t\treturn {\n\t\t\t\ttitle: `Archive ${noun}`,\n\t\t\t\tdescription: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<T>This will move the</T> {noun.toLocaleLowerCase()} <T>to the workspace archive for all </T>\n\t\t\t\t\t\t{spaceName} <T>members and unpublish its sites.</T>\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t}\n\t\t}\n\n\t\tcase \"delete\": {\n\t\t\treturn {\n\t\t\t\ttitle: `Delete ${noun}`,\n\t\t\t\tdescription: <T>Deleting a project will delete it for all collaborators and cannot be undone.</T>,\n\t\t\t}\n\t\t}\n\n\t\tdefault:\n\t\t\tassertNever(action)\n\t}\n}\n", "import type { Collection, CurrentUser, ProjectBase } from \"@framerjs/app-shared\"\nimport { TeamMemberRole, isPersonalSpace, isTeamTemplate } from \"@framerjs/app-shared\"\nimport { useMemo } from \"react\"\nimport { useMoveToCollections } from \"web/pages/project/lib/useMoveToCollections.ts\"\nimport { getSpaceName } from \"../../../lib/getSpaceName.ts\"\n\ntype TeamId = string\nexport interface CollectionsByTeamId {\n\t[teamId: TeamId]: {\n\t\tdisplayName: string\n\t\tcollections: Collection[]\n\t}\n}\n\nconst defaultCollection: Collection = { id: \"recent\", isCustom: false }\n\nfunction isViewOnlyCollection(collection: Collection) {\n\treturn collection.id !== \"archived\" && collection.id !== \"templates\"\n}\n\ninterface Result {\n\tcanMoveProject: boolean\n\tavailableCollectionsByTeamId: CollectionsByTeamId\n\thelperText: string\n}\n\nexport function useMoveProjectPermissions({ project, user }: { project: ProjectBase; user: CurrentUser }): Result {\n\tconst { collections: collectionsBySpaceId } = useMoveToCollections(user.spaces, user.id)\n\t/**\n\t * Permissions to move projects are a bit convoluted.\n\t * This is a detailed description of what is allowed in each scenario.\n\t * TODO: Move project permissions to project metadata.\n\t * - From Draft to Team: Only the owner of a project can move it\n\t * - From Team to different Team: only users who are\n\t *      - an Editor of the origin team and the owner of the project have write access to the target team, or\n\t *      - an Admin of the origin Team and have write access to the target team\n\t * - From team back to Drafts: currently not supported\n\t * - Between collections in a single Team: Admins and Editors\n\t */\n\n\treturn useMemo(() => {\n\t\t// Find the space for the current project\n\t\tconst projectSpace = user.spaces.find(s => s.id === project.space.id)\n\n\t\tif (!collectionsBySpaceId) {\n\t\t\treturn {\n\t\t\t\tcanMoveProject: false,\n\t\t\t\tavailableCollectionsByTeamId: {\n\t\t\t\t\t[project.space.ownerId]: {\n\t\t\t\t\t\tdisplayName: \"\",\n\t\t\t\t\t\tcollections: [defaultCollection],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\thelperText: \"Loading\u2026\",\n\t\t\t}\n\t\t}\n\t\t// Return default values in case the space cannot be found\n\t\tif (!projectSpace || !collectionsBySpaceId[project.space.id]) {\n\t\t\treturn {\n\t\t\t\tcanMoveProject: false,\n\t\t\t\tavailableCollectionsByTeamId: {\n\t\t\t\t\t[project.space.ownerId]: {\n\t\t\t\t\t\tdisplayName: \"\",\n\t\t\t\t\t\tcollections: [defaultCollection],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\thelperText: \"You don't have permission to move this project\",\n\t\t\t}\n\t\t}\n\n\t\tconst hasWritePermission = projectSpace.permissions.write\n\t\tconst userOwnsProject = project.owner.id === user.id\n\t\tconst projectIsTemplate = isTeamTemplate(project)\n\t\t// From Draft to Team\n\t\tif (isPersonalSpace(projectSpace)) {\n\t\t\tconst collection = collectionsBySpaceId[projectSpace.id]?.find(c => c.id === \"personal\") || defaultCollection\n\t\t\tconst drafts = { [projectSpace.ownerId]: { displayName: \"\", collections: [collection] } }\n\n\t\t\t// Only the owner can move the project\n\t\t\tif (!userOwnsProject) {\n\t\t\t\treturn {\n\t\t\t\t\tcanMoveProject: userOwnsProject,\n\t\t\t\t\tavailableCollectionsByTeamId: drafts,\n\t\t\t\t\thelperText: \"Only the owner of a project can move it to a different workspace.\",\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst availableCollectionsByTeamId: CollectionsByTeamId = user.spaces.reduce(\n\t\t\t\t\t(acc, s) => {\n\t\t\t\t\t\t// Project can only be moved to Teams where the user is not a Viewer\n\t\t\t\t\t\t// and initial value in reducer is Drafts, so we omit it here.\n\t\t\t\t\t\tif (!s.permissions.write || isPersonalSpace(s)) return acc\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * collectionsBySpace might be outdated if, for example, we create a new team.\n\t\t\t\t\t\t * The requests to fetch the new collections list and the new spaces (users/me) might resolve at different speeds\n\t\t\t\t\t\t * which means that you might end up in a situation where a space exists, but the corresponding entry in collectionsBySpace\n\t\t\t\t\t\t * does not.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst filteredCollections = collectionsBySpaceId[s.id]?.filter(isViewOnlyCollection) ?? []\n\t\t\t\t\t\tacc[s.ownerId] = { displayName: getSpaceName(s), collections: filteredCollections }\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t},\n\t\t\t\t\t{ ...drafts },\n\t\t\t\t) // Initial value is Drafts collection\n\n\t\t\t\tconst desc =\n\t\t\t\t\tObject.keys(availableCollectionsByTeamId).length > 1\n\t\t\t\t\t\t? \"All the members of the workspace you select will be able to view this project\"\n\t\t\t\t\t\t: `The project can only be moved within the current workspace`\n\n\t\t\t\treturn { canMoveProject: userOwnsProject, availableCollectionsByTeamId, helperText: desc }\n\t\t\t}\n\t\t}\n\n\t\tconst collections = collectionsBySpaceId[projectSpace.id]?.filter(isViewOnlyCollection) ?? []\n\n\t\t// Between teams (only admins can move projects to other teams)\n\t\tif (!projectSpace.configuration.disableMoveProjects && projectSpace.role === TeamMemberRole.Admin) {\n\t\t\tconst collectionsForCurrentTeam = {\n\t\t\t\tcollections,\n\t\t\t\tdisplayName: getSpaceName(projectSpace),\n\t\t\t}\n\n\t\t\tconst availableCollectionsByTeamId: CollectionsByTeamId = user.spaces.reduce(\n\t\t\t\t(acc, s) => {\n\t\t\t\t\t// Project can only be moved to Teams where the user is not a Viewer\n\t\t\t\t\t// and that belong to the same organization as the project if there is one\n\t\t\t\t\t// It is allowed to move projects outside of the organization if it is not a move to other organization\n\t\t\t\t\t// We also exclude the current project space as it is the default value of the reducer\n\t\t\t\t\tif (\n\t\t\t\t\t\t!s.permissions.write ||\n\t\t\t\t\t\tisPersonalSpace(s) ||\n\t\t\t\t\t\ts.id === projectSpace.id ||\n\t\t\t\t\t\t(projectSpace.organization && s.organization && s.organization?.id !== projectSpace.organization.id)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}\n\t\t\t\t\tconst filteredCollections = collectionsBySpaceId[s.id]?.filter(isViewOnlyCollection) ?? []\n\t\t\t\t\tacc[s.ownerId] = { displayName: getSpaceName(s), collections: filteredCollections }\n\t\t\t\t\treturn acc\n\t\t\t\t},\n\t\t\t\t{ [projectSpace.ownerId]: collectionsForCurrentTeam },\n\t\t\t)\n\t\t\tconst desc =\n\t\t\t\tObject.keys(availableCollectionsByTeamId).length > 1\n\t\t\t\t\t? \"Pick a folder to move your project.\"\n\t\t\t\t\t: \"The project can only be moved within the current workspace\"\n\n\t\t\treturn { canMoveProject: true, availableCollectionsByTeamId, helperText: desc }\n\t\t}\n\n\t\t// Between collections of the same Team\n\t\tconst helperText = hasWritePermission\n\t\t\t? `Pick a location to move your project. ${\n\t\t\t\t\tprojectSpace.configuration.disableMoveProjects\n\t\t\t\t\t\t? \"Your workspace must enable moving projects between workspaces to move it out of the workspace.\"\n\t\t\t\t\t\t: \"\"\n\t\t\t\t}`\n\t\t\t: \"You don't have permission to move this project.\"\n\t\treturn {\n\t\t\tcanMoveProject: hasWritePermission && !projectIsTemplate,\n\t\t\tavailableCollectionsByTeamId: {\n\t\t\t\t[projectSpace.ownerId]: { displayName: getSpaceName(projectSpace), collections },\n\t\t\t},\n\t\t\thelperText,\n\t\t}\n\t}, [collectionsBySpaceId, project, user.id, user.spaces])\n}\n", "import type { Collection, Space } from \"@framerjs/app-shared\"\nimport { isPersonalSpace } from \"@framerjs/app-shared\"\nimport { unhandledError } from \"@framerjs/shared\"\nimport { useEffect, useState } from \"react\"\nimport { apiFetcher } from \"web/lib/apiFetcher.ts\"\n\nexport function useMoveToCollections(spaces: Space[], userId: string) {\n\tconst [collections, setCollections] = useState<{ [key: string]: Collection[] } | null>(null)\n\n\tuseEffect(() => {\n\t\tlet isActive = true\n\t\tconst spaceIds = spaces\n\t\t\t.filter(space => {\n\t\t\t\tif (isPersonalSpace(space)) {\n\t\t\t\t\treturn userId === space.ownerId\n\t\t\t\t} else {\n\t\t\t\t\t// include all team spaces\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t})\n\t\t\t.map(({ id }) => id)\n\t\tgetCollectionsMany({ spaceIds })\n\t\t\t.then(collections => {\n\t\t\t\t// If the cleanup function has already been run, do not update the state\n\t\t\t\tif (!isActive) return\n\t\t\t\tsetCollections(collections)\n\t\t\t})\n\t\t\t.catch(unhandledError)\n\t\treturn () => {\n\t\t\tisActive = false\n\t\t}\n\t}, [spaces, userId])\n\n\treturn { collections }\n}\n\nasync function getCollectionsMany(options: { spaceIds: string[] }) {\n\treturn apiFetcher.post(\"/web/collections/spaces/get-many\", options)\n}\n", "import type { Space } from \"@framerjs/app-shared\"\nimport { isPersonalSpace } from \"@framerjs/app-shared\"\n\nexport function getSpaceName(space: Space): string {\n\tif (isPersonalSpace(space)) {\n\t\treturn \"Drafts\"\n\t} else {\n\t\treturn space.displayName\n\t}\n}\n"],
  "mappings": "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",
  "names": ["meta", "title", "import_react", "import_react", "import_react", "import_react", "import_react", "meta", "React", "import_react", "React", "import_jsx_runtime", "description", "import_react", "import_jsx_runtime", "React", "title", "description", "import_react", "import_react", "collections"]
}
