diff --git a/frontend/src/assets/icons/sdks/Logo-android.svg b/frontend/src/assets/icons/sdks/Logo-android.svg new file mode 100644 index 0000000000..b5502d911d --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-datadog.svg b/frontend/src/assets/icons/sdks/Logo-datadog.svg new file mode 100644 index 0000000000..8ff4ea04be --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-datadog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-edge.svg b/frontend/src/assets/icons/sdks/Logo-edge.svg new file mode 100644 index 0000000000..637a6101ce --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-edge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-flutter.svg b/frontend/src/assets/icons/sdks/Logo-flutter.svg new file mode 100644 index 0000000000..5f0bfc7e1b --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-flutter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-go.svg b/frontend/src/assets/icons/sdks/Logo-go.svg new file mode 100644 index 0000000000..fee74b84c2 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-go.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-ios.svg b/frontend/src/assets/icons/sdks/Logo-ios.svg new file mode 100644 index 0000000000..09e9b858da --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-ios.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-java.svg b/frontend/src/assets/icons/sdks/Logo-java.svg new file mode 100644 index 0000000000..63d2c58ee7 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-javascript.svg b/frontend/src/assets/icons/sdks/Logo-javascript.svg new file mode 100644 index 0000000000..dae99d1b8d --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-javascript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-jira.svg b/frontend/src/assets/icons/sdks/Logo-jira.svg new file mode 100644 index 0000000000..334f123a1d --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-jira.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-net.svg b/frontend/src/assets/icons/sdks/Logo-net.svg new file mode 100644 index 0000000000..a6e897536f --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-net.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-node.svg b/frontend/src/assets/icons/sdks/Logo-node.svg new file mode 100644 index 0000000000..ad715b887e --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-node.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-php.svg b/frontend/src/assets/icons/sdks/Logo-php.svg new file mode 100644 index 0000000000..e7505dbc3f --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-python.svg b/frontend/src/assets/icons/sdks/Logo-python.svg new file mode 100644 index 0000000000..e84549646a --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-python.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-react.svg b/frontend/src/assets/icons/sdks/Logo-react.svg new file mode 100644 index 0000000000..fe0597f351 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-ruby.svg b/frontend/src/assets/icons/sdks/Logo-ruby.svg new file mode 100644 index 0000000000..f574f07ac5 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-ruby.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-rust.svg b/frontend/src/assets/icons/sdks/Logo-rust.svg new file mode 100644 index 0000000000..267b2a4faf --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-rust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-slack.svg b/frontend/src/assets/icons/sdks/Logo-slack.svg new file mode 100644 index 0000000000..d9d01242b2 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-svelte.svg b/frontend/src/assets/icons/sdks/Logo-svelte.svg new file mode 100644 index 0000000000..866609fd3e --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-teams.svg b/frontend/src/assets/icons/sdks/Logo-teams.svg new file mode 100644 index 0000000000..cb70b68379 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-teams.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-vue.svg b/frontend/src/assets/icons/sdks/Logo-vue.svg new file mode 100644 index 0000000000..3b687aa86c --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/icons/sdks/Logo-webhook.svg b/frontend/src/assets/icons/sdks/Logo-webhook.svg new file mode 100644 index 0000000000..77943d6091 --- /dev/null +++ b/frontend/src/assets/icons/sdks/Logo-webhook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/AvailableIntegrations.tsx b/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/AvailableIntegrations.tsx index 5d9c980629..0c6f37eeb9 100644 --- a/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/AvailableIntegrations.tsx +++ b/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/AvailableIntegrations.tsx @@ -6,7 +6,8 @@ import { PageHeader } from 'component/common/PageHeader/PageHeader'; import { IntegrationCard } from '../IntegrationCard/IntegrationCard'; import { JIRA_INFO } from '../../JiraIntegration/JiraIntegration'; import { StyledCardsGrid } from '../IntegrationList.styles'; -import { Paper, Typography, styled } from '@mui/material'; +import { Typography, styled } from '@mui/material'; +import { OFFICIAL_SDKS } from './SDKs'; interface IAvailableIntegrationsProps { providers: AddonTypeSchema[]; @@ -43,6 +44,8 @@ export const AvailableIntegrations: VFC = ({ loading, }) => { const customProviders = [JIRA_INFO]; + const serverSdks = OFFICIAL_SDKS.filter(sdk => sdk.type === 'server'); + const clientSdks = OFFICIAL_SDKS.filter(sdk => sdk.type === 'client'); const ref = useLoading(loading || false); @@ -112,6 +115,77 @@ export const AvailableIntegrations: VFC = ({ )} */} + +
+ + Official SDKs + + + In order to connect your application to Unleash you + will need a client SDK (software developer kit) for + your programming language and an API token. + +
+
+ + Server-side SDKs + + + Server-side clients run on your server and + communicate directly with your Unleash instance. + +
+ + {serverSdks?.map( + ({ + name, + displayName, + description, + documentationUrl, + }) => ( + + ) + )} + +
+ + Client-side SDKs + + + Client-side SDKs can connect to the Unleash Proxy or + to the Unleash front-end API, but not to the regular + Unleash client API. + +
+ + {clientSdks?.map( + ({ + name, + displayName, + description, + documentationUrl, + }) => ( + + ) + )} + +
diff --git a/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/SDKs.ts b/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/SDKs.ts new file mode 100644 index 0000000000..bd6e02f90a --- /dev/null +++ b/frontend/src/component/integrations/IntegrationList/AvailableIntegrations/SDKs.ts @@ -0,0 +1,117 @@ +export interface Sdk { + name: string; + displayName: string; + description: string; + documentationUrl: string; + type: 'server' | 'client'; +} + +export const OFFICIAL_SDKS: Sdk[] = [ + { + name: 'go', + displayName: 'GO SDK', + description: 'Officially Unleash Client for Go', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/go', + type: 'server', + }, + { + name: 'java', + displayName: 'Java SDK', + description: 'Officially Unleash Client for Java', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/java', + type: 'server', + }, + { + name: 'node', + displayName: 'Node.js SDK', + description: 'Officially Unleash Client for Node.js', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/node', + type: 'server', + }, + { + name: 'php', + displayName: 'PHP SDK', + description: 'Officially Unleash Client for PHP', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/php', + type: 'server', + }, + { + name: 'python', + displayName: 'Python SDK', + description: 'Officially Unleash Client for Python', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/python', + type: 'server', + }, + { + name: 'ruby', + displayName: 'Ruby SDK', + description: 'Officially Unleash Client for Ruby', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/ruby', + type: 'server', + }, + { + name: 'rust', + displayName: 'Rust SDK', + description: 'Officially Unleash Client for Rust', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/rust', + type: 'server', + }, + { + name: 'dotnet', + displayName: '.Net SDK', + description: 'Officially Unleash Client for .Net', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/dotnet ', + type: 'server', + }, + { + name: 'android', + displayName: 'Android SDK', + description: 'Officially Unleash Client for Android', + documentationUrl: + 'https://docs.getunleash.io/reference/sdks/android-proxy', + type: 'client', + }, + { + name: 'flutter', + displayName: 'Flutter Proxy SDK', + description: 'Officially Unleash Client for Flutter', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/flutter', + type: 'client', + }, + { + name: 'ios', + displayName: 'iOS Proxy SDK', + description: 'Officially Unleash Client for iOS', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/ios-proxy', + type: 'client', + }, + { + name: 'javascript', + displayName: 'Javascript Proxy SDK', + description: 'Officially Unleash Client for Javascript', + documentationUrl: + 'https://docs.getunleash.io/reference/sdks/javascript-browser', + type: 'client', + }, + { + name: 'react', + displayName: 'React Proxy SDK', + description: 'Officially Unleash Client for React', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/react', + type: 'client', + }, + { + name: 'svelte', + displayName: 'Svelte Proxy SDK', + description: 'Officially Unleash Client for Svelte', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/svelte', + type: 'client', + }, + { + name: 'vue', + displayName: 'Vue Proxy SDK', + description: 'Officially Unleash Client for Vue', + documentationUrl: 'https://docs.getunleash.io/reference/sdks/vue', + type: 'client', + }, +]; diff --git a/frontend/src/component/integrations/IntegrationList/IntegrationCard/IntegrationCard.tsx b/frontend/src/component/integrations/IntegrationList/IntegrationCard/IntegrationCard.tsx index a424c807a3..0a3efdd5e7 100644 --- a/frontend/src/component/integrations/IntegrationList/IntegrationCard/IntegrationCard.tsx +++ b/frontend/src/component/integrations/IntegrationList/IntegrationCard/IntegrationCard.tsx @@ -1,6 +1,6 @@ -import { VFC } from 'react'; +import React, { Fragment, VFC } from 'react'; import { Link } from 'react-router-dom'; -import { styled, Typography } from '@mui/material'; +import { styled, Typography, Theme } from '@mui/material'; import { IntegrationIcon } from '../IntegrationIcon/IntegrationIcon'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import ChevronRightIcon from '@mui/icons-material/ChevronRight'; @@ -17,6 +17,7 @@ interface IIntegrationCardProps { isEnabled?: boolean; configureActionText?: string; link: string; + isExternal?: boolean; addon?: AddonSchema; } @@ -33,6 +34,19 @@ const StyledLink = styled(Link)(({ theme }) => ({ backgroundColor: theme.palette.action.hover, }, })); +const StyledAnchor = styled('a')(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + padding: theme.spacing(3), + borderRadius: `${theme.shape.borderRadiusMedium}px`, + border: `1px solid ${theme.palette.divider}`, + textDecoration: 'none', + color: 'inherit', + boxShadow: theme.boxShadows.card, + ':hover': { + backgroundColor: theme.palette.action.hover, + }, +})); const StyledHeader = styled('div')(({ theme }) => ({ display: 'flex', @@ -64,11 +78,12 @@ export const IntegrationCard: VFC = ({ configureActionText = 'Configure', link, addon, + isExternal = false, }) => { const isConfigured = addon !== undefined; - return ( - + const content = ( + {title} @@ -90,12 +105,22 @@ export const IntegrationCard: VFC = ({ show={} /> - + {description} {configureActionText} - + ); + + if (isExternal) { + return ( + + {content} + + ); + } else { + return {content}; + } }; diff --git a/frontend/src/component/integrations/IntegrationList/IntegrationIcon/IntegrationIcon.tsx b/frontend/src/component/integrations/IntegrationList/IntegrationIcon/IntegrationIcon.tsx index b7c7fd822a..1afbc1918f 100644 --- a/frontend/src/component/integrations/IntegrationList/IntegrationIcon/IntegrationIcon.tsx +++ b/frontend/src/component/integrations/IntegrationList/IntegrationIcon/IntegrationIcon.tsx @@ -9,6 +9,22 @@ import webhooksIcon from 'assets/icons/webhooks.svg'; import teamsIcon from 'assets/icons/teams.svg'; import dataDogIcon from 'assets/icons/datadog.svg'; +import android from 'assets/icons/sdks/Logo-android.svg'; +import dotnet from 'assets/icons/sdks/Logo-net.svg'; +import flutter from 'assets/icons/sdks/Logo-flutter.svg'; +import go from 'assets/icons/sdks/Logo-go.svg'; +import ios from 'assets/icons/sdks/Logo-ios.svg'; +import java from 'assets/icons/sdks/Logo-java.svg'; +import javascript from 'assets/icons/sdks/Logo-javascript.svg'; +import node from 'assets/icons/sdks/Logo-node.svg'; +import php from 'assets/icons/sdks/Logo-php.svg'; +import python from 'assets/icons/sdks/Logo-python.svg'; +import react from 'assets/icons/sdks/Logo-react.svg'; +import ruby from 'assets/icons/sdks/Logo-ruby.svg'; +import rust from 'assets/icons/sdks/Logo-rust.svg'; +import svelte from 'assets/icons/sdks/Logo-svelte.svg'; +import vue from 'assets/icons/sdks/Logo-vue.svg'; + const style: React.CSSProperties = { width: '32.5px', height: '32.5px', @@ -70,6 +86,110 @@ export const IntegrationIcon = ({ name }: IIntegrationIconProps) => { src={formatAssetPath(jiraIcon)} /> ); + case 'android': + return ( + Android logo + ); + case 'dotnet': + return ( + .Net logo + ); + case 'flutter': + return ( + Flutter logo + ); + case 'go': + return ( + Go logo + ); + case 'ios': + return ( + iOS logo + ); + case 'java': + return ( + Java logo + ); + case 'javascript': + return ( + JavaScript logo + ); + case 'node': + return ( + Node.js logo + ); + case 'php': + return ( + PHP logo + ); + case 'python': + return ( + Python logo + ); + case 'react': + return ( + React logo + ); + case 'ruby': + return ( + Ruby logo + ); + case 'rust': + return ( + Rust logo + ); + case 'svelte': + return ( + Svelte logo + ); + case 'vue': + return ( + Vue logo + ); default: return (