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 @@