feat: Figma integration#11044
Conversation
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (7)
plugins/figma/client/Settings.tsx (1)
74-76: Consider defensive handling whenfigmaAccountis undefined.If
linkedAccountIntegrationexists butfigmaAccountis undefined (e.g., due to a data inconsistency), the title will render asundefined (undefined). Consider adding a fallback:- title={`${figmaAccount?.name} (${figmaAccount?.email})`} + title={figmaAccount ? `${figmaAccount.name} (${figmaAccount.email})` : t("Connected account")}plugins/figma/shared/FigmaUtils.ts (1)
27-29: Consider URL-encoding the error parameter.If
errorcontains special characters, the resulting URL could be malformed.🔎 Proposed fix
static errorUrl(error: string) { - return `${this.settingsUrl}?error=${error}`; + return `${this.settingsUrl}?error=${encodeURIComponent(error)}`; }plugins/figma/server/figma.ts (1)
159-171: Consider validating the file metadata response structure.The code accesses
data.file.name,data.file.creator.handle, anddata.file.thumbnail_urlwithout validation. If Figma's API response changes or returns unexpected data, this could throw. Consider using a Zod schema similar to other responses.plugins/figma/server/index.ts (1)
8-8: Simplify the enabled flag.The double negation is unnecessary since the logical AND already coerces to boolean.
🔎 Proposed simplification
-const enabled = !!env.FIGMA_CLIENT_ID && !!env.FIGMA_CLIENT_SECRET; +const enabled = Boolean(env.FIGMA_CLIENT_ID && env.FIGMA_CLIENT_SECRET);server/queues/tasks/UploadIntegrationLogoTask.ts (1)
55-70: Consider coupling the switch cases to the SupportedIntegrations array.The
defaultbranch provides a safety net, but if a new service is added toSupportedIntegrations(line 8-11) without a corresponding case here, it will throw at runtime. Consider adding a comment or using TypeScript's exhaustive check pattern to catch this at compile time.🔎 Suggested pattern for exhaustive checking
case IntegrationService.Figma: ( integration as Integration<IntegrationType.LinkedAccount> ).settings.figma!.account.avatarUrl = attachment.url; break; default: + // Compile-time exhaustive check - add new cases above when extending SupportedIntegrations + const _exhaustiveCheck: never = integration.service; throw new Error( - `Unsupported integration service: ${integration.service}` + `Unsupported integration service: ${_exhaustiveCheck}` ); // This should never happen }Note: This pattern requires removing the early return guard or adjusting the type narrowing for it to work properly. Alternatively, a code comment reminder is sufficient given the defensive throw.
shared/types.ts (1)
227-246: Consider documenting the fallback union variants.The else branch is a complex union serving as a catch-all for integration types not explicitly handled. A brief comment explaining when this branch applies would improve maintainability.
+ // Fallback for untyped or legacy integration settings : | { url: string } | {plugins/figma/server/api/figma.ts (1)
49-60:addSecondscorrectly accepts numeric timestamps in date-fns v3; this pattern is used consistently throughout the codebase.Date-fns v3 explicitly supports both Date objects and millisecond timestamps (numbers) as the first argument to
addSeconds. The current usage ofDate.now()is correct and aligns with the same pattern used inserver/models/IntegrationAuthentication.ts,server/commands/accountProvisioner.ts, andplugins/linear/server/api/linear.ts. Usingnew Date()instead is a stylistic choice, not a functional improvement.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting
📒 Files selected for processing (26)
.env.sampleapp/editor/components/PasteMenu.tsxapp/editor/extensions/PasteHandler.tsxplugins/figma/client/Icon.tsxplugins/figma/client/Settings.tsxplugins/figma/client/components/FigmaButton.tsxplugins/figma/client/index.tsxplugins/figma/plugin.jsonplugins/figma/server/api/figma.tsplugins/figma/server/api/schema.tsplugins/figma/server/env.tsplugins/figma/server/figma.tsplugins/figma/server/index.tsplugins/figma/shared/FigmaUtils.tsplugins/iframely/server/iframely.tsplugins/linear/server/api/linear.tsplugins/linear/server/index.tsplugins/slack/server/auth/slack.tsserver/presenters/unfurl.tsserver/queues/tasks/UploadIntegrationLogoTask.tsserver/types.tsshared/editor/components/Mentions.tsxshared/editor/lib/embeds.tsshared/editor/nodes/Embed.tsxshared/i18n/locales/en_US/translation.jsonshared/types.ts
🧰 Additional context used
🧬 Code graph analysis (13)
server/presenters/unfurl.ts (1)
shared/types.ts (1)
UnfurlResponse(439-542)
plugins/linear/server/api/linear.ts (1)
server/queues/tasks/UploadIntegrationLogoTask.ts (1)
UploadIntegrationLogoTask(24-82)
plugins/figma/server/api/schema.ts (1)
server/routes/api/schema.ts (1)
BaseSchema(8-12)
plugins/figma/client/components/FigmaButton.tsx (3)
app/editor/components/ComponentView.tsx (1)
props(152-161)app/utils/urls.ts (1)
redirectTo(45-47)plugins/figma/shared/FigmaUtils.ts (1)
FigmaUtils(9-52)
plugins/figma/shared/FigmaUtils.ts (1)
shared/utils/routeHelpers.ts (1)
integrationSettingsPath(9-11)
server/types.ts (1)
shared/types.ts (1)
UnfurlResponse(439-542)
shared/editor/components/Mentions.tsx (3)
plugins/github/shared/GitHubUtils.ts (1)
url(8-10)shared/types.ts (1)
UnfurlResponse(439-542)shared/utils/urls.ts (2)
toDisplayUrl(240-247)cdnPath(12-14)
plugins/figma/server/figma.ts (4)
plugins/figma/shared/FigmaUtils.ts (1)
FigmaUtils(9-52)server/types.ts (1)
UnfurlSignature(576-579)shared/utils/time.ts (1)
Minute(6-11)shared/utils/urls.ts (1)
cdnPath(12-14)
plugins/linear/server/index.ts (1)
server/queues/tasks/UploadIntegrationLogoTask.ts (1)
UploadIntegrationLogoTask(24-82)
plugins/figma/server/index.ts (2)
plugins/figma/server/figma.ts (1)
Figma(36-208)shared/utils/time.ts (1)
Minute(6-11)
plugins/figma/server/env.ts (3)
server/env.ts (1)
Environment(32-867)server/utils/decorators/Public.ts (1)
Public(10-18)server/utils/validators.ts (1)
CannotUseWithout(108-131)
app/editor/components/PasteMenu.tsx (1)
shared/editor/lib/embeds.ts (1)
getMatchingEmbed(5-17)
plugins/iframely/server/iframely.ts (2)
server/types.ts (1)
UnfurlError(574-574)shared/utils/urls.ts (1)
cdnPath(12-14)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
- GitHub Check: test-server (1)
- GitHub Check: test-server (3)
- GitHub Check: test-server (4)
- GitHub Check: test-server (2)
- GitHub Check: types
- GitHub Check: Analyze (javascript)
🔇 Additional comments (40)
shared/i18n/locales/en_US/translation.json (1)
1353-1353: Well-structured integration messages.The Figma integration translations follow the established patterns from existing integrations (GitHub, Linear, Slack) and maintain consistent tone and structure throughout. The permission prompts, error messages, and status labels align well with the application's existing UX patterns.
Also applies to: 1355-1355, 1357-1360
.env.sample (1)
221-224: LGTM! Figma OAuth configuration follows existing patterns.The new environment variables are correctly structured and consistent with other OAuth integrations (GitHub, Linear).
shared/editor/lib/embeds.ts (1)
19-27: LGTM! List iteration logic is correct.The function properly iterates through list nodes and aggregates transformation results.
plugins/figma/client/components/FigmaButton.tsx (1)
8-23: LGTM! OAuth button implementation follows best practices.The component correctly:
- Builds the OAuth authorization URL with appropriate state parameter (team ID)
- Uses the
redirectToutility for navigation- Forwards all button props for flexibility
- Implements internationalization with
t("Connect")plugins/linear/server/index.ts (1)
7-7: Backward compatibility confirmed for the generic UploadIntegrationLogoTask.The refactoring from
UploadLinearWorkspaceLogoTaskto the genericUploadIntegrationLogoTasksuccessfully consolidates duplicate code. The new task properly handles Linear (and Figma) integrations, with explicit support in theSupportedIntegrationslist. No lingering references to the old task remain, and the Hook registration is correct. Linear integrations continue to work with the same interface and will not be affected.app/editor/components/PasteMenu.tsx (3)
76-106: LGTM!Clean refactor using
getMatchingEmbedfor single-paste embed detection. The visibility and attribute handling for the embed menu item is correct.
134-157: Clean implementation for embed list detection.The logic correctly tracks whether all pasted links are convertible to embeds and determines the appropriate icon based on whether they're all the same type or mixed.
173-179: LGTM!The new
embed_listmenu item is properly structured with visibility, icon, and attrs matching the existingmention_listpattern.shared/editor/components/Mentions.tsx (2)
196-230: Good fallback handling for missing unfurl data.The restructured logic properly handles the case when no server unfurl is available by either using existing
attrs.unfurlor creating a minimal fallback with title and favicon. This prevents unnecessary re-fetches while ensuring the mention always renders something meaningful.
237-237: Verify thenodedependency is necessary.Adding
nodeto the dependency array could trigger re-fetches when the node object reference changes even if the underlying URL hasn't changed. Ifnodeis reconstructed frequently (e.g., during editor operations), this might cause unnecessary network requests.Consider whether
urlalone (derived fromnode.attrs.href) is sufficient for re-triggering the effect.plugins/figma/client/Settings.tsx (2)
36-63: LGTM on error handling.The error handling for OAuth flow failures is comprehensive, covering access denial, authentication issues, and unknown errors with appropriate user-facing messages.
96-102: No action needed. Thedeletemethod is properly bound.The method is defined as an arrow function property on the Model base class (line 181), which automatically binds it to the instance. Arrow function properties maintain the correct
thiscontext when passed as callbacks, so there is no binding issue when passinglinkedAccountIntegration.deletetoonClick.Likely an incorrect or invalid review comment.
shared/editor/nodes/Embed.tsx (2)
144-182: Theembed_listcommand implementation looks correct.The flow properly:
- Validates cursor position and list context
- Finds the parent list node
- Transforms list items to embed nodes
- Replaces the list range with the new embeds
One minor observation: the
_attrsparameter is unused. If it's intentionally ignored, consider documenting why or using a more explicit ignore pattern.
134-143: LGTM!The
embedcommand is a clean, straightforward implementation for single embed insertion.app/editor/extensions/PasteHandler.tsx (2)
450-467: LGTM!The
insertEmbedListmethod follows the established pattern frominsertMentionList, maintaining consistency in how the paste menu handles multi-item operations.
569-573: LGTM!The
embed_listcase properly integrates with the existing switch statement pattern.plugins/figma/shared/FigmaUtils.ts (1)
42-50: LGTM!The OAuth authorization URL construction is correct, properly using
query-stringfor URL parameter encoding and including all required OAuth parameters.plugins/figma/server/figma.ts (2)
52-77: LGTM on OAuth token exchange.The implementation correctly uses Basic auth with proper headers and validates the response with Zod schema.
143-178: Good resilience pattern for multi-account unfurling.The loop through integrations with per-integration error handling ensures that a failure with one account doesn't prevent trying others. The fallback to undefined (triggering iframely unfurl) is appropriate.
plugins/figma/plugin.json (1)
1-7: LGTM!The plugin manifest is well-structured with appropriate metadata. The priority and loading order (after Linear) are clearly defined.
server/types.ts (1)
557-572: LGTM! Temporary migration pattern is sound.The
UnfurlURLtype with thetransformedUnfurlflag provides type-safe backward compatibility during the unfurl response migration. This aligns well with the temporary handling inserver/presenters/unfurl.ts(lines 34-37).plugins/figma/client/index.tsx (1)
1-18: LGTM!The plugin registration follows best practices with lazy loading for the Settings component and a clear, user-friendly description. The integration with PluginManager is standard and correct.
server/presenters/unfurl.ts (1)
30-47: LGTM! Backward compatibility handled correctly.The two-path approach gracefully handles both transformed and legacy unfurl data. The safe navigation with optional chaining and fallback values ensures robustness. The TODO comment (line 33) appropriately notes the temporary nature of this compatibility layer.
plugins/linear/server/api/linear.ts (1)
11-11: LGTM! Good refactoring to generic integration task.The migration from
UploadLinearWorkspaceLogoTasktoUploadIntegrationLogoTaskconsolidates logo upload logic across multiple integrations. The generic task correctly handles Linear (and Figma) via service-specific branches.Also applies to: 89-89
plugins/figma/client/Icon.tsx (1)
1-26: LGTM!The icon component is well-structured with clear prop types, sensible defaults, and proper TypeScript typing.
plugins/figma/server/index.ts (1)
10-21: LGTM!The conditional plugin registration pattern is clean, and the 10-minute cache expiry appropriately accounts for Figma's rate limits.
plugins/iframely/server/iframely.ts (1)
48-59: Well-structured unfurl transformation.The explicit unfurl object structure with typed fields improves maintainability and aligns with the broader unfurl type system. The cdnPath usage for Figma favicons addresses the sizing inconsistency issue noted in the previous review.
plugins/slack/server/auth/slack.ts (1)
191-191: LGTM!The explicit generic type parameters improve type safety without any behavioral changes. This enhances IDE support and compile-time type checking.
Also applies to: 229-229, 249-249
plugins/figma/server/env.ts (1)
7-23: LGTM!The environment configuration follows established patterns and correctly:
- Exposes
FIGMA_CLIENT_IDas public (appropriate for OAuth client IDs)- Keeps
FIGMA_CLIENT_SECRETprivate (proper secret handling)- Enforces the dependency that
FIGMA_CLIENT_SECRETrequiresFIGMA_CLIENT_IDThe validation logic with
@IsOptionaland@CannotUseWithoutcorrectly handles all credential combinations.server/queues/tasks/UploadIntegrationLogoTask.ts (3)
8-11: LGTM!Clean approach using a constant array for supported integrations, making it easy to extend for future services.
26-31: LGTM!The early return for unsupported integrations is a good guard. Combined with the
withAuthenticationscope, this ensures the authentication token is available for the subsequent attachment fetch.
72-73: LGTM!Correct usage of
changed("settings", true)to signal Sequelize that the nested settings object was mutated, ensuring the save persists the changes.plugins/figma/server/api/figma.ts (6)
1-15: LGTM!Imports are well-organized, including necessary middleware, models, and utilities for the OAuth callback flow.
18-31: LGTM!The middleware chain correctly handles authentication, validation, subdomain redirection, and transaction management, consistent with other OAuth callback implementations in the codebase.
33-39: LGTM!Good placement of the error check after subdomain redirection, ensuring users see error messages on the correct domain. The comment clearly explains the reasoning.
61-82: LGTM!The integration record correctly captures Figma account metadata. The settings structure aligns with the
IntegrationSettings<IntegrationType.LinkedAccount>type definition.
84-89: LGTM!Using
afterCommitensures the integration record is persisted before the logo upload task executes, preventing race conditions.
92-95: LGTM!Error handling logs the failure for debugging while showing a generic error to users, which is appropriate for OAuth flows where detailed error messages could leak sensitive information.
shared/types.ts (2)
132-132: LGTM!Clean addition of
Figmato theIntegrationServiceenum, following the established naming pattern.
215-226: LGTM!The
LinkedAccounttype branch cleanly separates account-linked integrations (Slack, Figma) with their respective settings shapes. Thefigma.accountstructure matches the data stored during OAuth callback.
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [outline/outline](https://github.com/outline/outline) | minor | `1.3.0` → `1.4.0` | --- ### Release Notes <details> <summary>outline/outline (outline/outline)</summary> ### [`v1.4.0`](https://github.com/outline/outline/releases/tag/v1.4.0) [Compare Source](outline/outline@v1.3.0...v1.4.0) #### What's Changed ##### Highlights - New **"Toggle blocks"** allow creating content that is collapsed by default in [#​8317](outline/outline#8317) - Table cells can now have a custom background color set in [#​10930](outline/outline#10930) - Search results are now highlighted in the document when navigating from search in [#​11262](outline/outline#11262) ##### Other improvements - A new Figma integration allows unfurling information about Figma links in documents by [@​hmacr](https://github.com/hmacr) in [#​11044](outline/outline#11044) - Added support for sorting dates in table columns by [@​lucawimmer](https://github.com/lucawimmer) in [#​11198](outline/outline#11198) - Document changes made through the API are now synced to clients in realtime in [#​11186](outline/outline#11186) - The rate limiter now prefers user ID over ip address for logged in sessions, prevents issues on larger office networks in [#​11215](outline/outline#11215) - The markdown importer now supports more file layouts in [#​11278](outline/outline#11278) ##### Fixes - Fixed some typos comments and messages by [@​NAM-MAN](https://github.com/NAM-MAN) in [#​11203](outline/outline#11203) - Fixed an issue where mentions would sometimes break when using drag and drop in a list in [#​11208](outline/outline#11208) - The edit diagram control no longer appears in read-only mode in [#​11207](outline/outline#11207) - Infinite recursion in `dd-trace` dependency causes memory issues in [#​11211](outline/outline#11211) - Imported content now gracefully handles HTTP links in [#​11210](outline/outline#11210) - Editor suggestions on mobile now uses a drawer in [#​11213](outline/outline#11213) - When importing markdown checkboxes are now supported in table cells in [#​11217](outline/outline#11217) - GCS uniform bucket-level access now supported by [@​maycuatroi1](https://github.com/maycuatroi1) in [#​11222](outline/outline#11222) - Fixed a hanging read stream handle causing excessive memory usage on export in [#​11237](outline/outline#11237) - Fixed mermaid diagrams do not render when pasting markdown in [#​11243](outline/outline#11243) - Remote edits no longer exit Mermaid editing state in [#​11244](outline/outline#11244) - Table row is now inserted correctly with merged first column cells in [#​11245](outline/outline#11245) - Allow http\:// loopback redirect URIs for native OAuth apps (RFC 8252) in [#​11255](outline/outline#11255) - "Split cell" option now works without accurate selection in [#​11256](outline/outline#11256) - Adding text below images is now easier as trailing paragraph is enforcedd by [@​RudraPrasad001](https://github.com/RudraPrasad001) in [#​11257](outline/outline#11257) - Tooltip in editor toolbar with submenu is now hidden when submenu is open in [#​11263](outline/outline#11263) - Non-platform passkeys such as Yubikey and mobile QRcode are now allowed in [#​11265](outline/outline#11265) - diagrams.net theme now matches editor theme by [@​Twometer](https://github.com/Twometer) in [#​11267](outline/outline#11267) - Custom emoji characters are now displayed correctly in TOC in [#​11275](outline/outline#11275) - Fixed an issue where the policy for documents restore was too broad in [#​11279](outline/outline#11279) - Passkey setup is now available to non-admin users by [@​Raphmatt](https://github.com/Raphmatt) in [#​11286](outline/outline#11286) #### New Contributors - [@​NAM-MAN](https://github.com/NAM-MAN) made their first contribution in [#​11203](outline/outline#11203) - [@​lucawimmer](https://github.com/lucawimmer) made their first contribution in [#​11198](outline/outline#11198) - [@​maycuatroi1](https://github.com/maycuatroi1) made their first contribution in [#​11222](outline/outline#11222) - [@​RudraPrasad001](https://github.com/RudraPrasad001) made their first contribution in [#​11257](outline/outline#11257) - [@​Twometer](https://github.com/Twometer) made their first contribution in [#​11267](outline/outline#11267) - [@​Raphmatt](https://github.com/Raphmatt) made their first contribution in [#​11286](outline/outline#11286) **Full Changelog**: <outline/outline@v1.3.0...v1.4.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=--> Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3546 Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net> Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
This PR contains the following updates: | Package | Update | Change | |---|---|---| | [outlinewiki/outline](https://github.com/outline/outline) | minor | `1.3.0` → `1.4.0` | --- ### Release Notes <details> <summary>outline/outline (outlinewiki/outline)</summary> ### [`v1.4.0`](https://github.com/outline/outline/releases/tag/v1.4.0) [Compare Source](outline/outline@v1.3.0...v1.4.0) ##### What's Changed ##### Highlights - New **"Toggle blocks"** allow creating content that is collapsed by default in [#​8317](outline/outline#8317) - Table cells can now have a custom background color set in [#​10930](outline/outline#10930) - Search results are now highlighted in the document when navigating from search in [#​11262](outline/outline#11262) ##### Other improvements - A new Figma integration allows unfurling information about Figma links in documents by [@​hmacr](https://github.com/hmacr) in [#​11044](outline/outline#11044) - Added support for sorting dates in table columns by [@​lucawimmer](https://github.com/lucawimmer) in [#​11198](outline/outline#11198) - Document changes made through the API are now synced to clients in realtime in [#​11186](outline/outline#11186) - The rate limiter now prefers user ID over ip address for logged in sessions, prevents issues on larger office networks in [#​11215](outline/outline#11215) - The markdown importer now supports more file layouts in [#​11278](outline/outline#11278) ##### Fixes - Fixed some typos comments and messages by [@​NAM-MAN](https://github.com/NAM-MAN) in [#​11203](outline/outline#11203) - Fixed an issue where mentions would sometimes break when using drag and drop in a list in [#​11208](outline/outline#11208) - The edit diagram control no longer appears in read-only mode in [#​11207](outline/outline#11207) - Infinite recursion in `dd-trace` dependency causes memory issues in [#​11211](outline/outline#11211) - Imported content now gracefully handles HTTP links in [#​11210](outline/outline#11210) - Editor suggestions on mobile now uses a drawer in [#​11213](outline/outline#11213) - When importing markdown checkboxes are now supported in table cells in [#​11217](outline/outline#11217) - GCS uniform bucket-level access now supported by [@​maycuatroi1](https://github.com/maycuatroi1) in [#​11222](outline/outline#11222) - Fixed a hanging read stream handle causing excessive memory usage on export in [#​11237](outline/outline#11237) - Fixed mermaid diagrams do not render when pasting markdown in [#​11243](outline/outline#11243) - Remote edits no longer exit Mermaid editing state in [#​11244](outline/outline#11244) - Table row is now inserted correctly with merged first column cells in [#​11245](outline/outline#11245) - Allow http\:// loopback redirect URIs for native OAuth apps (RFC 8252) in [#​11255](outline/outline#11255) - "Split cell" option now works without accurate selection in [#​11256](outline/outline#11256) - Adding text below images is now easier as trailing paragraph is enforcedd by [@​RudraPrasad001](https://github.com/RudraPrasad001) in [#​11257](outline/outline#11257) - Tooltip in editor toolbar with submenu is now hidden when submenu is open in [#​11263](outline/outline#11263) - Non-platform passkeys such as Yubikey and mobile QRcode are now allowed in [#​11265](outline/outline#11265) - diagrams.net theme now matches editor theme by [@​Twometer](https://github.com/Twometer) in [#​11267](outline/outline#11267) - Custom emoji characters are now displayed correctly in TOC in [#​11275](outline/outline#11275) - Fixed an issue where the policy for documents restore was too broad in [#​11279](outline/outline#11279) - Passkey setup is now available to non-admin users by [@​Raphmatt](https://github.com/Raphmatt) in [#​11286](outline/outline#11286) ##### New Contributors - [@​NAM-MAN](https://github.com/NAM-MAN) made their first contribution in [#​11203](outline/outline#11203) - [@​lucawimmer](https://github.com/lucawimmer) made their first contribution in [#​11198](outline/outline#11198) - [@​maycuatroi1](https://github.com/maycuatroi1) made their first contribution in [#​11222](outline/outline#11222) - [@​RudraPrasad001](https://github.com/RudraPrasad001) made their first contribution in [#​11257](outline/outline#11257) - [@​Twometer](https://github.com/Twometer) made their first contribution in [#​11267](outline/outline#11267) - [@​Raphmatt](https://github.com/Raphmatt) made their first contribution in [#​11286](outline/outline#11286) **Full Changelog**: <outline/outline@v1.3.0...v1.4.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=--> Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3547 Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net> Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Closes #10967
This PR adds the ability to connect Figma account through OAuth to fetch file metadata for mentions.
We'll need to create a public oauth app and submit it for approval before releasing this PR.
Required scopes:
current_user:read- Store user name to denote which account is connected.file_metadata:read- Read file name, thumbnail_url, etc. for mention node.