diff --git a/frontend/src/assets/images/identities/bluesky.svg b/frontend/src/assets/images/identities/bluesky.svg new file mode 100644 index 0000000000..15ebb7af75 --- /dev/null +++ b/frontend/src/assets/images/identities/bluesky.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/images/identities/instagram.svg b/frontend/src/assets/images/identities/instagram.svg new file mode 100644 index 0000000000..92c110243d --- /dev/null +++ b/frontend/src/assets/images/identities/instagram.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/images/identities/tiktok.svg b/frontend/src/assets/images/identities/tiktok.svg new file mode 100644 index 0000000000..c8833968d5 --- /dev/null +++ b/frontend/src/assets/images/identities/tiktok.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/images/identities/youtube.svg b/frontend/src/assets/images/identities/youtube.svg new file mode 100644 index 0000000000..29cc6e9446 --- /dev/null +++ b/frontend/src/assets/images/identities/youtube.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/config/identities/bluesky/config.ts b/frontend/src/config/identities/bluesky/config.ts new file mode 100644 index 0000000000..95bbb825a6 --- /dev/null +++ b/frontend/src/config/identities/bluesky/config.ts @@ -0,0 +1,19 @@ +import type { IdentityConfig } from '@/config/identities'; + +const image = new URL('@/assets/images/identities/bluesky.svg', import.meta.url).href; + +const bluesky: IdentityConfig = { + key: 'bluesky', + name: 'Bluesky', + image, + member: { + urlPrefix: 'bsky.app/profile/', + url: ({ identity }) => + identity.value ? `https://bsky.app/profile/${identity.value.replace(/^@/, '')}` : null, + }, + activity: { + showLink: true, + }, +}; + +export default bluesky; diff --git a/frontend/src/config/identities/facebook/config.ts b/frontend/src/config/identities/facebook/config.ts index 32cade49e8..6ac13e34b7 100644 --- a/frontend/src/config/identities/facebook/config.ts +++ b/frontend/src/config/identities/facebook/config.ts @@ -1,9 +1,6 @@ import type { IdentityConfig } from '@/config/identities'; -const image = new URL( - '@/assets/images/identities/facebook.png', - import.meta.url, -).href; +const image = new URL('@/assets/images/identities/facebook.png', import.meta.url).href; const facebook: IdentityConfig = { key: 'facebook', diff --git a/frontend/src/config/identities/index.ts b/frontend/src/config/identities/index.ts index 60107e5d3b..60d6679b6a 100644 --- a/frontend/src/config/identities/index.ts +++ b/frontend/src/config/identities/index.ts @@ -3,6 +3,7 @@ import type { ContributorIdentity, } from '@/modules/contributor/types/Contributor'; import type { OrganizationIdentity } from '@/modules/organization/types/Organization'; +import bluesky from './bluesky/config'; import confluence from './confluence/config'; import crunchbase from './crunchbase/config'; import cvent from './cvent/config'; @@ -16,6 +17,7 @@ import github from './github/config'; import gitlab from './gitlab/config'; import groupsio from './groupsio/config'; import hackernews from './hackernews/config'; +import instagram from './instagram/config'; import jira from './jira/config'; import lfid from './lfx/config'; import linkedin from './linkedin/config'; @@ -24,8 +26,10 @@ import n8n from './n8n/config'; import reddit from './reddit/config'; import slack from './slack/config'; import stackoverflow from './stackoverflow/config'; +import tiktok from './tiktok/config'; import tnc from './tnc/config'; import twitter from './twitter/config'; +import youtube from './youtube/config'; import zapier from './zapier/config'; export interface IdentityConfig { @@ -86,4 +90,8 @@ export const lfIdentities: Record = { n8n, training_cert: tnc, zapier, + youtube, + bluesky, + tiktok, + instagram, }; diff --git a/frontend/src/config/identities/instagram/config.ts b/frontend/src/config/identities/instagram/config.ts new file mode 100644 index 0000000000..8e24ca2f14 --- /dev/null +++ b/frontend/src/config/identities/instagram/config.ts @@ -0,0 +1,19 @@ +import type { IdentityConfig } from '@/config/identities'; + +const image = new URL('@/assets/images/identities/instagram.svg', import.meta.url).href; + +const instagram: IdentityConfig = { + key: 'instagram', + name: 'Instagram', + image, + member: { + urlPrefix: 'instagram.com/', + url: ({ identity }) => + identity.value ? `https://www.instagram.com/${identity.value.replace(/^@/, '')}` : null, + }, + activity: { + showLink: true, + }, +}; + +export default instagram; diff --git a/frontend/src/config/identities/tiktok/config.ts b/frontend/src/config/identities/tiktok/config.ts new file mode 100644 index 0000000000..2e720d6ac9 --- /dev/null +++ b/frontend/src/config/identities/tiktok/config.ts @@ -0,0 +1,19 @@ +import type { IdentityConfig } from '@/config/identities'; + +const image = new URL('@/assets/images/identities/tiktok.svg', import.meta.url).href; + +const tiktok: IdentityConfig = { + key: 'tiktok', + name: 'TikTok', + image, + member: { + urlPrefix: 'tiktok.com/@', + url: ({ identity }) => + identity.value ? `https://www.tiktok.com/@${identity.value.replace(/^@/, '')}` : null, + }, + activity: { + showLink: true, + }, +}; + +export default tiktok; diff --git a/frontend/src/config/identities/youtube/config.ts b/frontend/src/config/identities/youtube/config.ts new file mode 100644 index 0000000000..67a19ef9d9 --- /dev/null +++ b/frontend/src/config/identities/youtube/config.ts @@ -0,0 +1,19 @@ +import type { IdentityConfig } from '@/config/identities'; + +const image = new URL('@/assets/images/identities/youtube.svg', import.meta.url).href; + +const youtube: IdentityConfig = { + key: 'youtube', + name: 'YouTube', + image, + member: { + urlPrefix: 'youtube.com/channel/', + url: ({ identity }) => + identity.value ? `https://www.youtube.com/channel/${identity.value}` : null, + }, + activity: { + showLink: true, + }, +}; + +export default youtube; diff --git a/frontend/src/config/integrations/integrations.helpers.ts b/frontend/src/config/integrations/integrations.helpers.ts index 1f6db2a145..39f372de4c 100644 --- a/frontend/src/config/integrations/integrations.helpers.ts +++ b/frontend/src/config/integrations/integrations.helpers.ts @@ -1,15 +1,21 @@ -import { mapGetters } from '@/shared/vuex/vuex.helpers'; +import { useStore } from 'vuex'; +import type { IntegrationConfig } from '@/config/integrations/index'; import { lfIntegrations } from '@/config/integrations/index'; +import type { Integration } from '@/modules/admin/modules/integration/types/Integration'; + +type StoredIntegration = Pick, 'status'> & { platform: string }; const useIntegrationsHelpers = () => { - const getActiveIntegrations = () => { - const { findByPlatform }: any = mapGetters('integrations'); + const store = useStore(); + + const getActiveIntegrations = (): IntegrationConfig[] => { + const integrations: StoredIntegration[] = store.getters['integration/array'] ?? []; - return Object.values(lfIntegrations()).map((config) => ({ - ...config, - ...(findByPlatform ? findByPlatform(config.key) : {}), - })) - .filter((integration) => integration.status); + return Object.values(lfIntegrations()).filter((config) => + integrations.some( + (integration) => integration.platform === config.key && !!integration.status, + ), + ); }; return { diff --git a/frontend/src/config/integrations/octolens/config.ts b/frontend/src/config/integrations/octolens/config.ts index c0f019cd3d..526cc0488f 100644 --- a/frontend/src/config/integrations/octolens/config.ts +++ b/frontend/src/config/integrations/octolens/config.ts @@ -2,12 +2,26 @@ import type { IntegrationConfig } from '@/config/integrations'; const image = new URL('@/assets/images/integrations/octolens.png', import.meta.url).href; +// Must match ENABLED_PLATFORMS in services/libs/connectors/src/connectors/octolens/mapper.ts. +export const octolensMentionPlatforms: readonly string[] = [ + 'github', + 'twitter', + 'linkedin', + 'reddit', + 'devto', + 'hackernews', + 'bluesky', + 'tiktok', + 'instagram', + 'youtube', +]; + const octolens: IntegrationConfig = { key: 'octolens', name: 'Octolens', image, description: - 'Mentions of LF projects on GitHub, X/Twitter, LinkedIn and more, matched to projects automatically.', + 'Mentions of LF projects on GitHub, X/Twitter, LinkedIn, Reddit, Bluesky and more, matched to projects automatically.', showProgress: false, autoManaged: true, }; diff --git a/frontend/src/shared/modules/filters/components/filterTypes/ActivityTypeFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/ActivityTypeFilter.vue index c89d6cf55b..e7439be983 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/ActivityTypeFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/ActivityTypeFilter.vue @@ -6,7 +6,7 @@ diff --git a/frontend/src/shared/modules/filters/components/filterTypes/multiselect/MultiSelectTagsFilter.vue b/frontend/src/shared/modules/filters/components/filterTypes/multiselect/MultiSelectTagsFilter.vue index 5eddbc7d4f..7934f248f3 100644 --- a/frontend/src/shared/modules/filters/components/filterTypes/multiselect/MultiSelectTagsFilter.vue +++ b/frontend/src/shared/modules/filters/components/filterTypes/multiselect/MultiSelectTagsFilter.vue @@ -38,7 +38,7 @@