├── .nvmrc ├── webapp ├── i18n │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── pl.json │ ├── ro.json │ ├── tr.json │ ├── uk.json │ ├── pt_BR.json │ ├── zh_Hans.json │ ├── zh_Hant.json │ ├── en.json │ ├── cs.json │ ├── nl.json │ ├── de.json │ ├── es.json │ ├── ru.json │ ├── hu.json │ ├── fr.json │ └── index.ts ├── .npmrc ├── tests │ ├── i18n_mock.json │ └── setup.js ├── .gitignore ├── src │ ├── client │ │ ├── index.ts │ │ └── client.ts │ ├── manifest.test.tsx │ ├── action_types │ │ └── index.ts │ ├── components │ │ ├── i18n_provider │ │ │ ├── index.ts │ │ │ └── i18n_provider.tsx │ │ ├── icon.tsx │ │ ├── conference │ │ │ ├── index.ts │ │ │ └── conference.test.tsx │ │ ├── root_portal.tsx │ │ └── post_type_jitsi │ │ │ ├── index.ts │ │ │ ├── post_type_jitsi.test.tsx │ │ │ └── post_type_jitsi.tsx │ ├── utils │ │ ├── date_utils.test.ts │ │ ├── user_utils.ts │ │ ├── date_utils.ts │ │ └── user_utils.test.ts │ ├── types.ts │ ├── reducers │ │ └── index.ts │ ├── constants │ │ └── svgs.ts │ ├── index.tsx │ └── actions │ │ └── index.ts ├── tsconfig.json ├── babel.config.js ├── webpack.config.js ├── package.json └── .eslintrc.json ├── .gitpod.yml ├── .gitattributes ├── assets ├── icon.png ├── i18n │ ├── active.en.json │ ├── active.ru.json │ ├── active.de.json │ ├── active.es.json │ └── active.fr.json └── icon.svg ├── public └── app-bar-icon.png ├── server ├── main.go ├── plugin_test.go ├── configuration.go ├── randomNameGenerator.go ├── command_test.go ├── api.go └── command.go ├── docker-make ├── .github ├── dependabot.yml ├── workflows │ ├── cd.yml │ └── ci.yml └── ISSUE_TEMPLATE │ └── issue.md ├── .gitignore ├── Dockerfile ├── .editorconfig ├── .golangci.yml ├── go.mod ├── CONTRIBUTING.md ├── plugin.json ├── README.md ├── Makefile └── LICENSE /.nvmrc: -------------------------------------------------------------------------------- 1 | 16.13.1 2 | -------------------------------------------------------------------------------- /webapp/i18n/it.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/ja.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/ko.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/pl.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/ro.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/tr.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/uk.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/.npmrc: -------------------------------------------------------------------------------- 1 | save-exact=true 2 | -------------------------------------------------------------------------------- /webapp/i18n/pt_BR.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/zh_Hans.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/i18n/zh_Hant.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/tests/i18n_mock.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /webapp/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .npminstall 3 | junit.xml 4 | .eslintcache 5 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | mainConfiguration: https://github.com/mattermost/mattermost-gitpod-config 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | server/manifest.go linguist-generated=true 2 | webapp/src/manifest.js linguist-generated=true 3 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattermost-community/mattermost-plugin-jitsi/HEAD/assets/icon.png -------------------------------------------------------------------------------- /public/app-bar-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattermost-community/mattermost-plugin-jitsi/HEAD/public/app-bar-icon.png -------------------------------------------------------------------------------- /webapp/src/client/index.ts: -------------------------------------------------------------------------------- 1 | import ClientClass from './client'; 2 | 3 | const Client = new ClientClass(); 4 | 5 | export default Client; 6 | -------------------------------------------------------------------------------- /server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/mattermost/mattermost/server/public/plugin" 4 | 5 | func main() { 6 | plugin.ClientMain(&Plugin{}) 7 | } 8 | -------------------------------------------------------------------------------- /docker-make: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -ex 4 | 5 | sudo docker build -t mattermost-plugin-jitsi-builder . 6 | sudo docker run --rm -it -v $(pwd):/src -w /src mattermost-plugin-jitsi-builder make "$@" 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | # Enable version updates for GOLang dependencies 4 | - package-ecosystem: "gomod" 5 | directory: "/" 6 | schedule: 7 | interval: "monthly" 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | bin/ 3 | webapp/src/manifest.ts 4 | server/manifest.go 5 | 6 | # Mac 7 | .DS_Store 8 | 9 | # VSCode 10 | .vscode 11 | 12 | assets/i18n/translate.*.json 13 | 14 | # Jetbrains 15 | .idea/ 16 | 17 | -------------------------------------------------------------------------------- /webapp/src/manifest.test.tsx: -------------------------------------------------------------------------------- 1 | import manifest from './manifest'; 2 | 3 | test('Plugin manifest, id and version are defined', () => { 4 | expect(manifest).toBeDefined(); 5 | expect(manifest.id).toBeDefined(); 6 | expect(manifest.version).toBeDefined(); 7 | }); 8 | -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: cd 2 | on: 3 | push: 4 | tags: 5 | - "v*" 6 | 7 | jobs: 8 | plugin-cd: 9 | uses: mattermost/actions-workflows/.github/workflows/community-plugin-cd.yml@d9defa3e455bdbf889573e112ad8d05b91d66b4c 10 | secrets: inherit 11 | -------------------------------------------------------------------------------- /webapp/tests/setup.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 | // See LICENSE.txt for license information. 3 | 4 | import Enzyme from 'enzyme'; 5 | import Adapter from 'enzyme-adapter-react-16'; 6 | 7 | Enzyme.configure({adapter: new Adapter()}); 8 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - master 7 | - main 8 | 9 | jobs: 10 | plugin-ci: 11 | uses: mattermost/actions-workflows/.github/workflows/community-plugin-ci.yml@139a051e8651e6246e3764fe342297b73120e590 12 | secrets: inherit 13 | -------------------------------------------------------------------------------- /webapp/src/action_types/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 | // See LICENSE.txt for license information. 3 | 4 | import manifest from '../manifest'; 5 | 6 | const {id: pluginId} = manifest; 7 | 8 | export default { 9 | OPEN_MEETING: pluginId + '_open_meeting', 10 | CONFIG_RECEIVED: pluginId + '_config_received', 11 | USER_STATUS_CHANGED: pluginId + '_user_status_changed' 12 | }; 13 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.21 2 | 3 | RUN apt update && \ 4 | apt -y install build-essential npm && \ 5 | npm install n -g && \ 6 | n v16.13.1 && \ 7 | rm -rf /var/lib/apt/lists/* 8 | 9 | RUN addgroup --gid 1000 node \ 10 | && useradd --create-home --uid 1000 --gid node --shell /bin/sh node 11 | 12 | RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 13 | 14 | USER node 15 | 16 | CMD /bin/sh 17 | -------------------------------------------------------------------------------- /webapp/src/components/i18n_provider/index.ts: -------------------------------------------------------------------------------- 1 | import {connect} from 'react-redux'; 2 | 3 | import {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n'; 4 | import {GlobalState} from 'mattermost-redux/types/store'; 5 | 6 | import {I18nProvider} from './i18n_provider'; 7 | 8 | function mapStateToProps(state: GlobalState) { 9 | return { 10 | currentLocale: getCurrentUserLocale(state) 11 | }; 12 | } 13 | 14 | export default connect(mapStateToProps)(I18nProvider); 15 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org/ 2 | 3 | root = true 4 | 5 | [*] 6 | end_of_line = lf 7 | insert_final_newline = true 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | 11 | [*.go] 12 | indent_style = tab 13 | 14 | [*.{js,jsx,json,html}] 15 | indent_style = space 16 | indent_size = 4 17 | 18 | [webapp/package.json] 19 | indent_size = 2 20 | 21 | [Makefile,*.mk] 22 | indent_style = tab 23 | 24 | [*.md] 25 | indent_style = space 26 | indent_size = 4 27 | trim_trailing_whitespace = false 28 | 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Mattermost Version** 11 | 12 | **Plugin Version** 13 | 14 | **Describe the issue** 15 | A clear and concise description of what the problem is. 16 | 17 | **Server Error Logs** 18 | 19 | **Google Chrome Error Logs** 20 | 21 | **Screenshots** 22 | If applicable, add screenshots to help explain your problem. 23 | 24 | **Additional context** 25 | Add any other context about the problem here. 26 | -------------------------------------------------------------------------------- /webapp/src/utils/date_utils.test.ts: -------------------------------------------------------------------------------- 1 | import {describe, expect, it} from '@jest/globals'; 2 | 3 | import {formatDate} from './date_utils'; 4 | 5 | describe('formatDate', () => { 6 | const sampleDate = new Date(2020, 5, 29, 15, 32, 0); 7 | 8 | it('should return a valid formated date with military time', () => { 9 | expect(formatDate(sampleDate, true)).toBe('Jun 29 at 15:32'); 10 | }); 11 | 12 | it('should return a valid formated date without military time', () => { 13 | expect(formatDate(sampleDate, false)).toBe('Jun 29 at 3:32 PM'); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /webapp/i18n/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Close", 3 | "jitsi.creator-has-started-a-meeting": "{creator} has started a meeting", 4 | "jitsi.default-title": "Jitsi Meeting", 5 | "jitsi.join-meeting": "JOIN MEETING", 6 | "jitsi.link-valid-until": "Meeting link valid until: ", 7 | "jitsi.maximize": "Maximize", 8 | "jitsi.meeting-id": "Meeting ID: ", 9 | "jitsi.minimize": "Minimize", 10 | "jitsi.move-down": "Move down", 11 | "jitsi.move-up": "Move up", 12 | "jitsi.open-in-new-tab": "Open in new tab", 13 | "jitsi.personal-meeting-id": "Personal Meeting ID (PMI): " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Zavřít", 3 | "jitsi.creator-has-started-a-meeting": "{creator} zahájil schůzku", 4 | "jitsi.default-title": "Jitsi Meeting", 5 | "jitsi.join-meeting": "PŘIPOJIT SE KE SCHŮZCE", 6 | "jitsi.link-valid-until": "Odkaz na schůzku platný do: ", 7 | "jitsi.maximize": "Maximalizovat", 8 | "jitsi.meeting-id": "ID schůzky: ", 9 | "jitsi.minimize": "Minimalizovat", 10 | "jitsi.move-down": "Posunout dolů", 11 | "jitsi.move-up": "Posunout nahoru", 12 | "jitsi.open-in-new-tab": "Otevřít v novém tabu", 13 | "jitsi.personal-meeting-id": "ID osobní schůzky (PMI): " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Sluiten", 3 | "jitsi.creator-has-started-a-meeting": "{creator} is een vergadering gestart", 4 | "jitsi.default-title": "Jitsi Vergadering", 5 | "jitsi.join-meeting": "DEELNEMEN", 6 | "jitsi.link-valid-until": "Vergaderlink geldig tot: ", 7 | "jitsi.maximize": "Maximaliseren", 8 | "jitsi.meeting-id": "Vergaderings-ID: ", 9 | "jitsi.minimize": "Minimaliseren", 10 | "jitsi.move-down": "Naar beneden", 11 | "jitsi.move-up": "Omhoog", 12 | "jitsi.open-in-new-tab": "Openen in nieuw tabblad", 13 | "jitsi.personal-meeting-id": "Persoonlijke vergadering-ID: " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Schließen", 3 | "jitsi.creator-has-started-a-meeting": "{creator} hat ein Meeting gestartet", 4 | "jitsi.default-title": "Jitsi Meeting", 5 | "jitsi.join-meeting": "Tritt Meeting bei", 6 | "jitsi.link-valid-until": "Meeting-Link gültig bis: ", 7 | "jitsi.maximize": "Maximieren", 8 | "jitsi.meeting-id": "Meeting ID: ", 9 | "jitsi.minimize": "Minimieren", 10 | "jitsi.move-down": "Nach unten verschieben", 11 | "jitsi.move-up": "Nach oben verschieben", 12 | "jitsi.open-in-new-tab": "In einem neuen Tab öffnen", 13 | "jitsi.personal-meeting-id": "Persönliche Meeting ID: " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Cerrar", 3 | "jitsi.creator-has-started-a-meeting": "{creator} ha iniciado una reunión", 4 | "jitsi.default-title": "Reunión Jitsi", 5 | "jitsi.join-meeting": "UNIRSE A LA REUNIÓN", 6 | "jitsi.link-valid-until": "El enlace a la reunión es válido hasta: ", 7 | "jitsi.maximize": "Maximizar", 8 | "jitsi.meeting-id": "ID de reunión: ", 9 | "jitsi.minimize": "Minimizar", 10 | "jitsi.move-down": "Mover abajo", 11 | "jitsi.move-up": "Mover arriba", 12 | "jitsi.open-in-new-tab": "Abrir en nueva pestaña", 13 | "jitsi.personal-meeting-id": "ID de sala personal de reuniones (PMI): " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Закрыть", 3 | "jitsi.creator-has-started-a-meeting": "{creator} начал совещание", 4 | "jitsi.default-title": "Совещание Jitsi", 5 | "jitsi.join-meeting": "ПРИСОЕДИНИТЬСЯ", 6 | "jitsi.link-valid-until": "Ссылка на совещание действительна до: ", 7 | "jitsi.maximize": "Развернуть", 8 | "jitsi.meeting-id": "Идентификатор совещания: ", 9 | "jitsi.minimize": "Свернуть", 10 | "jitsi.move-down": "Переместить вниз", 11 | "jitsi.move-up": "Переместить вверх", 12 | "jitsi.open-in-new-tab": "Открыть в новой вкладке", 13 | "jitsi.personal-meeting-id": "Идентификатор личной встречи (PMI): " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Bezárás", 3 | "jitsi.creator-has-started-a-meeting": "{creator} elindított egy megbeszélést", 4 | "jitsi.default-title": "Jitsi megbeszélés", 5 | "jitsi.join-meeting": "BECSATLAKOZÁS A MEGBESZÉLÉSBE", 6 | "jitsi.link-valid-until": "Megbeszélés linkjének érvényessége: ", 7 | "jitsi.maximize": "Maximalizálás", 8 | "jitsi.meeting-id": "Megbeszélés azonosító: ", 9 | "jitsi.minimize": "Kicsinyítés", 10 | "jitsi.move-down": "Mozgatás fel", 11 | "jitsi.move-up": "Mozgatás le", 12 | "jitsi.open-in-new-tab": "Megnyitás új tabon", 13 | "jitsi.personal-meeting-id": "Személyes megbeszélés azonosító (PMI): " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/i18n/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "jitsi.close": "Fermer", 3 | "jitsi.creator-has-started-a-meeting": "{creator} a démarré une réunion", 4 | "jitsi.default-title": "Réunion Jitsi", 5 | "jitsi.join-meeting": "REJOINDRE LA RÉUNION", 6 | "jitsi.link-valid-until": "Le lien de la réunion est valide jusqu'au : ", 7 | "jitsi.maximize": "Maximiser", 8 | "jitsi.meeting-id": "Identifiant de réunion : ", 9 | "jitsi.minimize": "Minimiser", 10 | "jitsi.move-down": "Déplacer vers le bas", 11 | "jitsi.move-up": "Déplacer vers le haut", 12 | "jitsi.open-in-new-tab": "Ouvrir dans un nouvel onglet", 13 | "jitsi.personal-meeting-id": "Identifiant de réunion personel (PMI) : " 14 | } 15 | -------------------------------------------------------------------------------- /webapp/src/components/icon.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Svgs from 'constants/svgs'; 3 | 4 | export default class Icon extends React.PureComponent { 5 | render() { 6 | const style = getStyle(); 7 | return ( 8 |