├── profile.log ├── packages └── .gitkeep ├── .husky ├── .gitignore └── pre-commit ├── apps ├── portal │ ├── public │ │ ├── .gitkeep │ │ ├── sign │ │ │ ├── 1.png │ │ │ ├── 22.png │ │ │ └── setup_finished_screen_guide.png │ │ ├── icons │ │ │ ├── 128.png │ │ │ ├── 16.png │ │ │ └── 48.png │ │ ├── edit │ │ │ └── leak_bg-min.png │ │ ├── fonts │ │ │ ├── Roboto-Bold.ttf │ │ │ ├── Roboto-Medium.ttf │ │ │ └── Roboto-Regular.ttf │ │ ├── preferences │ │ │ └── preferences.png │ │ ├── videos │ │ │ ├── chapter-placeholder.jpg │ │ │ └── play-button.svg │ │ ├── contentImages │ │ │ ├── permission-arrow.png │ │ │ ├── play.svg │ │ │ ├── recordingWindowIcons │ │ │ │ ├── button-play-grey.svg │ │ │ │ └── button-pause-grey.svg │ │ │ └── pause-light.svg │ │ ├── new-design-v2 │ │ │ ├── single-video-buttons │ │ │ │ ├── like-thumb-filled.png │ │ │ │ └── like-thumb.svg │ │ │ ├── bookmark-solid.svg │ │ │ └── comment-more-options │ │ │ │ └── more-vertical.svg │ │ ├── assets │ │ │ └── svg │ │ │ │ ├── tools-panel │ │ │ │ ├── video-play-btn.svg │ │ │ │ ├── play.svg │ │ │ │ ├── triangle.svg │ │ │ │ ├── line.svg │ │ │ │ ├── blob.svg │ │ │ │ ├── pause.svg │ │ │ │ ├── rect.svg │ │ │ │ ├── square2.svg │ │ │ │ ├── stop.svg │ │ │ │ ├── T(Fill).svg │ │ │ │ ├── star.svg │ │ │ │ ├── align-center.svg │ │ │ │ ├── align-right.svg │ │ │ │ ├── ZoomOut.svg │ │ │ │ ├── arrow.svg │ │ │ │ ├── blackTT.svg │ │ │ │ ├── whiteTT.svg │ │ │ │ ├── blackT_2.svg │ │ │ │ ├── whiteT_2.svg │ │ │ │ └── heart.svg │ │ │ │ └── whiteboard-tools-panel │ │ │ │ └── rect.svg │ │ ├── sidebar │ │ │ ├── delete.svg │ │ │ ├── folder.svg │ │ │ ├── backup.svg │ │ │ ├── sidebar-myimages.svg │ │ │ └── gallery-image.svg │ │ ├── common │ │ │ ├── file_download.svg │ │ │ ├── folder-v2.svg │ │ │ ├── add-workspace.svg │ │ │ ├── circle-solid.svg │ │ │ ├── collection-fill.svg │ │ │ ├── workspace-icon.svg │ │ │ ├── check.svg │ │ │ ├── more_horiz_black.svg │ │ │ ├── collection.svg │ │ │ ├── trello.svg │ │ │ └── more_horiz.svg │ │ ├── images │ │ │ ├── file_download.svg │ │ │ ├── dropbox-1.svg │ │ │ ├── sendemail.svg │ │ │ ├── icon-image.svg │ │ │ └── more_horiz.svg │ │ ├── whiteboards │ │ │ ├── ContextMenuItems │ │ │ │ └── newtab.svg │ │ │ └── check.svg │ │ ├── settings │ │ │ ├── account_box.svg │ │ │ ├── success.svg │ │ │ ├── icon-wallet.svg │ │ │ ├── icon-passsword.svg │ │ │ ├── trello.svg │ │ │ ├── dropbox.svg │ │ │ └── icon-trello.svg │ │ └── item │ │ │ ├── options.svg │ │ │ └── video-item.svg │ ├── .sentryclirc │ ├── pages │ │ ├── video │ │ │ ├── SaveToCloudModal │ │ │ │ └── SaveToCloudModal.module.scss │ │ │ └── ShareItemModal │ │ │ │ └── ShareItemModal.module.scss │ │ └── 404.tsx │ ├── pagesScss │ │ ├── media │ │ │ └── Videos.module.scss │ │ ├── workspaces │ │ │ └── Settngs.module.scss │ │ └── partials │ │ │ ├── _dotSeparator.scss │ │ │ └── _mixins.scss │ ├── app │ │ ├── interfaces │ │ │ ├── ILoaderType.ts │ │ │ ├── IDriveDbData.ts │ │ │ ├── ISettingsPage.ts │ │ │ ├── ActionType.ts │ │ │ ├── ISharedItem.ts │ │ │ ├── tools_interfaces │ │ │ │ ├── IPencilGroupOptions.ts │ │ │ │ ├── IEmojiOptions.ts │ │ │ │ ├── ICommentsGroupOptions.ts │ │ │ │ ├── IMarkerGroupOptions.ts │ │ │ │ ├── IToolsOptions.ts │ │ │ │ ├── IShapeGroupOptions.ts │ │ │ │ ├── IArrowGroupOptions.ts │ │ │ │ ├── ITextOptions.ts │ │ │ │ └── IConversationOptions.ts │ │ │ ├── IUniqueView.ts │ │ │ ├── IChapter.ts │ │ │ ├── IComments.ts │ │ │ ├── IMarker.ts │ │ │ ├── IWhiteboard.ts │ │ │ ├── IAppControl.ts │ │ │ ├── IPreferences.ts │ │ │ ├── IPageMenuItems.ts │ │ │ ├── IApiResponse.ts │ │ │ ├── IExplorerData.ts │ │ │ ├── ItemType.ts │ │ │ ├── IMarkerComment.ts │ │ │ ├── IStreamState.ts │ │ │ └── Folders.ts │ │ ├── enums │ │ │ ├── itemTypeEnum.ts │ │ │ ├── itemOrderEnum.ts │ │ │ ├── folderTypeEnum.ts │ │ │ ├── StreamingServicesEnums.ts │ │ │ └── itemActionsEnum.ts │ │ ├── utilities │ │ │ ├── destination.ts │ │ │ └── cn.ts │ │ ├── store │ │ │ ├── drive │ │ │ │ └── actions │ │ │ │ │ └── actionTypes.ts │ │ │ ├── whiteboard │ │ │ │ └── actions │ │ │ │ │ └── actionTypes.ts │ │ │ ├── panel │ │ │ │ └── panelUtils │ │ │ │ │ └── utials.ts │ │ │ └── auth │ │ │ │ └── actions │ │ │ │ └── actionTypes.ts │ │ └── services │ │ │ ├── helpers │ │ │ ├── getWorkspaceParam.ts │ │ │ ├── videoDuration.ts │ │ │ ├── getCookies.ts │ │ │ └── iDataResponseParser.ts │ │ │ └── email.ts │ ├── store │ │ ├── auth │ │ │ └── actions │ │ │ │ └── actionTypes.ts │ │ ├── drive │ │ │ └── actions │ │ │ │ └── actionTypes.ts │ │ └── panel │ │ │ ├── panelUtils │ │ │ └── index.ts │ │ │ └── index.ts │ ├── .prettierrc │ ├── components │ │ ├── pagesComponents │ │ │ ├── _editorScreen │ │ │ │ ├── editorHelpers │ │ │ │ │ ├── imgSrcLoader.ts │ │ │ │ │ ├── alphabet.ts │ │ │ │ │ └── pdf.ts │ │ │ │ └── toolsPanel │ │ │ │ │ ├── toolsOptions │ │ │ │ │ ├── interface │ │ │ │ │ │ ├── IPencilGroupOptions.ts │ │ │ │ │ │ ├── IEmojiOptions.ts │ │ │ │ │ │ ├── IShapeGroupOptions.ts │ │ │ │ │ │ ├── IArrowGroupOptions.ts │ │ │ │ │ │ ├── ITextOptions.ts │ │ │ │ │ │ └── IConversationOptions.ts │ │ │ │ │ ├── IToolsOptions.ts │ │ │ │ │ └── toolsOptions.module.scss │ │ │ │ │ ├── ToolBtn │ │ │ │ │ └── customToolBtn │ │ │ │ │ │ ├── EraserTool │ │ │ │ │ │ └── eraserTool.module.scss │ │ │ │ │ │ ├── ArrowTool │ │ │ │ │ │ └── arrowTool.module.scss │ │ │ │ │ │ └── ShareToolBtn │ │ │ │ │ │ └── shareToolBtn.module.scss │ │ │ │ │ ├── PanelSplitter.tsx │ │ │ │ │ └── ToolsRow.tsx │ │ │ ├── _imagesScreen │ │ │ │ └── pages │ │ │ │ │ ├── myVideos │ │ │ │ │ ├── VideosContainer.module.scss │ │ │ │ │ └── VideoItem │ │ │ │ │ │ ├── PlayButton.tsx │ │ │ │ │ │ ├── ThumbnailSkeletonLoader.tsx │ │ │ │ │ │ └── Thumbnail.module.scss │ │ │ │ │ ├── workspace │ │ │ │ │ ├── WorkspaceItemsContainer.module.scss │ │ │ │ │ └── MoveToWorkspaceModal │ │ │ │ │ │ └── MoveToWorkspaceModal.module.scss │ │ │ │ │ └── myImages │ │ │ │ │ └── screenshotsContainer │ │ │ │ │ └── ScreenshotItem │ │ │ │ │ └── ScreenshotItem.module.scss │ │ │ ├── _signScreen │ │ │ │ └── LinksDivider.tsx │ │ │ ├── _whiteboardScreen │ │ │ │ ├── whiteboardToolbar │ │ │ │ │ ├── toolButton.module.scss │ │ │ │ │ └── customToolBtns │ │ │ │ │ │ └── SubPanel.tsx │ │ │ │ └── whiteboardHelpers │ │ │ │ │ └── commentsPopup │ │ │ │ │ └── commentContentPopup.module.scss │ │ │ ├── _workspacesScreen │ │ │ │ └── WorkspaceMembersModal.module.scss │ │ │ ├── profileScreen │ │ │ │ └── ProfileAccountPhoto.module.scss │ │ │ └── _videoEditorScreen │ │ │ │ ├── chapters │ │ │ │ ├── VideoChapterContentInput │ │ │ │ │ └── VideoChapterContentInput.module.scss │ │ │ │ └── VideoChapterCaveatPopover │ │ │ │ │ └── VideoChapterCaveatPopover.module.scss │ │ │ │ └── ItemTitleAuthor │ │ │ │ └── ItemTitleAuthor.module.scss │ │ ├── containers │ │ │ ├── appContainer │ │ │ │ └── AppContainer.module.scss │ │ │ └── dashboardLayout │ │ │ │ └── DashboardLayout.module.scss │ │ ├── shared │ │ │ └── modalComponents │ │ │ │ └── ModalSaveChangesFooter.module.scss │ │ └── controls │ │ │ ├── AppButton2.module.scss │ │ │ └── AppButtonSecond.module.scss │ ├── misc │ │ ├── browserCompatible.ts │ │ ├── fallbackVideoURL.ts │ │ └── appConstConfig.ts │ ├── sentry.properties │ ├── index.d.ts │ ├── @types │ │ └── i18next.d.ts │ ├── specs │ │ └── index.spec.tsx │ ├── hooks │ │ ├── useFirstRender.ts │ │ ├── useInfiniteScroll.ts │ │ └── useEnterKeyPress.ts │ ├── next-env.d.ts │ ├── jest.config.js │ ├── tsconfig.spec.json │ └── .env.sample ├── extensions │ ├── .nvmrc │ ├── .npmrc │ ├── .eslintignore │ ├── src │ │ ├── app │ │ │ ├── utilities │ │ │ │ ├── browser.ts │ │ │ │ ├── destination.ts │ │ │ │ ├── initiateSentryJs.ts │ │ │ │ └── initiateSentryReact.ts │ │ │ ├── interfaces │ │ │ │ ├── ILoaderType.ts │ │ │ │ ├── ActionType.ts │ │ │ │ ├── IDriveDbData.ts │ │ │ │ ├── IUniqueView.ts │ │ │ │ ├── IComments.ts │ │ │ │ ├── IAppControl.ts │ │ │ │ ├── IPreferences.ts │ │ │ │ ├── IMarker.ts │ │ │ │ ├── IDataResponse.ts │ │ │ │ ├── IPageMenuItems.ts │ │ │ │ ├── IExplorerData.ts │ │ │ │ ├── ItemTypes.ts │ │ │ │ ├── IStreamState.ts │ │ │ │ └── Folders.ts │ │ │ ├── store │ │ │ │ ├── drive │ │ │ │ │ └── actions │ │ │ │ │ │ └── actionTypes.ts │ │ │ │ ├── popup │ │ │ │ │ ├── actions │ │ │ │ │ │ └── actionTypes.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── panel │ │ │ │ │ └── panelUtils │ │ │ │ │ │ └── index.ts │ │ │ │ └── auth │ │ │ │ │ └── actions │ │ │ │ │ └── actionTypes.ts │ │ │ ├── types │ │ │ │ └── types.ts │ │ │ ├── services │ │ │ │ ├── lang.ts │ │ │ │ ├── helpers │ │ │ │ │ ├── videoDuration.ts │ │ │ │ │ └── iDataResponseParser.ts │ │ │ │ └── email.ts │ │ │ └── enums │ │ │ │ ├── StreamingServicesEnums.ts │ │ │ │ └── itemActionsEnum.ts │ │ ├── content │ │ │ ├── popup │ │ │ │ ├── assets │ │ │ │ │ ├── react-multi-email.scss │ │ │ │ │ ├── hidden-scrollbar.scss │ │ │ │ │ ├── fonts │ │ │ │ │ │ ├── Roboto-Bold.ttf │ │ │ │ │ │ ├── Roboto-Medium.ttf │ │ │ │ │ │ └── Roboto-Regular.ttf │ │ │ │ │ ├── tailwind.scss │ │ │ │ │ ├── toastify.scss │ │ │ │ │ └── emojitoolPanel.scss │ │ │ │ ├── routes │ │ │ │ │ └── app.route.ts │ │ │ │ └── utilities │ │ │ │ │ └── interfaces │ │ │ │ │ └── IProgressIndicatorData.ts │ │ │ ├── overlay │ │ │ │ └── components │ │ │ │ │ ├── selectArea │ │ │ │ │ └── select-area.scss │ │ │ │ │ ├── visiblePartTimer │ │ │ │ │ └── visible-part-timer.scss │ │ │ │ │ └── videoCamera │ │ │ │ │ └── video-camera.scss │ │ │ ├── utilities │ │ │ │ ├── partials │ │ │ │ │ ├── _dotSeparator.scss │ │ │ │ │ └── _mixins.scss │ │ │ │ ├── misc │ │ │ │ │ ├── fallbackVideoURL.ts │ │ │ │ │ └── appConstConfig.ts │ │ │ │ ├── scripts │ │ │ │ │ ├── removeWindow.ts │ │ │ │ │ ├── getPercentageFromRange.ts │ │ │ │ │ └── sendBadgeTextMessagePort.ts │ │ │ │ └── hooks │ │ │ │ │ └── useEnterKeyPress.ts │ │ │ ├── panel │ │ │ │ ├── screens │ │ │ │ │ ├── settingsScreen │ │ │ │ │ │ ├── interface │ │ │ │ │ │ │ └── ISettingsPage.ts │ │ │ │ │ │ └── components │ │ │ │ │ │ │ └── ProfileAccountPhoto.module.scss │ │ │ │ │ ├── editorScreen │ │ │ │ │ │ ├── toolsPanel │ │ │ │ │ │ │ ├── ToolBtn │ │ │ │ │ │ │ │ └── components │ │ │ │ │ │ │ │ │ └── popupButton.module.scss │ │ │ │ │ │ │ ├── toolsOptions │ │ │ │ │ │ │ │ ├── interface │ │ │ │ │ │ │ │ │ ├── IPencilGroupOptions.ts │ │ │ │ │ │ │ │ │ ├── IEmojiOptions.ts │ │ │ │ │ │ │ │ │ ├── ICommentsGroupOptions.ts │ │ │ │ │ │ │ │ │ ├── IMarkerGroupOptions.ts │ │ │ │ │ │ │ │ │ ├── IShapeGroupOptions.ts │ │ │ │ │ │ │ │ │ ├── IArrowGroupOptions.ts │ │ │ │ │ │ │ │ │ ├── ITextOptions.ts │ │ │ │ │ │ │ │ │ ├── IMarkerComment.ts │ │ │ │ │ │ │ │ │ └── IConversationOptions.ts │ │ │ │ │ │ │ │ ├── IToolsOptions.ts │ │ │ │ │ │ │ │ └── strokeWidthSelector │ │ │ │ │ │ │ │ │ └── stroke-width-selector.css │ │ │ │ │ │ │ ├── PanelSplitter.tsx │ │ │ │ │ │ │ └── ToolsRow.tsx │ │ │ │ │ │ └── editorHelpers │ │ │ │ │ │ │ ├── alphabet.ts │ │ │ │ │ │ │ └── pdf.ts │ │ │ │ │ ├── videoEditorScreen │ │ │ │ │ │ ├── shareItemModal │ │ │ │ │ │ │ └── ShareItemModal.module.scss │ │ │ │ │ │ ├── chapters │ │ │ │ │ │ │ ├── VideoChapterContentInput │ │ │ │ │ │ │ │ └── VideoChapterContentInput.module.scss │ │ │ │ │ │ │ └── VideoChapterCaveatPopover │ │ │ │ │ │ │ │ └── VideoChapterCaveatPopover.module.scss │ │ │ │ │ │ └── ItemTitleAuthor │ │ │ │ │ │ │ └── ItemTitleAuthor.module.scss │ │ │ │ │ ├── IntegrationsScreen │ │ │ │ │ │ └── Integrations.module.scss │ │ │ │ │ ├── imagesScreen │ │ │ │ │ │ └── pages │ │ │ │ │ │ │ ├── myVideos │ │ │ │ │ │ │ ├── MyVideos.module.scss │ │ │ │ │ │ │ ├── videosContainer │ │ │ │ │ │ │ │ ├── video.scss │ │ │ │ │ │ │ │ └── VideosContainer.module.scss │ │ │ │ │ │ │ ├── PlayButton │ │ │ │ │ │ │ │ └── PlayButton.tsx │ │ │ │ │ │ │ └── Thumbnail │ │ │ │ │ │ │ │ ├── ThumbnailSkeletonLoader.tsx │ │ │ │ │ │ │ │ └── Thumbnail.module.scss │ │ │ │ │ │ │ ├── shared │ │ │ │ │ │ │ ├── enums │ │ │ │ │ │ │ │ ├── itemTypeEnum.ts │ │ │ │ │ │ │ │ ├── itemOrderEnum.ts │ │ │ │ │ │ │ │ └── folderTypeEnum.ts │ │ │ │ │ │ │ ├── imagesAndVideosContainer │ │ │ │ │ │ │ │ └── ImagesAndVideos.module.scss │ │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ │ └── useInfiniteScroll.ts │ │ │ │ │ │ │ ├── workspace │ │ │ │ │ │ │ ├── WorkspaceItemsContainer.module.scss │ │ │ │ │ │ │ └── MoveToWorkspaceModal │ │ │ │ │ │ │ │ └── MoveToWorkspaceModal.module.scss │ │ │ │ │ │ │ ├── myImages │ │ │ │ │ │ │ └── screenshotsContainer │ │ │ │ │ │ │ │ └── ScreenshotItem │ │ │ │ │ │ │ │ └── ScreenshotItem.module.scss │ │ │ │ │ │ │ ├── trashed │ │ │ │ │ │ │ └── TrashedImagesVideos.module.scss │ │ │ │ │ │ │ └── workspaces │ │ │ │ │ │ │ └── WorkspaceMembersModal.module.scss │ │ │ │ │ ├── signScreen │ │ │ │ │ │ └── signFlow │ │ │ │ │ │ │ └── linksDivider │ │ │ │ │ │ │ └── LinksDivider.tsx │ │ │ │ │ ├── uploadScreen │ │ │ │ │ │ └── UploadScreen.module.scss │ │ │ │ │ └── singleImageScreen │ │ │ │ │ │ └── imageActions │ │ │ │ │ │ └── ImageActionsCard.tsx │ │ │ │ ├── hooks │ │ │ │ │ └── useFirstRender.ts │ │ │ │ ├── panelRouter │ │ │ │ │ └── panel.route.ts │ │ │ │ ├── shared │ │ │ │ │ └── modalComponents │ │ │ │ │ │ └── ModalSaveChangesFooter.module.scss │ │ │ │ ├── PanelRoutesWrapper.tsx │ │ │ │ └── components │ │ │ │ │ └── containers │ │ │ │ │ └── dashboardLayout │ │ │ │ │ ├── DashboardLayout.module.scss │ │ │ │ │ └── elements │ │ │ │ │ └── Slidedown │ │ │ │ │ └── Slidedown.module.scss │ │ │ ├── assests │ │ │ │ └── svg │ │ │ │ │ └── tools-panel │ │ │ │ │ ├── video-play-btn.svg │ │ │ │ │ ├── play.svg │ │ │ │ │ ├── triangle.svg │ │ │ │ │ ├── line.svg │ │ │ │ │ ├── blob.svg │ │ │ │ │ ├── pause.svg │ │ │ │ │ ├── rect.svg │ │ │ │ │ ├── square2.svg │ │ │ │ │ ├── T(Fill).svg │ │ │ │ │ ├── star.svg │ │ │ │ │ ├── align-center.svg │ │ │ │ │ ├── align-right.svg │ │ │ │ │ ├── arrow.svg │ │ │ │ │ ├── blackTT.svg │ │ │ │ │ ├── whiteTT.svg │ │ │ │ │ ├── blackT_2.svg │ │ │ │ │ ├── whiteT_2.svg │ │ │ │ │ └── heart.svg │ │ │ ├── components │ │ │ │ ├── containers │ │ │ │ │ └── appContainer │ │ │ │ │ │ └── AppContainer.module.scss │ │ │ │ └── controls │ │ │ │ │ └── AppButton2 │ │ │ │ │ └── AppButton2.module.scss │ │ │ └── recording │ │ │ │ ├── helpers │ │ │ │ └── setBadgeText.ts │ │ │ │ ├── components │ │ │ │ └── RecordingHeader │ │ │ │ │ └── RecordingHeader.tsx │ │ │ │ ├── interfaces │ │ │ │ └── IRecordingActionsProps.ts │ │ │ │ └── recording.html │ │ ├── background │ │ │ └── utilities │ │ │ │ └── enums │ │ │ │ └── AppThemesEnum.ts │ │ └── @types │ │ │ ├── i18next.d.ts │ │ │ └── index.d.ts │ ├── icons │ │ ├── 16.png │ │ ├── 48.png │ │ └── 128.png │ ├── .prettierrc │ ├── dev_images │ │ ├── edge.png │ │ ├── chrome.png │ │ ├── mozilla.png │ │ └── opera.png │ ├── images │ │ ├── images │ │ │ ├── leak_bg.jpg │ │ │ └── icon-image.svg │ │ ├── panel │ │ │ ├── images │ │ │ │ ├── leak_bg.jpg │ │ │ │ └── icon-image.svg │ │ │ ├── preferences │ │ │ │ └── preferences.png │ │ │ ├── videos │ │ │ │ ├── chapter-placeholder.jpg │ │ │ │ └── play-button.svg │ │ │ ├── sign │ │ │ │ └── setup_finished_screen_guide.png │ │ │ ├── sidebar │ │ │ │ ├── delete.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── backup.svg │ │ │ │ ├── sidebar-myimages.svg │ │ │ │ └── gallery-image.svg │ │ │ ├── common │ │ │ │ ├── file_download.svg │ │ │ │ ├── folder-v2.svg │ │ │ │ ├── add-workspace.svg │ │ │ │ ├── circle-solid.svg │ │ │ │ ├── sendemail.svg │ │ │ │ ├── workspace-icon.svg │ │ │ │ ├── check.svg │ │ │ │ ├── more_horiz_black.svg │ │ │ │ ├── collection.svg │ │ │ │ ├── dropbox-icon-dark.svg │ │ │ │ ├── google-drive-logo-dark.svg │ │ │ │ └── more_horiz.svg │ │ │ ├── settings │ │ │ │ ├── icon-dropbox.svg │ │ │ │ ├── account_box.svg │ │ │ │ ├── icon-wallet.svg │ │ │ │ ├── icon-passsword.svg │ │ │ │ └── icon-trello.svg │ │ │ └── item │ │ │ │ ├── options.svg │ │ │ │ └── trello.svg │ │ ├── contentImages │ │ │ ├── permission-arrow.png │ │ │ ├── play.svg │ │ │ ├── recordingWindowIcons │ │ │ │ ├── button-play-grey.svg │ │ │ │ └── button-pause-grey.svg │ │ │ └── pause-light.svg │ │ ├── new-design-v2 │ │ │ ├── single-video-buttons │ │ │ │ ├── like-thumb-filled.png │ │ │ │ └── like-thumb.svg │ │ │ ├── chapters │ │ │ │ └── bookmark-solid.svg │ │ │ └── comment-more-options │ │ │ │ └── more-vertical.svg │ │ ├── popup │ │ │ ├── capture │ │ │ │ ├── stop-cam-only.svg │ │ │ │ └── Tab_inactive.svg │ │ │ └── navigation │ │ │ │ ├── profile.svg │ │ │ │ └── myimages.svg │ │ ├── tools │ │ │ ├── ZoomOut.svg │ │ │ └── success-tick.svg │ │ └── logo │ │ │ ├── trello-logo.svg │ │ │ └── dropbox-logo.svg │ ├── .babelrc │ └── .env.sample └── api │ ├── src │ ├── utils │ │ └── nano-id.ts │ ├── module │ │ ├── email │ │ │ └── view.models │ │ │ │ └── email.view.model.ts │ │ ├── firebase │ │ │ ├── firebase.constants.ts │ │ │ └── index.ts │ │ ├── gauzy │ │ │ ├── index.ts │ │ │ └── gauzy.config.ts │ │ ├── log │ │ │ └── view.models │ │ │ │ ├── LoggerEventModel.ts │ │ │ │ └── LogEventEnum.ts │ │ ├── workspace │ │ │ ├── dto │ │ │ │ ├── teams │ │ │ │ │ ├── add-team.dto.ts │ │ │ │ │ ├── update-team.dto.ts │ │ │ │ │ ├── add-member.dto.ts │ │ │ │ │ └── delete-member.dto.ts │ │ │ │ ├── folders │ │ │ │ │ ├── update-folder.dto.ts │ │ │ │ │ ├── delete-folder.dto.ts │ │ │ │ │ ├── move-items.dto.ts │ │ │ │ │ ├── create-folder.dto.ts │ │ │ │ │ └── update-member-permissions.dto.ts │ │ │ │ ├── workspaces │ │ │ │ │ ├── create-workspace.dto.ts │ │ │ │ │ ├── rename-workspace.dto.ts │ │ │ │ │ └── get-workspace.dto.ts │ │ │ │ ├── files │ │ │ │ │ ├── like.dto.ts │ │ │ │ │ ├── move-personal-item.dto.ts │ │ │ │ │ ├── delete-video.dto.ts │ │ │ │ │ ├── update-image.dto.ts │ │ │ │ │ ├── delete-image.dto.ts │ │ │ │ │ ├── upload-image.dto.ts │ │ │ │ │ ├── upload-video.dto.ts │ │ │ │ │ └── update-member-permissions.dto.ts │ │ │ │ └── members │ │ │ │ │ └── get-populated-members.dto.ts │ │ │ ├── Interfaces │ │ │ │ ├── Folders.ts │ │ │ │ ├── Invites.ts │ │ │ │ └── AddToDbProps.ts │ │ │ ├── pipes │ │ │ │ ├── parse-on-false.pipe.ts │ │ │ │ ├── validate-image-filename.pipe.ts │ │ │ │ └── validate-video-filename.pipe.ts │ │ │ └── validators │ │ │ │ ├── image-filename.validator.ts │ │ │ │ └── video-filename.validator.ts │ │ ├── auth │ │ │ ├── services │ │ │ │ ├── register │ │ │ │ │ ├── index.ts │ │ │ │ │ └── interfaces │ │ │ │ │ │ └── register-state.interface.ts │ │ │ │ ├── password-reset │ │ │ │ │ ├── password-reset.strategy.ts │ │ │ │ │ └── interfaces │ │ │ │ │ │ └── password-request.interface.ts │ │ │ │ ├── tokens │ │ │ │ │ └── index.ts │ │ │ │ └── login │ │ │ │ │ └── interfaces │ │ │ │ │ └── login-state.interface.ts │ │ │ ├── decorators │ │ │ │ └── user.decorator.ts │ │ │ ├── dto │ │ │ │ └── send-email-verification.dto.ts │ │ │ └── interfaces │ │ │ │ └── auth.interface.ts │ │ ├── whiteboards │ │ │ └── interfaces │ │ │ │ └── Whiteboard.ts │ │ ├── editor-websocket-module │ │ │ └── editor-websocket.module.ts │ │ ├── image │ │ │ └── view.models │ │ │ │ └── image.view.model.ts │ │ ├── video │ │ │ └── view.models │ │ │ │ └── video.view.model.ts │ │ └── video-services │ │ │ ├── mux │ │ │ └── mux.module.ts │ │ │ └── api-video │ │ │ └── api-video.module.ts │ ├── enums │ │ ├── ResStatusEnum.ts │ │ ├── tmpPathsEnums.ts │ │ └── StreamingServicesEnums.ts │ ├── config │ │ ├── instrument.ts │ │ └── email.ts │ ├── services │ │ ├── utils │ │ │ └── models │ │ │ │ └── helper.view.model.ts │ │ └── shared │ │ │ └── shared.module.ts │ ├── interfaces │ │ ├── IChapter.ts │ │ ├── ISharedData.ts │ │ ├── IComments.ts │ │ ├── IResponseMetadata.ts │ │ └── Folders.ts │ ├── common │ │ └── pipeline │ │ │ ├── types.ts │ │ │ ├── handler.interface.ts │ │ │ └── pipeline.module.ts │ └── app.controller.ts │ ├── public │ ├── images │ │ ├── favicon.ico │ │ ├── email │ │ │ ├── drive.png │ │ │ ├── insta.png │ │ │ ├── logo.png │ │ │ ├── slack.png │ │ │ ├── github.png │ │ │ ├── medium.png │ │ │ ├── reddit.png │ │ │ ├── linkedin.png │ │ │ ├── play-btn.png │ │ │ ├── page-bottom.png │ │ │ ├── page-example.png │ │ │ ├── page-example-sc.png │ │ │ └── register-main.png │ │ └── gifs │ │ │ ├── grant-access.gif │ │ │ └── pin_extention_screen_guide.gif │ └── fonts │ │ ├── Avenir │ │ └── Avenir.otf │ │ ├── Roboto │ │ ├── Roboto.ttf │ │ └── Robotobold.ttf │ │ ├── Laila │ │ └── Laila-Light.ttf │ │ ├── Lato │ │ └── Lato-Light.ttf │ │ ├── Octavia │ │ ├── Octavia.otf │ │ └── README.txt │ │ ├── Poppins │ │ ├── Poppins-Medium.ttf │ │ └── Poppins-SemiBold.ttf │ │ ├── Lobster │ │ └── Lobster-Regular.ttf │ │ ├── Marker_Felt │ │ └── Marker Felt.ttf │ │ ├── Limelight │ │ └── Limelight-Regular.ttf │ │ ├── Rasa │ │ └── Rasa-VariableFont_wght.ttf │ │ ├── Righteous │ │ └── Righteous-Regular.ttf │ │ ├── Rochester │ │ └── Rochester-Regular.ttf │ │ ├── Stalemate │ │ └── Stalemate-Regular.ttf │ │ ├── Bebas_Neue │ │ └── BebasNeue-Regular.ttf │ │ ├── Yellowtail │ │ └── Yellowtail-Regular.ttf │ │ ├── Crafty_Girls │ │ └── CraftyGirls-Regular.ttf │ │ ├── Leckerli_One │ │ └── LeckerliOne-Regular.ttf │ │ ├── Oswald │ │ └── Oswald-VariableFont_wght.ttf │ │ ├── Puppies_Play │ │ └── PuppiesPlay-Regular.ttf │ │ ├── Style_Script │ │ └── StyleScript-Regular.ttf │ │ ├── Abhaya_Libre │ │ └── AbhayaLibre-ExtraBold.ttf │ │ └── Berkshire_Swash │ │ └── BerkshireSwash-Regular.ttf │ ├── tsconfig.build.json │ ├── .prettierrc │ ├── README.md │ ├── nest-cli.json │ ├── test │ └── jest-e2e.json │ └── .editorconfig ├── tools ├── generators │ └── .gitkeep └── tsconfig.tools.json ├── .npmrc ├── .sentryclirc ├── .prettierrc ├── babel.config.json ├── pnpm-workspace.yaml ├── .prettierignore ├── .gitmodules ├── sentry.properties ├── vercel.json ├── firebase.json ├── .editorconfig ├── .codacy └── codacy.yaml ├── .dockerignore ├── .vscode └── extensions.json ├── storage.rules └── turbo.json /profile.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /apps/portal/public/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tools/generators/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.12.1 -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers = true 2 | -------------------------------------------------------------------------------- /.sentryclirc: -------------------------------------------------------------------------------- 1 | [defaults] 2 | org = ever-co 3 | -------------------------------------------------------------------------------- /apps/extensions/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /apps/extensions/.eslintignore: -------------------------------------------------------------------------------- 1 | build 2 | mode_modules 3 | -------------------------------------------------------------------------------- /apps/portal/.sentryclirc: -------------------------------------------------------------------------------- 1 | [defaults] 2 | org = ever-co 3 | -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "babelrcRoots": ["*"] 3 | } 4 | -------------------------------------------------------------------------------- /apps/portal/pages/video/SaveToCloudModal/SaveToCloudModal.module.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/api/src/utils/nano-id.ts: -------------------------------------------------------------------------------- 1 | export const NANO_ID_REGEX = /^[A-Za-z0-9_-]+$/; 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | # npm test 5 | -------------------------------------------------------------------------------- /apps/api/src/module/email/view.models/email.view.model.ts: -------------------------------------------------------------------------------- 1 | export class EmailViewModel {} 2 | -------------------------------------------------------------------------------- /apps/portal/pagesScss/media/Videos.module.scss: -------------------------------------------------------------------------------- 1 | @use 'pagesScss/media/Images.module.scss'; 2 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'apps/*' 3 | - 'packages/**' 4 | - 'tools/**' 5 | -------------------------------------------------------------------------------- /apps/extensions/src/app/utilities/browser.ts: -------------------------------------------------------------------------------- 1 | const browser = chrome; 2 | export default browser; 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Add files here to ignore them from prettier formatting 2 | 3 | /dist 4 | /coverage 5 | -------------------------------------------------------------------------------- /apps/extensions/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/icons/16.png -------------------------------------------------------------------------------- /apps/extensions/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/icons/48.png -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/react-multi-email.scss: -------------------------------------------------------------------------------- 1 | @import '~react-multi-email/style.css'; 2 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/ILoaderType.ts: -------------------------------------------------------------------------------- 1 | export type LoaderTypes = 'idle' | 'loading' | 'complete'; 2 | -------------------------------------------------------------------------------- /apps/extensions/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "semi": true 5 | } -------------------------------------------------------------------------------- /apps/extensions/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/icons/128.png -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/ILoaderType.ts: -------------------------------------------------------------------------------- 1 | export type LoaderTypes = 'idle' | 'loading' | 'complete' 2 | -------------------------------------------------------------------------------- /apps/portal/public/sign/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/sign/1.png -------------------------------------------------------------------------------- /apps/portal/public/sign/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/sign/22.png -------------------------------------------------------------------------------- /apps/api/src/enums/ResStatusEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ResStatusEnum { 2 | error = 'error', 3 | success = 'success', 4 | } -------------------------------------------------------------------------------- /apps/api/src/module/firebase/firebase.constants.ts: -------------------------------------------------------------------------------- 1 | export const FIREBASE_ADMIN = Symbol('FirebaseAdminToken'); 2 | -------------------------------------------------------------------------------- /apps/portal/pagesScss/workspaces/Settngs.module.scss: -------------------------------------------------------------------------------- 1 | .section { 2 | height: 33%; 3 | background: #ffffff; 4 | } -------------------------------------------------------------------------------- /apps/portal/public/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/icons/128.png -------------------------------------------------------------------------------- /apps/portal/public/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/icons/16.png -------------------------------------------------------------------------------- /apps/portal/public/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/icons/48.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "apps/desktop"] 2 | path = apps/desktop 3 | url = git@github.com:ever-co/ever-rec-desktop.git 4 | -------------------------------------------------------------------------------- /apps/api/public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/favicon.ico -------------------------------------------------------------------------------- /apps/extensions/dev_images/edge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/dev_images/edge.png -------------------------------------------------------------------------------- /apps/portal/pagesScss/partials/_dotSeparator.scss: -------------------------------------------------------------------------------- 1 | .dotSeparator { 2 | font-size: 0.5rem; 3 | opacity: 0.9; 4 | } 5 | -------------------------------------------------------------------------------- /apps/api/public/images/email/drive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/drive.png -------------------------------------------------------------------------------- /apps/api/public/images/email/insta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/insta.png -------------------------------------------------------------------------------- /apps/api/public/images/email/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/logo.png -------------------------------------------------------------------------------- /apps/api/public/images/email/slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/slack.png -------------------------------------------------------------------------------- /apps/extensions/dev_images/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/dev_images/chrome.png -------------------------------------------------------------------------------- /apps/extensions/dev_images/mozilla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/dev_images/mozilla.png -------------------------------------------------------------------------------- /apps/extensions/dev_images/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/dev_images/opera.png -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IDriveDbData.ts: -------------------------------------------------------------------------------- 1 | export interface IDriveDbData { 2 | driveId: string; 3 | email: string; 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/ISettingsPage.ts: -------------------------------------------------------------------------------- 1 | export default interface ISettingsPageProps { 2 | imagePath?: string; 3 | } 4 | -------------------------------------------------------------------------------- /sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=ever-co 3 | defaults.project=ever-rec 4 | auth.token= 5 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "public": false, 4 | "github": { 5 | "enabled": false 6 | } 7 | } -------------------------------------------------------------------------------- /apps/api/public/fonts/Avenir/Avenir.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Avenir/Avenir.otf -------------------------------------------------------------------------------- /apps/api/public/fonts/Roboto/Roboto.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Roboto/Roboto.ttf -------------------------------------------------------------------------------- /apps/api/public/images/email/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/github.png -------------------------------------------------------------------------------- /apps/api/public/images/email/medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/medium.png -------------------------------------------------------------------------------- /apps/api/public/images/email/reddit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/reddit.png -------------------------------------------------------------------------------- /apps/api/src/enums/tmpPathsEnums.ts: -------------------------------------------------------------------------------- 1 | export const TMP_PATH = 'tmp_videos/'; 2 | export const TMP_PATH_FIXED = 'tmp_videos_fixed/'; 3 | -------------------------------------------------------------------------------- /apps/extensions/src/content/overlay/components/selectArea/select-area.scss: -------------------------------------------------------------------------------- 1 | .select-area-overlay { 2 | z-index: 2147483620; 3 | } -------------------------------------------------------------------------------- /apps/portal/app/interfaces/ActionType.ts: -------------------------------------------------------------------------------- 1 | export default interface ActionType { 2 | type: string; 3 | payload?: any; 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/public/edit/leak_bg-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/edit/leak_bg-min.png -------------------------------------------------------------------------------- /apps/portal/public/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Laila/Laila-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Laila/Laila-Light.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Lato/Lato-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Lato/Lato-Light.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Octavia/Octavia.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Octavia/Octavia.otf -------------------------------------------------------------------------------- /apps/api/public/fonts/Roboto/Robotobold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Roboto/Robotobold.ttf -------------------------------------------------------------------------------- /apps/api/public/images/email/linkedin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/linkedin.png -------------------------------------------------------------------------------- /apps/api/public/images/email/play-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/play-btn.png -------------------------------------------------------------------------------- /apps/extensions/images/images/leak_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/images/leak_bg.jpg -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/partials/_dotSeparator.scss: -------------------------------------------------------------------------------- 1 | .dotSeparator { 2 | font-size: 0.5rem; 3 | opacity: 0.9; 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/public/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /apps/portal/public/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /apps/portal/store/auth/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_USER = 'SET_USER'; 2 | export const SET_DRIVE_USER = 'SET_DRIVE_USER'; 3 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Octavia/README.txt: -------------------------------------------------------------------------------- 1 | To learn more about the font family and its license, visit https://www.fontmirror.com/octavia-script -------------------------------------------------------------------------------- /apps/api/public/images/email/page-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/page-bottom.png -------------------------------------------------------------------------------- /apps/api/public/images/email/page-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/page-example.png -------------------------------------------------------------------------------- /apps/api/public/images/gifs/grant-access.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/gifs/grant-access.gif -------------------------------------------------------------------------------- /apps/api/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/ActionType.ts: -------------------------------------------------------------------------------- 1 | export default interface ActionType { 2 | type: string; 3 | payload?: any; 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "semi": true, 5 | "bracketSpacing": true 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/pages/video/ShareItemModal/ShareItemModal.module.scss: -------------------------------------------------------------------------------- 1 | .localAppSpinnerWrapper { 2 | width: 25px; 3 | height: 25px; 4 | } 5 | -------------------------------------------------------------------------------- /apps/api/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "bracketSpacing": true, 5 | "endOfLine": "auto" 6 | } 7 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Poppins/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Poppins/Poppins-Medium.ttf -------------------------------------------------------------------------------- /apps/api/public/images/email/page-example-sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/page-example-sc.png -------------------------------------------------------------------------------- /apps/api/public/images/email/register-main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/email/register-main.png -------------------------------------------------------------------------------- /apps/api/src/config/instrument.ts: -------------------------------------------------------------------------------- 1 | import * as Sentry from '@sentry/nestjs'; 2 | 3 | Sentry.init({ 4 | dsn: process.env.SENTRY_DSN, 5 | }); 6 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/images/leak_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/panel/images/leak_bg.jpg -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IDriveDbData.ts: -------------------------------------------------------------------------------- 1 | export interface IDriveDbData { 2 | driveId: string; 3 | email: string; 4 | } 5 | -------------------------------------------------------------------------------- /apps/extensions/src/background/utilities/enums/AppThemesEnum.ts: -------------------------------------------------------------------------------- 1 | export enum AppThemesEnum { 2 | light = 'light', 3 | dark = 'dark', 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/app/enums/itemTypeEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemTypeEnum { 2 | images = 'images', 3 | videos = 'videos', 4 | mixed = 'mixed', 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/public/preferences/preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/preferences/preferences.png -------------------------------------------------------------------------------- /apps/api/README.md: -------------------------------------------------------------------------------- 1 | # Ever Rec API 2 | 3 | ## Description 4 | 5 | [Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. 6 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Lobster/Lobster-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Lobster/Lobster-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Marker_Felt/Marker Felt.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Marker_Felt/Marker Felt.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Poppins/Poppins-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Poppins/Poppins-SemiBold.ttf -------------------------------------------------------------------------------- /apps/portal/pagesScss/partials/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin truncate { 2 | overflow: hidden; 3 | text-overflow: ellipsis; 4 | white-space: nowrap; 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/public/videos/chapter-placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/videos/chapter-placeholder.jpg -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "storage": { 3 | "rules": "storage.rules" 4 | }, 5 | "database": { 6 | "rules": "database.rules.json" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Limelight/Limelight-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Limelight/Limelight-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Rasa/Rasa-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Rasa/Rasa-VariableFont_wght.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Righteous/Righteous-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Righteous/Righteous-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Rochester/Rochester-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Rochester/Rochester-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Stalemate/Stalemate-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Stalemate/Stalemate-Regular.ttf -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/hidden-scrollbar.scss: -------------------------------------------------------------------------------- 1 | .rec-hidden-scrollbar { 2 | &::-webkit-scrollbar { 3 | display: none; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/public/contentImages/permission-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/contentImages/permission-arrow.png -------------------------------------------------------------------------------- /apps/api/public/fonts/Bebas_Neue/BebasNeue-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Bebas_Neue/BebasNeue-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Yellowtail/Yellowtail-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Yellowtail/Yellowtail-Regular.ttf -------------------------------------------------------------------------------- /apps/api/src/services/utils/models/helper.view.model.ts: -------------------------------------------------------------------------------- 1 | export class UserViewModel { 2 | email: string; 3 | name: string; 4 | photoUrl: string; 5 | } 6 | -------------------------------------------------------------------------------- /apps/extensions/src/app/utilities/destination.ts: -------------------------------------------------------------------------------- 1 | export const audioCtx = new AudioContext(); 2 | export const destination = audioCtx.createMediaStreamDestination(); -------------------------------------------------------------------------------- /apps/portal/app/utilities/destination.ts: -------------------------------------------------------------------------------- 1 | export const audioCtx = new AudioContext(); 2 | export const destination = audioCtx.createMediaStreamDestination(); 3 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/editorHelpers/imgSrcLoader.ts: -------------------------------------------------------------------------------- 1 | export const imgSrcLoader = ({ src }) => { 2 | return `${src}`; 3 | }; 4 | -------------------------------------------------------------------------------- /apps/portal/public/sign/setup_finished_screen_guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/sign/setup_finished_screen_guide.png -------------------------------------------------------------------------------- /apps/api/public/fonts/Crafty_Girls/CraftyGirls-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Crafty_Girls/CraftyGirls-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Leckerli_One/LeckerliOne-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Leckerli_One/LeckerliOne-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Oswald/Oswald-VariableFont_wght.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Oswald/Oswald-VariableFont_wght.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Puppies_Play/PuppiesPlay-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Puppies_Play/PuppiesPlay-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/fonts/Style_Script/StyleScript-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Style_Script/StyleScript-Regular.ttf -------------------------------------------------------------------------------- /apps/api/public/images/gifs/pin_extention_screen_guide.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/images/gifs/pin_extention_screen_guide.gif -------------------------------------------------------------------------------- /apps/extensions/images/contentImages/permission-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/contentImages/permission-arrow.png -------------------------------------------------------------------------------- /apps/extensions/images/panel/preferences/preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/panel/preferences/preferences.png -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/settingsScreen/interface/ISettingsPage.ts: -------------------------------------------------------------------------------- 1 | export default interface ISettingsPageProps { 2 | imagePath?: string; 3 | } 4 | -------------------------------------------------------------------------------- /apps/portal/app/store/drive/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_DRIVE_FOLDERS = 'SET_DRIVE_FOLDERS'; 2 | export const SET_WORKING_FOLDER = 'SET_WORKING_FOLDER'; 3 | -------------------------------------------------------------------------------- /apps/portal/store/drive/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_DRIVE_FOLDERS = 'SET_DRIVE_FOLDERS'; 2 | export const SET_WORKING_FOLDER = 'SET_WORKING_FOLDER'; 3 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Abhaya_Libre/AbhayaLibre-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Abhaya_Libre/AbhayaLibre-ExtraBold.ttf -------------------------------------------------------------------------------- /apps/api/src/module/gauzy/index.ts: -------------------------------------------------------------------------------- 1 | export * from './gauzy.module'; 2 | export * from './services/gauzy-auth.service'; 3 | export * from './services/gauzy-rest.service'; 4 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/videos/chapter-placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/panel/videos/chapter-placeholder.jpg -------------------------------------------------------------------------------- /apps/extensions/src/app/store/drive/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_DRIVE_FOLDERS = 'SET_DRIVE_FOLDERS'; 2 | export const SET_WORKING_FOLDER = 'SET_WORKING_FOLDER'; -------------------------------------------------------------------------------- /apps/extensions/src/content/overlay/components/visiblePartTimer/visible-part-timer.scss: -------------------------------------------------------------------------------- 1 | .rec { 2 | .custom-visible-z-index { 3 | z-index: 145000; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/partials/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin truncate { 2 | overflow: hidden; 3 | text-overflow: ellipsis; 4 | white-space: nowrap; 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/app/enums/itemOrderEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemOrderEnum { 2 | name = 'Name', 3 | dateNewest = 'Date - newest', 4 | dateOldest = 'Date - oldest', 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/ISharedItem.ts: -------------------------------------------------------------------------------- 1 | import { IUser } from './IUserData'; 2 | 3 | export interface ISharedItem { 4 | user: IUser | null; 5 | ip: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IPencilGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IPencilGroupOptions { 2 | strokeColor: string; 3 | strokeWidth: number; 4 | } 5 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/myVideos/VideosContainer.module.scss: -------------------------------------------------------------------------------- 1 | @use '../myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/ToolBtn/components/popupButton.module.scss: -------------------------------------------------------------------------------- 1 | .tooltipWrapper span { 2 | cursor: pointer !important; 3 | } 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/videoEditorScreen/shareItemModal/ShareItemModal.module.scss: -------------------------------------------------------------------------------- 1 | .localAppSpinnerWrapper { 2 | width: 25px; 3 | height: 25px; 4 | } 5 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/fonts/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/src/content/popup/assets/fonts/Roboto-Bold.ttf -------------------------------------------------------------------------------- /apps/portal/app/services/helpers/getWorkspaceParam.ts: -------------------------------------------------------------------------------- 1 | export const getWorkspaceParam = (isWorkspace: boolean) => { 2 | return isWorkspace ? '?isWorkspace=true' : ''; 3 | }; 4 | -------------------------------------------------------------------------------- /apps/portal/misc/browserCompatible.ts: -------------------------------------------------------------------------------- 1 | import { isChrome, isEdge, isOpera } from 'react-device-detect'; 2 | export const isBrowserCompatible = isChrome || isEdge || isOpera; 3 | -------------------------------------------------------------------------------- /apps/api/public/fonts/Berkshire_Swash/BerkshireSwash-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/api/public/fonts/Berkshire_Swash/BerkshireSwash-Regular.ttf -------------------------------------------------------------------------------- /apps/extensions/images/panel/sign/setup_finished_screen_guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/panel/sign/setup_finished_screen_guide.png -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/IntegrationsScreen/Integrations.module.scss: -------------------------------------------------------------------------------- 1 | @use '@/content/panel/screens/imagesScreen/pages/integrations/IntegrationPage.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/MyVideos.module.scss: -------------------------------------------------------------------------------- 1 | @use '/src/content/panel/screens/imagesScreen/pages/myImages/MyImages.module.scss'; 2 | 3 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/fonts/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/src/content/popup/assets/fonts/Roboto-Medium.ttf -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/src/content/popup/assets/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/workspace/WorkspaceItemsContainer.module.scss: -------------------------------------------------------------------------------- 1 | @use '../myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IEmojiOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IEmojiOptions { 2 | id:number, 3 | url: string; 4 | filename: string; 5 | emoji: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/api/src/interfaces/IChapter.ts: -------------------------------------------------------------------------------- 1 | export interface IChapter { 2 | id: string; 3 | timestamp: string; 4 | content: string; 5 | thumbnailURL: string; 6 | refName?: string; 7 | } 8 | -------------------------------------------------------------------------------- /apps/api/src/module/gauzy/gauzy.config.ts: -------------------------------------------------------------------------------- 1 | import { registerAs } from '@nestjs/config'; 2 | 3 | export default registerAs('gauzy', () => ({ 4 | apiUrl: process.env.GAUZY_API_URL, 5 | })); 6 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/shared/enums/itemTypeEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemTypeEnum { 2 | images = 'images', 3 | videos = 'videos', 4 | mixed = 'mixed', 5 | } -------------------------------------------------------------------------------- /apps/portal/sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=ever-co 3 | defaults.project=rec 4 | auth.token=1cba60dee01d44b7b0d9ffd6477381753776bced2694488b9a929e0285cefb9c 5 | -------------------------------------------------------------------------------- /apps/api/src/module/firebase/index.ts: -------------------------------------------------------------------------------- 1 | export * from './firebase.bootstrap'; 2 | export * from './firebase.config'; 3 | export * from './firebase.constants'; 4 | export * from './firebase.module'; 5 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IUniqueView.ts: -------------------------------------------------------------------------------- 1 | export interface UniqueView { 2 | id: string; 3 | email: string; 4 | displayName?: string; 5 | photoURL?: string; 6 | timestamp?: number; 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/public/new-design-v2/single-video-buttons/like-thumb-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/portal/public/new-design-v2/single-video-buttons/like-thumb-filled.png -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IUniqueView.ts: -------------------------------------------------------------------------------- 1 | export interface UniqueView { 2 | id: string; 3 | email: string; 4 | displayName?: string; 5 | photoURL?: string; 6 | timestamp?: number; 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/app/store/whiteboard/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_WHITEBOARDS = 'SET_WHITEBOARDS'; 2 | export const ADD_WHITEBOARD = 'ADD_WHITEBOARD'; 3 | export const SET_LOADING = 'SET_LOADING'; 4 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/IPencilGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IPencilGroupOptions { 2 | strokeColor: string, 3 | strokeWidth: number, 4 | } -------------------------------------------------------------------------------- /apps/api/src/module/log/view.models/LoggerEventModel.ts: -------------------------------------------------------------------------------- 1 | export interface LoggerEventModel { 2 | timestamp: number; 3 | ip?: string; 4 | userId?: string; 5 | message?: string; 6 | payload?: any; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/images/new-design-v2/single-video-buttons/like-thumb-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ever-co/ever-rec/HEAD/apps/extensions/images/new-design-v2/single-video-buttons/like-thumb-filled.png -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IPencilGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IPencilGroupOptions { 2 | strokeColor: string, 3 | strokeWidth: number, 4 | } -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/IEmojiOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IEmojiOptions { 2 | url: string; 3 | filename: string; 4 | emoji: string; 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/index.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | declare module '*.svg' { 3 | const content: any; 4 | export const ReactComponent: any; 5 | export default content; 6 | } 7 | -------------------------------------------------------------------------------- /apps/api/src/config/email.ts: -------------------------------------------------------------------------------- 1 | export enum PostmarkTemplate { 2 | welcome = 'welcome', 3 | reset = 'password-reset', 4 | image = 'image', 5 | video = 'video', 6 | workspaceInvite = 'workspace-invite', 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/shared/enums/itemOrderEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemOrderEnum { 2 | name = 'Name', 3 | dateNewest = 'Date - newest', 4 | dateOldest = 'Date - oldest', 5 | } -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/ICommentsGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface ICommentsOptions { 2 | id: string; 3 | fill: string; 4 | position: { x: number; y: number }; 5 | text: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/components/containers/appContainer/AppContainer.module.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | -webkit-box-shadow: -1px 9px 15px -4px rgba(0, 0, 0, 0.42); 3 | box-shadow: -1px 9px 15px -4px rgba(0, 0, 0, 0.42); 4 | } 5 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/teams/add-team.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | 3 | export class AddTeamDto { 4 | @IsString() 5 | @MaxLength(256) 6 | teamName: string; 7 | } 8 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/teams/update-team.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | 3 | export class UpdateTeamDto { 4 | @IsString() 5 | @MaxLength(256) 6 | name: string; 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IChapter.ts: -------------------------------------------------------------------------------- 1 | export type IChapter = { 2 | id: string; 3 | content: string; 4 | timestamp: string; 5 | timestampSeconds: number; 6 | thumbnailURL: string; 7 | refName: string; 8 | }; 9 | -------------------------------------------------------------------------------- /apps/api/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/nest-cli", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src", 5 | "compilerOptions": { 6 | "deleteOutDir": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/folders/update-folder.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsObject } from 'class-validator'; 2 | 3 | export class UpdateFolderDto { 4 | @IsObject() 5 | folder: any; // TODO add dto for validation 6 | } 7 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/videosContainer/video.scss: -------------------------------------------------------------------------------- 1 | .rec { 2 | .screenshot-item:hover { 3 | .screenshot-item-overlay { 4 | visibility: visible; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/workspace/WorkspaceItemsContainer.module.scss: -------------------------------------------------------------------------------- 1 | @use '@/content/panel/screens/imagesScreen/pages/myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/routes/app.route.ts: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export interface AppRoute { 4 | name: string; 5 | screen: FC; 6 | private?: boolean; 7 | hideAuthenticated?: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/video-play-btn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/interfaces/ISharedData.ts: -------------------------------------------------------------------------------- 1 | import { ISharedDataImage } from './IEditorImage'; 2 | import { ISharedDataVideo } from './IEditorVideo'; 3 | 4 | export interface ISharedData extends ISharedDataImage, ISharedDataVideo {} 5 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IComments.ts: -------------------------------------------------------------------------------- 1 | export interface IComment { 2 | id: string; 3 | content: string; 4 | timestamp: string | number; 5 | user: { 6 | id: string; 7 | photoUrl: string | null; 8 | }; 9 | } -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IEmojiOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IEmojiOptions { 2 | id: number 3 | url: string; 4 | filename: string; 5 | emoji: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IMarkerGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IMarkerOptions { 2 | id: string; 3 | type: string; 4 | fill: string; 5 | text: string; 6 | position: { x: number; y: number }; 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/interfaces/IComments.ts: -------------------------------------------------------------------------------- 1 | export interface IComment { 2 | id: string; 3 | content: string; 4 | timestamp: string | number; 5 | user: { 6 | id: string; 7 | photoUrl: string | null; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /apps/api/src/interfaces/IResponseMetadata.ts: -------------------------------------------------------------------------------- 1 | import { ResStatusEnum } from '../enums/ResStatusEnum'; 2 | 3 | export interface IResponseMetadata { 4 | status: ResStatusEnum; 5 | message: string; 6 | error: Error | null; 7 | } 8 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/workspaces/create-workspace.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | 3 | export class CreateWorkspaceDto { 4 | @IsString() 5 | @MaxLength(256) 6 | name: string; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/video-play-btn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/videosContainer/VideosContainer.module.scss: -------------------------------------------------------------------------------- 1 | @use '/src/content/panel/screens/imagesScreen/pages/myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IComments.ts: -------------------------------------------------------------------------------- 1 | export interface IComment { 2 | id: string; 3 | content: string; 4 | timestamp: string | number; 5 | user: { 6 | id: string; 7 | photoUrl: string | null; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/like.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsNumber, IsString } from 'class-validator'; 2 | 3 | export class LikeDto { 4 | @IsString() 5 | uid: string; 6 | 7 | @IsNumber() 8 | timestamp: number; 9 | } 10 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/folders/delete-folder.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsOptionalId } from '../../validators/id.validator'; 2 | 3 | export class DeleteFolderDto { 4 | @IsOptionalId() 5 | currentFolderId: string | false = false; 6 | } 7 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/workspaces/rename-workspace.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | 3 | export class RenameWorkspaceDto { 4 | @IsString() 5 | @MaxLength(256) 6 | newName: string; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/components/containers/appContainer/AppContainer.module.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | -webkit-box-shadow: -1px 9px 15px -4px rgba(0, 0, 0, 0.4); 3 | box-shadow: -1px 9px 15px -4px rgba(0, 0, 0, 0.4) !important; 4 | } 5 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/shared/imagesAndVideosContainer/ImagesAndVideos.module.scss: -------------------------------------------------------------------------------- 1 | @use '/src/content/panel/screens/imagesScreen/pages/myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/triangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/register/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces/register-state.interface'; 2 | export * from './register.chain'; 3 | export * from './state/firebase-register.state'; 4 | export * from './state/gauzy-register.state'; 5 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/teams/add-member.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsId } from '../../validators/id.validator'; 2 | 3 | export class AddTeamMemberDto { 4 | @IsId() 5 | teamId: string; 6 | 7 | @IsId() 8 | memberId: string; 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/app/types/types.ts: -------------------------------------------------------------------------------- 1 | export type ICommandTypes = 2 | | 'stop' 3 | | 'pause' 4 | | 'cancel' 5 | | 'resume' 6 | | 'unmute' 7 | | 'mute'; 8 | 9 | export type IStatusTypes = 'recording' | 'paused' | 'stopped'; 10 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myImages/screenshotsContainer/ScreenshotItem/ScreenshotItem.module.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | border: 3px solid transparent; 3 | 4 | &:hover { 5 | //border: 3px solid #8576FF; 6 | } 7 | } -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/teams/delete-member.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsId } from '../../validators/id.validator'; 2 | 3 | export class DeleteTeamMemberDto { 4 | @IsId() 5 | teamId: string; 6 | 7 | @IsId() 8 | memberId: string; 9 | } 10 | -------------------------------------------------------------------------------- /apps/api/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/triangle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/recording/helpers/setBadgeText.ts: -------------------------------------------------------------------------------- 1 | import browser from '@/app/utilities/browser'; 2 | 3 | 4 | export const setBadgeText = async (text: string) => { 5 | return browser.action.setBadgeText({ 6 | text, 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /apps/portal/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import en from '../i18n/locales/en.json'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | defaultNS: 'en'; 6 | resources: { 7 | en: typeof en; 8 | }; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/src/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import en from '../../i18n/locales/en.json'; 2 | 3 | declare module 'i18next' { 4 | interface CustomTypeOptions { 5 | defaultNS: ''; 6 | nsSeparator: '.'; 7 | resources: typeof en; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/ICommentsGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface ICommentsOptions { 2 | id: string; 3 | fill: string; 4 | position: { x: number; y: number }; 5 | text: string; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IMarker.ts: -------------------------------------------------------------------------------- 1 | import { IMarkerComment } from './IMarkerComment'; 2 | 3 | export interface IMarker { 4 | id: string; 5 | admin: string; 6 | imageId: string; 7 | created: number; 8 | comments: IMarkerComment[]; 9 | } 10 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IToolsOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IToolsOptions { 2 | fillColor: string, 3 | strokeColor: string, 4 | strokeWidth: number, 5 | numPoints?: number, 6 | innerRadius?: number, 7 | outerRadius?: number, 8 | } -------------------------------------------------------------------------------- /apps/api/src/common/pipeline/types.ts: -------------------------------------------------------------------------------- 1 | /** Supported pipelines */ 2 | export enum PipelineType { 3 | UPLOAD_IMAGE = 'upload → image', 4 | UPLOAD_VIDEO = 'upload → video', 5 | UPLOAD_SOUNDSHOT = 'upload → audio', 6 | UPLOAD_CAMSHOT = 'upload → photo', 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/contentImages/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/portal/specs/index.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | describe('Index', () => { 4 | it('should render successfully', () => { 5 | // const { baseElement } = render(); 6 | // expect(baseElement).toBeTruthy(); 7 | }); 8 | }); 9 | -------------------------------------------------------------------------------- /apps/api/src/services/shared/shared.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { SharedService } from './shared.service'; 3 | 4 | @Module({ 5 | providers: [SharedService], 6 | exports: [SharedService], 7 | }) 8 | export class SharedModule {} 9 | -------------------------------------------------------------------------------- /apps/extensions/images/contentImages/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/portal/app/enums/folderTypeEnum.ts: -------------------------------------------------------------------------------- 1 | export enum FolderTypeEnum { 2 | videoFolders = 'videoFolders', 3 | imageFolders = 'imageFolders', 4 | sharedFolders = 'sharedFolders', 5 | trashFolders = 'trashFolders', 6 | workspaceFolders = 'workspaceFolders', 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IWhiteboard.ts: -------------------------------------------------------------------------------- 1 | export interface IWhiteboard { 2 | id: string; 3 | name: string; 4 | admin: string; 5 | created: number; 6 | trash: boolean; 7 | favorite: boolean; 8 | isPublic: boolean; 9 | thumbnail?: string; 10 | } 11 | -------------------------------------------------------------------------------- /apps/portal/public/sidebar/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IMarkerGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IMarkerOptions { 2 | id: string; 3 | type: string; 4 | fill: string; 5 | text: string; 6 | position: { x: number; y: number }; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/trashed/TrashedImagesVideos.module.scss: -------------------------------------------------------------------------------- 1 | @use '/src/content/panel/screens/imagesScreen/pages/myImages/screenshotsContainer/ScreenshotsContainer.module.scss'; 2 | 3 | .noPadding { 4 | padding: 0 !important; 5 | } 6 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IAppControl.ts: -------------------------------------------------------------------------------- 1 | export default interface IAppControl { 2 | value: string; 3 | errors: string[]; 4 | touched: boolean; 5 | } 6 | 7 | export interface IAppControlData { 8 | value: string; 9 | errors?: string[] | undefined; 10 | } 11 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IShapeGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IShapeGroupOptions { 2 | fillColor: string; 3 | strokeColor: string; 4 | strokeWidth: number; 5 | numPoints?: number; 6 | innerRadius?: number; 7 | outerRadius?: number; 8 | } 9 | -------------------------------------------------------------------------------- /apps/portal/public/common/file_download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/images/file_download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/sidebar/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/tailwind.scss: -------------------------------------------------------------------------------- 1 | .rec { 2 | @import 'tailwindcss/base'; 3 | @import 'tailwindcss/components'; 4 | @import 'tailwindcss/utilities'; 5 | } 6 | 7 | // @tailwind base; 8 | // @tailwind components; 9 | // @tailwind utilities; 10 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/ToolBtn/customToolBtn/EraserTool/eraserTool.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | color: rgb(0 0 0); 3 | } 4 | 5 | .flexContainer { 6 | display: flex; 7 | justify-content: center; 8 | color: rgb(0 0 0); 9 | } -------------------------------------------------------------------------------- /apps/api/src/module/whiteboards/interfaces/Whiteboard.ts: -------------------------------------------------------------------------------- 1 | export interface IWhiteboard { 2 | id: string; 3 | name: string; 4 | admin: string; 5 | created: number; 6 | trash: boolean; 7 | favorite: boolean; 8 | isPublic: boolean; 9 | thumbnail?: string; 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/file_download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/sidebar/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/workspaces/get-workspace.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsOptionalId } from '../../validators/id.validator'; 2 | import { Transform } from 'class-transformer'; 3 | 4 | export class GetWorkspaceDto { 5 | @IsOptionalId() 6 | folderId: string | false = false; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/images/popup/capture/stop-cam-only.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/app/utilities/cn.ts: -------------------------------------------------------------------------------- 1 | import clsx, { ClassValue } from 'clsx'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | /** Merge classes with tailwind-merge with clsx full feature */ 5 | export function cn(...classes: ClassValue[]) { 6 | return twMerge(clsx(...classes)); 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/myImages/screenshotsContainer/ScreenshotItem/ScreenshotItem.module.scss: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | box-sizing: border-box; 3 | border: 3px solid transparent; 4 | 5 | &:hover { 6 | //border: 3px solid #8576FF; 7 | } 8 | } -------------------------------------------------------------------------------- /apps/portal/hooks/useFirstRender.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from 'react'; 2 | 3 | const useFirstRender = () => { 4 | const ref = useRef(true); 5 | const firstRender = ref.current; 6 | ref.current = false; 7 | return firstRender; 8 | }; 9 | 10 | export default useFirstRender; 11 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/blob.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/sidebar/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/app/store/popup/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const CHANGE_ACTIVE_ROUTE = 'CHANGE_ACTIVE_ROUTE'; 2 | export const CHANGE_ACTIVE_URL = 'CHANGE_ACTIVE_URL'; 3 | export const SET_CAPTURING_TIME = 'SET_CAPTURING_TIME'; 4 | export const SET_RECORDING_VIDEO = 'SET_RECORDING_VIDEO'; -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IArrowGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IArrowGroupOptions { 2 | color: string; 3 | width: number; 4 | points: [number, number, number, number, number, number, number, number]; 5 | points1: [number, number, number, number]; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/IToolsOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IToolsOptions { 2 | fillColor: string, 3 | strokeColor: string, 4 | strokeWidth: number, 5 | 6 | numPoints?: number, 7 | innerRadius?: number, 8 | outerRadius?: number, 9 | } -------------------------------------------------------------------------------- /apps/portal/misc/fallbackVideoURL.ts: -------------------------------------------------------------------------------- 1 | export const fallbackVideoURL = async (url: string, fallbackURL: string) => { 2 | return fetch(url).then((response) => { 3 | if (response.status !== 404) { 4 | return url; 5 | } 6 | 7 | return fallbackURL; 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /apps/api/src/module/editor-websocket-module/editor-websocket.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { EditorGateway } from './editor.gateway'; 3 | 4 | @Module({ 5 | providers: [EditorGateway], 6 | exports: [EditorGateway], 7 | }) 8 | export class EditorWebsocketModule {} 9 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/move-personal-item.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsId, IsOptionalId } from '../../validators/id.validator'; 2 | 3 | export class MovePersonalItemDto { 4 | @IsId() 5 | itemId: string; 6 | 7 | @IsOptionalId() 8 | folderId: string | false = false; 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IAppControl.ts: -------------------------------------------------------------------------------- 1 | export default interface IAppControl { 2 | value: string; 3 | errors: string[]; 4 | touched: boolean; 5 | } 6 | 7 | export interface IAppControlData { 8 | value: string; 9 | errors?: string[] | undefined; 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/blob.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/IToolsOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IToolsOptions { 2 | fillColor: string, 3 | strokeColor: string, 4 | strokeWidth: number, 5 | 6 | numPoints?: number, 7 | innerRadius?: number, 8 | outerRadius?: number, 9 | } -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/videoEditorScreen/chapters/VideoChapterContentInput/VideoChapterContentInput.module.scss: -------------------------------------------------------------------------------- 1 | .ContentInput { 2 | border: 1px solid rgb(150, 150, 150) !important; 3 | margin-right: 0.5rem; 4 | height: 51px !important; 5 | width: 165px !important; 6 | } 7 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/square2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/common/folder-v2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/portal/public/contentImages/recordingWindowIcons/button-play-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/images/contentImages/recordingWindowIcons/button-play-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/folder-v2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/square2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IPreferences.ts: -------------------------------------------------------------------------------- 1 | export type ImageExtention = 'png' | 'jpg'; 2 | 3 | export default interface IPreferences { 4 | imageExt: ImageExtention; 5 | showSharedGDriveLink: boolean; 6 | defaultSave: boolean; 7 | defaultSavePath: string; 8 | addInfoOnTop: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_signScreen/LinksDivider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const LinksDivider: React.FC = () => { 4 | return ( 5 |
6 | ); 7 | }; 8 | 9 | export default LinksDivider; 10 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_whiteboardScreen/whiteboardToolbar/toolButton.module.scss: -------------------------------------------------------------------------------- 1 | .toolButton { 2 | background-color: '#5B4DBE'; 3 | &:hover { 4 | background-color: #363071 !important; 5 | } 6 | &:active { 7 | background-color: #363071 !important; 8 | } 9 | } -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IPreferences.ts: -------------------------------------------------------------------------------- 1 | export type ImageExtention = 'png' | 'jpg'; 2 | 3 | export default interface IPreferences { 4 | imageExt: ImageExtention; 5 | showSharedGDriveLink: boolean; 6 | defaultSave: boolean; 7 | defaultSavePath: string; 8 | addInfoOnTop: boolean; 9 | } -------------------------------------------------------------------------------- /apps/extensions/src/app/services/lang.ts: -------------------------------------------------------------------------------- 1 | import browser from '@/app/utilities/browser'; 2 | 3 | export const setLang = (lang: string) => { 4 | browser.storage.local.set({ lang: lang }); 5 | }; 6 | 7 | export const getLang = async () => { 8 | return await browser.storage.local.get('lang'); 9 | }; 10 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/hooks/useFirstRender.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from 'react'; 2 | 3 | const useFirstRender = () => { 4 | const ref = useRef(true); 5 | const firstRender = ref.current; 6 | ref.current = false; 7 | return firstRender; 8 | }; 9 | 10 | export default useFirstRender; 11 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IPageMenuItems.ts: -------------------------------------------------------------------------------- 1 | import { ReactElement } from 'react'; 2 | 3 | interface IPageMenuItems { 4 | type: string; // overwritten 5 | title: string; 6 | icon: ReactElement; 7 | route: string; 8 | isWorkspaceRoute?: boolean; 9 | } 10 | 11 | export default IPageMenuItems; 12 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/IShapeGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IShapeGroupOptions { 2 | fillColor: string; 3 | strokeColor: string; 4 | strokeWidth: number; 5 | numPoints?: number; 6 | innerRadius?: number; 7 | outerRadius?: number; 8 | } 9 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_workspacesScreen/WorkspaceMembersModal.module.scss: -------------------------------------------------------------------------------- 1 | @use 'pagesScss/partials/_reactTabs.scss'; 2 | 3 | .Heading { 4 | font-size: 1.5rem; 5 | padding-left: 0.65rem; 6 | margin-bottom: 0.5rem; 7 | } 8 | 9 | .margin-right { 10 | margin-right: 0.5rem; 11 | } 12 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/profileScreen/ProfileAccountPhoto.module.scss: -------------------------------------------------------------------------------- 1 | .profileUserPhoto { 2 | display: flex; 3 | border-radius: 100%; 4 | overflow: hidden; 5 | cursor: pointer; 6 | 7 | img { 8 | width: 100%; 9 | height: 100%; 10 | object-fit: cover; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "modules": true 7 | } 8 | ], 9 | "@babel/preset-react" 10 | ], 11 | "plugins": [ 12 | "react-hot-loader/babel" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IShapeGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IShapeGroupOptions { 2 | fillColor: string; 3 | strokeColor: string; 4 | strokeWidth: number; 5 | numPoints?: number; 6 | innerRadius?: number; 7 | outerRadius?: number; 8 | } 9 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/misc/fallbackVideoURL.ts: -------------------------------------------------------------------------------- 1 | export const fallbackVideoURL = async (url: string, fallbackURL: string) => { 2 | return fetch(url).then((response) => { 3 | if (response.status !== 404) { 4 | return url; 5 | } 6 | 7 | return fallbackURL; 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /apps/portal/public/common/add-workspace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/portal/public/new-design-v2/bookmark-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/shared/enums/folderTypeEnum.ts: -------------------------------------------------------------------------------- 1 | export enum FolderTypeEnum { 2 | videoFolders = 'videoFolders', 3 | imageFolders = 'imageFolders', 4 | sharedFolders = 'sharedFolders', 5 | trashFolders = 'trashFolders', 6 | workspaceFolders = 'workspaceFolders', 7 | } 8 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/IArrowGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IArrowGroupOptions { 2 | color: string; 3 | width: number; 4 | points: [number, number, number, number, number, number, number, number]; 5 | points1: [number, number, number, number]; 6 | } 7 | -------------------------------------------------------------------------------- /apps/api/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/add-workspace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IArrowGroupOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IArrowGroupOptions { 2 | color: string; 3 | width: number; 4 | points: [number, number, number, number, number, number, number, number]; 5 | points1: [number, number, number, number]; 6 | } 7 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/settingsScreen/components/ProfileAccountPhoto.module.scss: -------------------------------------------------------------------------------- 1 | .profileUserPhoto { 2 | display: flex; 3 | border-radius: 100%; 4 | overflow: hidden; 5 | cursor: pointer; 6 | 7 | img { 8 | width: 100%; 9 | height: 100%; 10 | object-fit: cover; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/misc/appConstConfig.ts: -------------------------------------------------------------------------------- 1 | export const CHAPTER_MIN_CHAPTERS = 3; 2 | export const CHAPTER_MIN_REQUIRED_SECONDS = 10; 3 | export const CHAPTER_MIN_VIDEO_LENGTH = 4 | CHAPTER_MIN_CHAPTERS * CHAPTER_MIN_REQUIRED_SECONDS; 5 | export const CHAPTER_THUMBNAIL_WIDTH = 1000; 6 | export const CHAPTER_THUMBNAIL_HEIGHT = 562; 7 | -------------------------------------------------------------------------------- /apps/extensions/images/new-design-v2/chapters/bookmark-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/signScreen/signFlow/linksDivider/LinksDivider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | 4 | const LinksDivider: React.FC = () => { 5 | return ( 6 |
7 | ); 8 | } 9 | 10 | export default LinksDivider; -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/utilities/interfaces/IProgressIndicatorData.ts: -------------------------------------------------------------------------------- 1 | export enum ProgressTypeEnum { 2 | FLC = 'Full Page Capture', 3 | GIF = 'GIF Animation', 4 | } 5 | 6 | export interface IProgressIndicatorData { 7 | value: number; 8 | maxValue: number; 9 | progressType: ProgressTypeEnum; 10 | } 11 | -------------------------------------------------------------------------------- /apps/portal/public/videos/play-button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tools/tsconfig.tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "compilerOptions": { 4 | "outDir": "../dist/out-tsc/tools", 5 | "rootDir": ".", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "types": ["node"], 9 | "importHelpers": false 10 | }, 11 | "include": ["**/*.ts"] 12 | } 13 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/Interfaces/Folders.ts: -------------------------------------------------------------------------------- 1 | import { IDbFolder } from '../../../interfaces/IEditorImage'; 2 | import { IAccess } from './Workspace'; 3 | 4 | export interface IWorkspaceFolder extends IDbFolder { 5 | isPublic: boolean; 6 | creator: string; 7 | access?: IAccess; 8 | isFavoredBy?: string[]; 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IMarker.ts: -------------------------------------------------------------------------------- 1 | import { IMarkerComment } from '@/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IMarkerComment'; 2 | 3 | export interface IMarker { 4 | id: string; 5 | admin: string; 6 | imageId: string; 7 | created: number; 8 | comments: IMarkerComment[]; 9 | } 10 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/panelRouter/panel.route.ts: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | 3 | export interface PanelRoute { 4 | name: PanelRoutesNames; 5 | screen: FC; 6 | private?: boolean; 7 | } 8 | 9 | export enum PanelRoutesNames { 10 | main, 11 | screenshots, 12 | edit, 13 | signIn, 14 | grand, 15 | } 16 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/toastify.scss: -------------------------------------------------------------------------------- 1 | @import '~react-toastify/dist/ReactToastify.css'; 2 | :root { 3 | --toastify-color-info: #5b4dbe; 4 | --toastify-color-success: #5b4dbe; 5 | 6 | --toastify-icon-color-info: var(--toastify-color-info); 7 | --toastify-icon-color-success: var(--toastify-color-success); 8 | } 9 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/scripts/removeWindow.ts: -------------------------------------------------------------------------------- 1 | import browser from '@/app/utilities/browser'; 2 | 3 | 4 | const removeWindow = async (winId: number) => { 5 | try { 6 | await browser.windows.remove(winId); 7 | } catch (e) { 8 | console.log(e); 9 | } 10 | }; 11 | 12 | export default removeWindow; 13 | -------------------------------------------------------------------------------- /apps/portal/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | // NOTE: This file should not be edited 6 | // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. 7 | -------------------------------------------------------------------------------- /apps/portal/store/panel/panelUtils/index.ts: -------------------------------------------------------------------------------- 1 | import IExplorerData from 'app/interfaces/IExplorerData'; 2 | import { IUser } from 'app/interfaces/IUserData'; 3 | 4 | export const isRootFolder = ( 5 | user: IUser, 6 | explorerData: IExplorerData, 7 | ): boolean => { 8 | return !user || !explorerData.currentFolder; 9 | }; 10 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/delete-video.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsVideoFilename } from '../../validators/video-filename.validator'; 2 | import { IsId } from '../../validators/id.validator'; 3 | 4 | export class DeleteVideoDto { 5 | @IsVideoFilename() 6 | refName: string; 7 | 8 | @IsId() 9 | videoId: string; 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/videos/play-button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/strokeWidthSelector/stroke-width-selector.css: -------------------------------------------------------------------------------- 1 | .stroke-selector .ant-select-selection-item .title { 2 | color: rgb(0, 0, 0) !important; 3 | } 4 | 5 | .stroke-selector .ant-select-selection-item .bottom-line { 6 | background-color: rgb(0, 0, 0) !important; 7 | } 8 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/workspaces/WorkspaceMembersModal.module.scss: -------------------------------------------------------------------------------- 1 | @use '/src/content/utilities/partials/reactTabs.scss'; 2 | 3 | .Heading { 4 | font-size: 1.5rem; 5 | padding-left: 0.65rem; 6 | margin-bottom: 0.5rem; 7 | } 8 | 9 | .margin-right { 10 | margin-right: 0.5rem; 11 | } 12 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IApiResponse.ts: -------------------------------------------------------------------------------- 1 | interface IResponseMetadata { 2 | status: ResStatusEnum; 3 | message: string; 4 | error: Error | null; 5 | } 6 | 7 | export type IDataResponse = IResponseMetadata & { data: T }; 8 | 9 | export enum ResStatusEnum { 10 | error = 'error', 11 | success = 'success', 12 | } 13 | -------------------------------------------------------------------------------- /apps/api/src/enums/StreamingServicesEnums.ts: -------------------------------------------------------------------------------- 1 | export enum VideoServicesEnum { 2 | MUX = 'mux', 3 | API_VIDEO = 'api.video', 4 | CLOUDINARY = 'cloudinary', 5 | LOCAL_STORAGE = 'local storage', 6 | } 7 | 8 | export enum PlaybackStatusEnum { 9 | PREPARING = 'preparing', 10 | READY = 'ready', 11 | ERRORED = 'errored', 12 | } 13 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/password-reset/password-reset.strategy.ts: -------------------------------------------------------------------------------- 1 | import { IDataResponse } from '../../../../interfaces/_types'; 2 | 3 | export interface PasswordResetEmailStrategy { 4 | execute(email: string): Promise; 5 | } 6 | 7 | export const PASSWORD_RESET_EMAIL_STRATEGY = Symbol('PASSWORD_RESET_EMAIL_STRATEGY'); 8 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IDataResponse.ts: -------------------------------------------------------------------------------- 1 | interface IResponseMetadata { 2 | status: ResStatusEnum; 3 | message: string; 4 | error: Error | null; 5 | } 6 | 7 | export type IDataResponse = IResponseMetadata & { data: T }; 8 | 9 | export enum ResStatusEnum { 10 | error = 'error', 11 | success = 'success', 12 | } -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IPageMenuItems.ts: -------------------------------------------------------------------------------- 1 | import { ReactElement } from 'react'; 2 | 3 | interface IPageMenuItems { 4 | type: string; // overwritten 5 | title: string; 6 | icon: ReactElement; 7 | route: string; 8 | isWorkspaceRoute?: boolean; 9 | imgName?: string; 10 | } 11 | 12 | export default IPageMenuItems; 13 | -------------------------------------------------------------------------------- /apps/extensions/src/app/utilities/initiateSentryJs.ts: -------------------------------------------------------------------------------- 1 | // Check https://docs.sentry.io/platforms/javascript/configuration/webworkers/ 2 | import * as Sentry from "@sentry/browser"; 3 | 4 | Sentry.init({ 5 | dsn: process.env.SENTRY_DSN || "https://5afbf303d711453cb6fd6b08951d5c70@o998199.ingest.sentry.io/6604566", tracesSampleRate: 1.0, 6 | }); 7 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/scripts/getPercentageFromRange.ts: -------------------------------------------------------------------------------- 1 | const getPercentageFromRange = (value: number, maxValue: number) => { 2 | let percentage = ((value / maxValue) * 100).toFixed(0); 3 | if (parseInt(percentage) > 100) percentage = '100'; 4 | 5 | return percentage; 6 | }; 7 | 8 | export default getPercentageFromRange; 9 | -------------------------------------------------------------------------------- /apps/portal/app/enums/StreamingServicesEnums.ts: -------------------------------------------------------------------------------- 1 | export enum VideoServicesEnum { 2 | MUX = 'mux', 3 | API_VIDEO = 'api.video', 4 | CLOUDINARY = 'cloudinary', 5 | LOCAL_STORAGE = 'local storage', 6 | } 7 | 8 | export enum PlaybackStatusEnum { 9 | PREPARING = 'preparing', 10 | READY = 'ready', 11 | ERRORED = 'errored', 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/ITextOptions.ts: -------------------------------------------------------------------------------- 1 | export interface ITextOptions { 2 | fontFamily: string; 3 | fontSize: number; 4 | fontStyle: string; 5 | fill: string; 6 | stroke: string; 7 | shadow: boolean; 8 | align: string; 9 | textDecoration: string; 10 | fontVariant: string; 11 | text:string 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/stop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/uploadScreen/UploadScreen.module.scss: -------------------------------------------------------------------------------- 1 | .uploadBackground { 2 | min-height: 100vh; 3 | min-width: 100vw; 4 | background: radial-gradient( 5 | ellipse at 25% 92%, 6 | rgba(101, 99, 255, 0.35) 0%, 7 | rgba(236, 234, 244, 0.4) 42%, 8 | rgba(236, 234, 244, 0.7) 100% 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/misc/appConstConfig.ts: -------------------------------------------------------------------------------- 1 | export const CHAPTER_MIN_CHAPTERS = 3; 2 | export const CHAPTER_MIN_REQUIRED_SECONDS = 10; 3 | export const CHAPTER_MIN_VIDEO_LENGTH = 4 | CHAPTER_MIN_CHAPTERS * CHAPTER_MIN_REQUIRED_SECONDS; 5 | export const CHAPTER_THUMBNAIL_WIDTH = 1000; 6 | export const CHAPTER_THUMBNAIL_HEIGHT = 562; 7 | -------------------------------------------------------------------------------- /apps/extensions/images/contentImages/pause-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/extensions/src/app/enums/StreamingServicesEnums.ts: -------------------------------------------------------------------------------- 1 | export enum VideoServicesEnum { 2 | MUX = 'mux', 3 | API_VIDEO = 'api.video', 4 | CLOUDINARY = 'cloudinary', 5 | LOCAL_STORAGE = 'local storage', 6 | } 7 | 8 | export enum PlaybackStatusEnum { 9 | PREPARING = 'preparing', 10 | READY = 'ready', 11 | ERRORED = 'errored', 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IExplorerData.ts: -------------------------------------------------------------------------------- 1 | import IEditorImage, { IDbFolderData } from './IEditorImage'; 2 | 3 | export default interface IExplorerData { 4 | allFolders: IDbFolderData[]; 5 | currentFolder: IDbFolderData | null; 6 | files: IEditorImage[]; 7 | folders: IDbFolderData[]; 8 | navigationFromFavoriteFolder?: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/ItemType.ts: -------------------------------------------------------------------------------- 1 | import { IWorkspaceImage, IWorkspaceVideo } from './IWorkspace'; 2 | 3 | export type ItemType = 'image' | 'video'; 4 | export type PermissionsItemType = 'screenshots' | 'videos' | 'folders'; 5 | export type WorkspaceItemType = IWorkspaceImage | IWorkspaceVideo; 6 | export type MixedItemType = 'image' | 'video' | 'mixed' -------------------------------------------------------------------------------- /apps/portal/public/contentImages/pause-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.codacy/codacy.yaml: -------------------------------------------------------------------------------- 1 | runtimes: 2 | - dart@3.7.2 3 | - go@1.22.3 4 | - java@17.0.10 5 | - node@22.2.0 6 | - python@3.11.11 7 | tools: 8 | - dartanalyzer@3.7.2 9 | - eslint@8.57.0 10 | - lizard@1.17.19 11 | - pmd@6.55.0 12 | - pylint@3.3.6 13 | - revive@1.7.0 14 | - semgrep@1.78.0 15 | - trivy@0.59.1 16 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IExplorerData.ts: -------------------------------------------------------------------------------- 1 | import IEditorImage, { IDbFolderData } from './IEditorImage'; 2 | 3 | export default interface IExplorerData { 4 | allFolders: IDbFolderData[]; 5 | currentFolder: IDbFolderData | null; 6 | files: IEditorImage[]; 7 | folders: IDbFolderData[]; 8 | navigationFromFavoriteFolder?: boolean; 9 | } 10 | -------------------------------------------------------------------------------- /apps/portal/public/new-design-v2/comment-more-options/more-vertical.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/new-design-v2/comment-more-options/more-vertical.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/ItemTypes.ts: -------------------------------------------------------------------------------- 1 | import { IWorkspaceImage, IWorkspaceVideo } from './IWorkspace'; 2 | 3 | export type ItemType = 'image' | 'video'; 4 | export type PermissionsItemType = 'screenshots' | 'videos' | 'folders'; 5 | export type WorkspaceItemType = IWorkspaceImage | IWorkspaceVideo; 6 | export type MixedItemType = 'image' | 'video' | 'mixed' -------------------------------------------------------------------------------- /apps/extensions/src/content/recording/components/RecordingHeader/RecordingHeader.tsx: -------------------------------------------------------------------------------- 1 | import Logo from '@/content/components/elements/Logo'; 2 | 3 | const RecordingHeader: React.FC = () => { 4 | return ( 5 |
6 | 7 |
8 | ); 9 | }; 10 | 11 | export default RecordingHeader; 12 | -------------------------------------------------------------------------------- /apps/portal/public/common/circle-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | node_modules 3 | **/node_modules/* 4 | **/npm-debug.log 5 | **/.husky 6 | .venv 7 | **/.next 8 | **/.turbo 9 | **/build 10 | **/dist 11 | **/out 12 | **/uploads 13 | **/tmp_videos 14 | **/tmp_videos_fixed 15 | **/*.log 16 | 17 | **/.vscode 18 | **/.env.local 19 | **/apps/portal/.env* 20 | **/apps/api/.env* 21 | **/apps/extensions/.env* 22 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/folders/move-items.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsId, IsOptionalId } from '../../validators/id.validator'; 2 | import { IsArray } from 'class-validator'; 3 | 4 | export class MoveItemsDto { 5 | @IsOptionalId() 6 | fromFolderId: string | false = false; 7 | 8 | @IsArray() 9 | @IsId({ each: true }) 10 | itemIds: string[]; 11 | } 12 | -------------------------------------------------------------------------------- /apps/portal/components/shared/modalComponents/ModalSaveChangesFooter.module.scss: -------------------------------------------------------------------------------- 1 | @import 'pagesScss/partials/_colors.scss'; 2 | 3 | .footerContainer { 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | margin-top: 1.7rem; 8 | 9 | .cancelLink { 10 | color: $primary-violet; 11 | cursor: pointer; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/portal/public/sidebar/backup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/interfaces/Folders.ts: -------------------------------------------------------------------------------- 1 | export interface SingleFavFolder { 2 | name: string; 3 | id: string; 4 | } 5 | 6 | export interface IFavoriteFolders { 7 | images: { [id: string]: SingleFavFolder }[]; 8 | videos: { [id: string]: SingleFavFolder }[]; 9 | workspaces: { 10 | [workspaceId: string]: { [id: string]: SingleFavFolder }[]; 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/circle-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/ToolBtn/customToolBtn/ArrowTool/arrowTool.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | justify-content: center; 4 | margin-bottom: 1rem; 5 | } 6 | 7 | .flexContainer { 8 | display: flex; 9 | justify-content: center; 10 | } 11 | 12 | .selector { 13 | margin-right: 0.5rem; 14 | } -------------------------------------------------------------------------------- /apps/portal/public/images/dropbox-1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/public/sidebar/sidebar-myimages.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/sidebar/backup.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/IStreamState.ts: -------------------------------------------------------------------------------- 1 | import { 2 | PlaybackStatusEnum, 3 | VideoServicesEnum, 4 | } from '../enums/StreamingServicesEnums'; 5 | 6 | export interface IStreamState { 7 | service: VideoServicesEnum; 8 | assetId: string; 9 | playbackStatus: PlaybackStatusEnum; 10 | downloadStatus: PlaybackStatusEnum; 11 | downloadUrl: string; 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/src/app/utilities/initiateSentryReact.ts: -------------------------------------------------------------------------------- 1 | import * as Sentry from "@sentry/react"; 2 | import { BrowserTracing } from "@sentry/tracing"; 3 | 4 | Sentry.init({ 5 | dsn: process.env.SENTRY_DSN || "https://5afbf303d711453cb6fd6b08951d5c70@o998199.ingest.sentry.io/6604566", 6 | debug: false, 7 | integrations: [new BrowserTracing()], 8 | tracesSampleRate: 1.0, 9 | }); -------------------------------------------------------------------------------- /apps/portal/app/services/helpers/videoDuration.ts: -------------------------------------------------------------------------------- 1 | const videoDurationConverter = (length: number) => { 2 | const date = new Date(0); 3 | date.setSeconds(length); 4 | let durationMain = date.toISOString().substr(11, 8); 5 | durationMain = durationMain.substr(3, durationMain.length); 6 | 7 | return durationMain; 8 | }; 9 | 10 | export { videoDurationConverter }; 11 | -------------------------------------------------------------------------------- /apps/portal/public/contentImages/recordingWindowIcons/button-pause-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "nrwl.angular-console", 4 | "deepscan.vscode-deepscan", 5 | "folke.vscode-monorepo-workspace", 6 | "seatonjiang.gitmoji-vscode", 7 | "dbaeumer.vscode-eslint", 8 | "jondot.vscode-hygen", 9 | "esbenp.prettier-vscode", 10 | "firsttris.vscode-jest-runner", 11 | "vscode-icons-team.vscode-icons" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/pipes/parse-on-false.pipe.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, PipeTransform } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class ParseOnFalse implements PipeTransform { 5 | transform(value: string): string | false { 6 | if (value === 'false') { 7 | return false; 8 | } 9 | return value; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apps/extensions/.env.sample: -------------------------------------------------------------------------------- 1 | EXTENSION_NAME=Rec [DEV] 2 | EXTENTION_ID=gneepehahiglangakfifnpdlppijdkck 3 | GOOGLE_CLIENT_ID= 4 | EXTENSION_REDIRECT_URL= 5 | REBRANDLY_API_KEY= 6 | 7 | API_BASE_URL=http://localhost:3000 8 | WEBSITE_URL=http://localhost:4200 9 | STATIC_FILES_URL=http://localhost:3000 10 | 11 | SENTRY_DSN= 12 | 13 | API_VIDEO_SERVICE_HOST=sandbox.api.video 14 | -------------------------------------------------------------------------------- /apps/extensions/images/contentImages/recordingWindowIcons/button-pause-grey.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/sidebar/sidebar-myimages.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/ITextOptions.ts: -------------------------------------------------------------------------------- 1 | export interface ITextOptions { 2 | fontFamily: string; 3 | fontSize: number; 4 | fontStyle: string; 5 | fill: string; 6 | stroke: string; 7 | shadow: boolean; 8 | align: string; 9 | textDecoration: string; 10 | fontVariant: string; 11 | text:string 12 | } 13 | -------------------------------------------------------------------------------- /storage.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | 3 | // Craft rules based on data in your Firestore database 4 | // allow write: if firestore.get( 5 | // /databases/(default)/documents/users/$(request.auth.uid)).data.isAdmin; 6 | service firebase.storage { 7 | match /b/{bucket}/o { 8 | match /{allPaths=**} { 9 | allow read, write: if false; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/settings/icon-dropbox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/src/app/services/helpers/videoDuration.ts: -------------------------------------------------------------------------------- 1 | const videoDurationConverter = (length: number) => { 2 | const date = new Date(0); 3 | date.setSeconds(length); 4 | let durationMain = date.toISOString().substr(11, 8); 5 | durationMain = durationMain.substr(3, durationMain.length); 6 | 7 | return durationMain; 8 | }; 9 | 10 | export { videoDurationConverter }; 11 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/ITextOptions.ts: -------------------------------------------------------------------------------- 1 | export interface ITextOptions { 2 | fontFamily: string; 3 | fontSize: number; 4 | fontStyle: string; 5 | fill: string; 6 | stroke: string; 7 | shadow: boolean; 8 | align: string; 9 | textDecoration: string; 10 | fontVariant: string; 11 | text:string 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/shared/modalComponents/ModalSaveChangesFooter.module.scss: -------------------------------------------------------------------------------- 1 | @import '@/content/utilities/partials/_colors.scss'; 2 | 3 | .footerContainer { 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | margin-top: 1.7rem; 8 | 9 | .cancelLink { 10 | color: $primary-violet; 11 | cursor: pointer; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/extensions/src/app/store/popup/index.ts: -------------------------------------------------------------------------------- 1 | import { combineReducers, createStore } from 'redux'; 2 | import AuthReducer from '../auth/reducers/AuthReducer'; 3 | import CommonReducer from './reducers/CommonReducer'; 4 | 5 | 6 | export const mainReducer = combineReducers({ 7 | common: CommonReducer, 8 | auth: AuthReducer, 9 | }); 10 | 11 | export default createStore(mainReducer); -------------------------------------------------------------------------------- /apps/portal/components/controls/AppButton2.module.scss: -------------------------------------------------------------------------------- 1 | @import 'pagesScss/partials/_colors.scss'; 2 | 3 | .appButton2 { 4 | display: flex; 5 | align-items: center; 6 | justify-content: space-between; 7 | padding: 1rem; 8 | border: 2px solid $grey-light04; 9 | border-radius: 0.5rem; 10 | font-weight: bold; 11 | gap: 1rem; 12 | transition: all 0.1s ease-in-out; 13 | } 14 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/T(Fill).svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/update-image.dto.ts: -------------------------------------------------------------------------------- 1 | import { CanBe } from '../../../../utils/validator'; 2 | import { IsImageFilename } from '../../validators/image-filename.validator'; 3 | 4 | export class UpdateImageDto { 5 | @CanBe(undefined) 6 | @IsImageFilename() 7 | refName?: string; 8 | 9 | @CanBe(undefined) 10 | @IsImageFilename() 11 | location?: string; 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/T(Fill).svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/PanelRoutesWrapper.tsx: -------------------------------------------------------------------------------- 1 | import useFetchWorkspacesData from '@/content/panel/hooks/useFetchWorkspacesData'; 2 | 3 | // put here functionality that has to run wrapper on the whole project, but also needs router to work. 4 | const PanelRoutesWrapper = () => { 5 | useFetchWorkspacesData(); 6 | 7 | return null; 8 | }; 9 | 10 | export default PanelRoutesWrapper; 11 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IMarkerComment.ts: -------------------------------------------------------------------------------- 1 | export interface IMarkerComment { 2 | id: string; 3 | markerId: string; 4 | content: string; 5 | timestamp: string | number; 6 | imageSrc: string; 7 | audioSrc?: string; 8 | videoSrc: string; 9 | audioDuration?: string; 10 | user: { 11 | id: string; 12 | photoUrl: string | null; 13 | displayName: string; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /apps/portal/app/store/panel/panelUtils/utials.ts: -------------------------------------------------------------------------------- 1 | import IExplorerData from 'app/interfaces/IExplorerData'; 2 | import { IUser } from 'app/interfaces/IUserData'; 3 | import { IWorkspace } from '../../../interfaces/IWorkspace'; 4 | 5 | export const isRootFolder = ( 6 | user: IUser, 7 | data: IExplorerData | IWorkspace, 8 | ): boolean => { 9 | return !user || !data?.currentFolder; 10 | }; 11 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/toolsOptions.module.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | align-items: center; 4 | } 5 | 6 | .selector { 7 | margin-right: 0.5rem; 8 | } 9 | 10 | .font { 11 | font-size: 0.75rem; 12 | line-height: 1rem; 13 | } 14 | 15 | .inputContainer { 16 | margin-right: 0.25rem; 17 | width: 7rem; 18 | } -------------------------------------------------------------------------------- /apps/portal/public/images/sendemail.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/public/whiteboards/ContextMenuItems/newtab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/IStreamState.ts: -------------------------------------------------------------------------------- 1 | import { PlaybackStatusEnum } from 'app/enums/StreamingServicesEnums'; 2 | import { VideoServicesEnum } from 'app/enums/StreamingServicesEnums'; 3 | 4 | export interface IStreamState { 5 | service: VideoServicesEnum; 6 | assetId: string; 7 | playbackStatus: PlaybackStatusEnum; 8 | downloadStatus: PlaybackStatusEnum; 9 | downloadUrl: string; 10 | } 11 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/PanelSplitter.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PanelSplitter: React.FC = () => { 4 | return ( 5 |
13 | ); 14 | }; 15 | 16 | export default PanelSplitter; 17 | -------------------------------------------------------------------------------- /apps/portal/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import AppSpinner from 'components/containers/appSpinner/AppSpinner'; 2 | import { useEffect } from 'react'; 3 | import { useRouter } from 'next/router'; 4 | 5 | function Custom404() { 6 | const router = useRouter(); 7 | 8 | useEffect(() => { 9 | router.push('/'); 10 | }, []); 11 | return ; 12 | } 13 | 14 | export default Custom404; 15 | -------------------------------------------------------------------------------- /apps/api/src/common/pipeline/handler.interface.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Wrap whatever context you need (token, DTO, metadata…). 3 | */ 4 | export interface IRequestCtx { 5 | context: TCtx; 6 | } 7 | 8 | /** Handlers implement canHandle/process on that context. */ 9 | export interface IHandler { 10 | canHandle(ctx: TCtx): Promise; 11 | process(ctx: TCtx): Promise; 12 | } 13 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/members/get-populated-members.dto.ts: -------------------------------------------------------------------------------- 1 | import { Transform } from 'class-transformer'; 2 | import { IsNumberString } from 'class-validator'; 3 | import { CanBe } from '../../../../utils/validator'; 4 | 5 | export class GetPopulatedMembersDto { 6 | @CanBe(undefined) 7 | @IsNumberString() 8 | @Transform(({ value }) => parseInt(value, 10)) 9 | limit?: number; 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/sendemail.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/public/common/collection-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/portal/public/settings/account_box.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/password-reset/interfaces/password-request.interface.ts: -------------------------------------------------------------------------------- 1 | import { AuthState } from "../../../interfaces/auth.interface"; 2 | import { AuthContext } from "../../auth.context"; 3 | 4 | export interface PasswordRequest { 5 | message: string; 6 | } 7 | 8 | export type Email = string; 9 | 10 | export type PasswordRequestState = AuthState, Email>; 11 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/delete-image.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsId, IsOptionalId } from '../../validators/id.validator'; 2 | import { IsImageFilename } from '../../validators/image-filename.validator'; 3 | 4 | export class DeleteImageDto { 5 | @IsImageFilename() 6 | refName: string; 7 | 8 | @IsId() 9 | imageId: string; 10 | 11 | @IsOptionalId() 12 | folderId: string | false = false; 13 | } 14 | -------------------------------------------------------------------------------- /apps/extensions/src/app/store/panel/panelUtils/index.ts: -------------------------------------------------------------------------------- 1 | import IExplorerData from '@/app/interfaces/IExplorerData'; 2 | import { IUser } from '@/app/interfaces/IUserData'; 3 | import { IWorkspace } from '@/app/interfaces/IWorkspace'; 4 | 5 | export const isRootFolder = ( 6 | user: IUser, 7 | data: IExplorerData | IWorkspace | null, 8 | ): boolean => { 9 | return !user || !data?.currentFolder; 10 | }; 11 | -------------------------------------------------------------------------------- /apps/portal/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | displayName: 'portal', 3 | preset: '../../jest.preset.js', 4 | transform: { 5 | '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', 6 | '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/next/babel'] }], 7 | }, 8 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 9 | coverageDirectory: '../../coverage/apps/portal', 10 | }; 11 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/decorators/user.decorator.ts: -------------------------------------------------------------------------------- 1 | import { createParamDecorator, ExecutionContext } from '@nestjs/common'; 2 | import { IRequestUser } from '../guards/auth.guard'; 3 | 4 | export const User = createParamDecorator( 5 | async (data: unknown, context: ExecutionContext) => { 6 | const req = context.switchToHttp().getRequest<{ user?: IRequestUser }>(); 7 | return req.user; 8 | }, 9 | ); 10 | -------------------------------------------------------------------------------- /apps/api/src/module/log/view.models/LogEventEnum.ts: -------------------------------------------------------------------------------- 1 | export enum LogEventEnum { 2 | FirstLaunch = 'FirstLaunch', 3 | SingleLaunch = 'SingleLaunch', 4 | Reinstall = 'Reinstall', 5 | AppWasDeleted = 'AppWasDeleted', 6 | UserEnterEmail = 'UserEnterEmail', 7 | UserEnterPassword = 'UserEnterPassword', 8 | UserSignedUpViaGoogle = 'UserSignedUpViaGoogle', 9 | UserResetPassword = 'UserResetPassword', 10 | } 11 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/settings/account_box.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/images/popup/capture/Tab_inactive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/app/store/auth/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_USER = 'SET_USER'; 2 | export const SET_DRIVE_USER = 'SET_DRIVE_USER'; 3 | export const REMOVE_SLACK_USER = 'REMOVE_SLACK_USER'; 4 | export const REMOVE_DROP_BOX_USER = 'REMOVE_DROP_BOX_USER'; 5 | export const REMOVE_JIRA_USER = 'REMOVE_JIRA_USER'; 6 | export const REMOVE_TRELLO_USER = 'REMOVE_TRELLO_USER'; 7 | export const SET_TRELLO_USER = 'SET_TRELLO_USER'; 8 | -------------------------------------------------------------------------------- /apps/portal/public/common/workspace-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/Interfaces/Invites.ts: -------------------------------------------------------------------------------- 1 | export interface IWorkspaceInvite { 2 | id: string; 3 | inviterId: string; 4 | workspaceId: string; 5 | expires?: number; 6 | } 7 | 8 | export interface IWorkspaceInviteData { 9 | id: string; 10 | workspaceInviter: string; 11 | workspaceName: string; 12 | workspaceMembers: string[]; // todo member data interface - (photoURL, displayName, email) 13 | } 14 | -------------------------------------------------------------------------------- /apps/extensions/images/popup/navigation/profile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/app/store/auth/actions/actionTypes.ts: -------------------------------------------------------------------------------- 1 | export const SET_USER = 'SET_USER'; 2 | export const SET_DRIVE_USER = 'SET_DRIVE_USER'; 3 | export const REMOVE_SLACK_USER = 'REMOVE_SLACK_USER'; 4 | export const REMOVE_DROP_BOX_USER = 'REMOVE_DROP_BOX_USER'; 5 | export const REMOVE_JIRA_USER = 'REMOVE_JIRA_USER'; 6 | export const REMOVE_TRELLO_USER = 'REMOVE_TRELLO_USER'; 7 | export const SET_TRELLO_USER = 'SET_TRELLO_USER'; -------------------------------------------------------------------------------- /apps/portal/app/interfaces/tools_interfaces/IConversationOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IConversationOptions { 2 | filename: string; 3 | category: string; 4 | data: string; 5 | fillColor: string; 6 | strokeColor: string; 7 | strokeWidth: number; 8 | textColor: string; 9 | textStrokeColor: string; 10 | textStrokeWidth: number; 11 | textSize: number; 12 | fontFamily: string; 13 | dash: number[]; 14 | } 15 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/workspace-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_videoEditorScreen/chapters/VideoChapterContentInput/VideoChapterContentInput.module.scss: -------------------------------------------------------------------------------- 1 | .ContentInput { 2 | border: 1px solid rgb(150, 150, 150) !important; 3 | margin-right: 0.5rem; 4 | height: 51px !important; 5 | width: 165px; 6 | } 7 | 8 | .disabled { 9 | color: black !important; 10 | background-color: transparent !important; 11 | cursor: default !important; 12 | } 13 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/align-center.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/align-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/portal/public/new-design-v2/single-video-buttons/like-thumb.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/tokens/index.ts: -------------------------------------------------------------------------------- 1 | export * from './interfaces/token.interface'; 2 | export * from './refresh/firebase-refresh.strategy'; 3 | export * from './refresh/unified-refresh.strategy'; 4 | export * from './refresh/validations/firebase-validate.strategy'; 5 | export * from './token-storage.service'; 6 | export * from './token-strategy.chain'; 7 | export * from './token.service'; 8 | export * from './user.factory'; 9 | -------------------------------------------------------------------------------- /apps/api/src/module/image/view.models/image.view.model.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DbCommentIntF, 3 | LikeIntF, 4 | ResponseComment, 5 | } from '../../../services/utils/models/shared.model'; 6 | 7 | export class ImageViewModel { 8 | link: string; 9 | created: string; 10 | title: string; 11 | commentsLength?: number; 12 | comments?: DbCommentIntF[] | ResponseComment[]; 13 | likes: LikeIntF[]; 14 | views: number; 15 | } 16 | -------------------------------------------------------------------------------- /apps/extensions/images/new-design-v2/single-video-buttons/like-thumb.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/tools/ZoomOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/align-center.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/align-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/extensions/src/content/components/controls/AppButton2/AppButton2.module.scss: -------------------------------------------------------------------------------- 1 | @import '@/content/utilities/partials/_colors.scss'; 2 | 3 | .appButton2 { 4 | display: flex; 5 | align-items: center; 6 | justify-content: space-between; 7 | padding: 1rem !important; 8 | border: 2px solid $grey-light04; 9 | border-radius: 0.5rem; 10 | font-weight: bold; 11 | gap: 1rem; 12 | transition: all 0.1s ease-in-out; 13 | } 14 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/components/containers/dashboardLayout/DashboardLayout.module.scss: -------------------------------------------------------------------------------- 1 | .dashboardLayoutWrapper { 2 | max-height: 100vh; 3 | height: 100vh; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | background-color: #f5f4f7; 8 | } 9 | 10 | @media screen and (max-width: 767px) { 11 | .dashboardLayoutWrapper { 12 | max-height: unset; 13 | height: auto; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/ZoomOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/whiteboard-tools-panel/rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/portal/public/common/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/components/containers/dashboardLayout/DashboardLayout.module.scss: -------------------------------------------------------------------------------- 1 | .dashboardLayoutWrapper { 2 | // minHeight: '100vh', 3 | max-height: 100vh; 4 | height: 100vh; 5 | display: flex; 6 | justify-content: center; 7 | align-items: center; 8 | background-color: #f5f4f7; 9 | } 10 | 11 | @media screen and (max-width: 767px) { 12 | .dashboardLayoutWrapper { 13 | max-height: unset; 14 | height: auto; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/portal/public/common/more_horiz_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/dto/send-email-verification.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsEmail, IsNotEmpty } from 'class-validator'; 2 | import { ApiProperty } from '@nestjs/swagger'; 3 | 4 | export class GenerateEmailVerificationLinkDto { 5 | @ApiProperty({ 6 | description: 'Email address to generate verification link for', 7 | example: 'user@example.com', 8 | required: true, 9 | }) 10 | @IsEmail() 11 | @IsNotEmpty() 12 | email: string; 13 | } 14 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/PanelSplitter.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PanelSplitter: React.FC = () => { 4 | return ( 5 |
11 | ); 12 | }; 13 | 14 | export default PanelSplitter; 15 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/scripts/sendBadgeTextMessagePort.ts: -------------------------------------------------------------------------------- 1 | import { AppMessagesEnum } from '@/app/messagess'; 2 | 3 | 4 | const sendBadgeTextMessagePort = async (text: string) => { 5 | const port = chrome.runtime.connect(); 6 | 7 | port.postMessage({ 8 | action: AppMessagesEnum.setBadgeTextPort, 9 | payload: { text }, 10 | }); 11 | 12 | port.disconnect(); 13 | }; 14 | 15 | export default sendBadgeTextMessagePort; 16 | -------------------------------------------------------------------------------- /apps/portal/app/enums/itemActionsEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemActionsEnum { 2 | share = 'share', 3 | shareSlack = 'shareSlack', 4 | shareWhatsApp = 'shareWhatsApp', 5 | download = 'download', 6 | move = 'move', 7 | delete = 'delete', 8 | createJiraIssue = 'createJiraIssue', 9 | createTrelloIssue = 'createTrelloIssue', 10 | moveToWorkspace = 'moveToWorkspace', 11 | editPermissions = 'editPermissions', 12 | restore = 'restore', 13 | } 14 | -------------------------------------------------------------------------------- /apps/portal/public/common/collection.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/api/src/module/video/view.models/video.view.model.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DbCommentIntF, 3 | LikeIntF, 4 | ResponseComment, 5 | } from '../../../services/utils/models/shared.model'; 6 | 7 | export class VideoViewModel { 8 | link: string; 9 | created: string; 10 | title: string; 11 | commentsLength?: number; 12 | email?: string; 13 | comments?: DbCommentIntF[] | ResponseComment[]; 14 | likes?: LikeIntF[]; 15 | views?: number; 16 | } 17 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/more_horiz_black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/@types/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | import React = require('react'); 3 | export const ReactComponent: React.SFC>; 4 | const src: string; 5 | export default src; 6 | } 7 | 8 | declare module '*.module.scss' { 9 | const styles: { 10 | [className: string]: string; 11 | }; 12 | export = styles; 13 | } 14 | 15 | declare module '@emoji-mart/react'; 16 | declare module 'howler'; 17 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IMarkerComment.ts: -------------------------------------------------------------------------------- 1 | export interface IMarkerComment { 2 | id: string; 3 | markerId: string; 4 | content: string; 5 | timestamp: string | number; 6 | imageSrc: string; 7 | audioSrc: string; 8 | videoSrc: string; 9 | audioDuration: string; 10 | user: { 11 | id: string; 12 | photoUrl: string | null; 13 | displayName: string; 14 | }; 15 | } 16 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_whiteboardScreen/whiteboardToolbar/customToolBtns/SubPanel.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface IToolSubPanelProp { 4 | children?: React.ReactNode; 5 | } 6 | 7 | const SubPanel: React.FC = ({ children }) => { 8 | return ( 9 |
10 | {children} 11 |
12 | ); 13 | }; 14 | 15 | export default SubPanel; 16 | -------------------------------------------------------------------------------- /apps/portal/public/settings/success.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/store/panel/index.ts: -------------------------------------------------------------------------------- 1 | import { combineReducers, createStore } from 'redux'; 2 | import AuthReducer from '../auth/reducers/AuthReducer'; 3 | import DriveReducer from '../drive/reducers/DriveReducer'; 4 | import PanelReducer from './reducers/PanelReducer'; 5 | 6 | export const mainReducer = combineReducers({ 7 | auth: AuthReducer, 8 | panel: PanelReducer, 9 | drive: DriveReducer, 10 | }); 11 | 12 | export default createStore(mainReducer); 13 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "ui": "stream", 4 | "tasks": { 5 | "build": { 6 | "dependsOn": [ 7 | "^build" 8 | ], 9 | "outputs": [ 10 | ".next/**", 11 | "dist/**", 12 | "!.next/cache/**" 13 | ] 14 | }, 15 | "check-types": { 16 | "dependsOn": [ 17 | "^check-types" 18 | ] 19 | }, 20 | "dev": { 21 | "persistent": true, 22 | "cache": false 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/collection.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/extensions/src/app/enums/itemActionsEnum.ts: -------------------------------------------------------------------------------- 1 | export enum ItemActionsEnum { 2 | shareSlack = 'shareSlack', 3 | shareWhatsApp = 'shareWhatsApp', 4 | share = 'share', 5 | download = 'download', 6 | move = 'move', 7 | delete = 'delete', 8 | createJiraIssue = 'createJiraIssue', 9 | createTrelloIssue = 'createTrelloIssue', 10 | moveToWorkspace = 'moveToWorkspace', 11 | editPermissions = 'editPermissions', 12 | restore = 'restore' 13 | } 14 | -------------------------------------------------------------------------------- /apps/portal/public/settings/icon-wallet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/folders/create-folder.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsNumber, IsString, MaxLength } from 'class-validator'; 2 | import { IsOptionalId } from '../../validators/id.validator'; 3 | 4 | export class CreateFolderDto { 5 | @IsString() 6 | @MaxLength(256) 7 | name: string; 8 | 9 | @IsString() 10 | color: string; 11 | 12 | @IsNumber() 13 | nestLevel: number; 14 | 15 | @IsOptionalId() 16 | parentId: string | false = false; 17 | } 18 | -------------------------------------------------------------------------------- /apps/extensions/images/tools/success-tick.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/editorHelpers/alphabet.ts: -------------------------------------------------------------------------------- 1 | export const alphabet = [ 2 | 'a', 3 | 'b', 4 | 'c', 5 | 'd', 6 | 'e', 7 | 'f', 8 | 'g', 9 | 'h', 10 | 'i', 11 | 'j', 12 | 'k', 13 | 'l', 14 | 'm', 15 | 'n', 16 | 'o', 17 | 'p', 18 | 'q', 19 | 'r', 20 | 's', 21 | 't', 22 | 'u', 23 | 'v', 24 | 'w', 25 | 'x', 26 | 'y', 27 | 'z', 28 | ]; -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/toolsOptions/interface/IConversationOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IConversationOptions { 2 | filename: string; 3 | category: string; 4 | data: string; 5 | fillColor: string; 6 | strokeColor: string; 7 | strokeWidth: number; 8 | textColor: string; 9 | textStrokeColor: string; 10 | textStrokeWidth: number; 11 | textSize: number; 12 | fontFamily: string; 13 | dash: number[]; 14 | } 15 | -------------------------------------------------------------------------------- /apps/portal/app/services/helpers/getCookies.ts: -------------------------------------------------------------------------------- 1 | import cookie from 'js-cookie'; 2 | import { ITokens } from 'app/interfaces/IUserData'; 3 | 4 | export const getCookies = (): ITokens => { 5 | const idToken = cookie.get('idToken'); 6 | const refreshToken = cookie.get('refreshToken'); 7 | 8 | return { idToken, refreshToken }; 9 | }; 10 | 11 | export const removeCookies = () => { 12 | cookie.remove('idToken'); 13 | cookie.remove('refreshToken'); 14 | }; 15 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/editorHelpers/alphabet.ts: -------------------------------------------------------------------------------- 1 | export const alphabet = [ 2 | 'a', 3 | 'b', 4 | 'c', 5 | 'd', 6 | 'e', 7 | 'f', 8 | 'g', 9 | 'h', 10 | 'i', 11 | 'j', 12 | 'k', 13 | 'l', 14 | 'm', 15 | 'n', 16 | 'o', 17 | 'p', 18 | 'q', 19 | 'r', 20 | 's', 21 | 't', 22 | 'u', 23 | 'v', 24 | 'w', 25 | 'x', 26 | 'y', 27 | 'z', 28 | ]; -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/toolsOptions/interface/IConversationOptions.ts: -------------------------------------------------------------------------------- 1 | export interface IConversationOptions { 2 | filename: string; 3 | category: string; 4 | data: string; 5 | fillColor: string; 6 | strokeColor: string; 7 | strokeWidth: number; 8 | textColor: string; 9 | textStrokeColor: string; 10 | textStrokeWidth: number; 11 | textSize: number; 12 | fontFamily: string; 13 | dash: number[]; 14 | } 15 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/settings/icon-wallet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/register/interfaces/register-state.interface.ts: -------------------------------------------------------------------------------- 1 | import { AuthState, TokenContainer } from "../../../interfaces/auth.interface"; 2 | import { AuthContext } from "../../auth.context"; 3 | import { IRegisterProps } from "../../authentication.service"; 4 | import { IUser } from '../../../../../interfaces/IUser'; 5 | 6 | export type Register = TokenContainer; 7 | 8 | export type RegisterState = AuthState, IRegisterProps>; 9 | -------------------------------------------------------------------------------- /apps/portal/public/settings/icon-passsword.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/myVideos/VideoItem/PlayButton.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | import AppSvg from 'components/elements/AppSvg'; 3 | 4 | const PlayButton: FC = () => ( 5 |
12 | 13 |
14 | ); 15 | 16 | export default PlayButton; 17 | -------------------------------------------------------------------------------- /apps/portal/hooks/useInfiniteScroll.ts: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | const ITEMS_PER_PAGE = 9; 4 | 5 | const useInfiniteScroll = (toLoad?: number) => { 6 | const [itemsToLoad, setItemsToLoad] = useState(toLoad ?? ITEMS_PER_PAGE); 7 | 8 | const loadMoreItems = () => { 9 | setItemsToLoad((prevNumber) => prevNumber + (toLoad ?? ITEMS_PER_PAGE)); 10 | }; 11 | 12 | return { itemsToLoad, loadMoreItems }; 13 | }; 14 | 15 | export default useInfiniteScroll; 16 | -------------------------------------------------------------------------------- /apps/api/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Render } from '@nestjs/common'; 2 | import { AppService } from './app.service'; 3 | 4 | @Controller() 5 | export class AppController { 6 | constructor(private readonly appService: AppService) {} 7 | 8 | @Get('hello') 9 | async getHello(): Promise { 10 | return await this.appService.getHello(); 11 | } 12 | 13 | @Get('404') 14 | @Render('404') 15 | async notFound() { 16 | return; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/settings/icon-passsword.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/app/interfaces/Folders.ts: -------------------------------------------------------------------------------- 1 | import { ItemTypeEnum } from 'app/enums/itemTypeEnum'; 2 | 3 | export interface SingleFavFolder { 4 | name: string; 5 | id: string; 6 | type: ItemTypeEnum; 7 | workspaceId?: string; 8 | } 9 | 10 | export interface IFavoriteFolders { 11 | images: { [id: string]: SingleFavFolder }; 12 | videos: { [id: string]: SingleFavFolder }; 13 | workspaces: { 14 | [workspaceId: string]: { [id: string]: SingleFavFolder }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /apps/portal/hooks/useEnterKeyPress.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | const useEnterKeyPress = (callback: () => void) => { 4 | useEffect(() => { 5 | const keyPress = (e: KeyboardEvent) => { 6 | if (e.code === 'Enter') { 7 | callback(); 8 | } 9 | }; 10 | 11 | window.addEventListener('keydown', keyPress); 12 | return () => window.removeEventListener('keydown', keyPress); 13 | }); 14 | }; 15 | 16 | export default useEnterKeyPress; 17 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/components/containers/dashboardLayout/elements/Slidedown/Slidedown.module.scss: -------------------------------------------------------------------------------- 1 | .react-slidedown { 2 | height: 0; 3 | transition-property: none; 4 | transition-duration: 0.4s; 5 | transition-timing-function: ease-in-out; 6 | } 7 | 8 | .transitioning { 9 | overflow-y: hidden; 10 | transition-property: none; 11 | transition-duration: 0.4s; 12 | transition-timing-function: ease-in-out; 13 | } 14 | 15 | .closed { 16 | display: none; 17 | } 18 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/toolsPanel/ToolsRow.tsx: -------------------------------------------------------------------------------- 1 | import classNames from 'classnames'; 2 | import React from 'react'; 3 | 4 | 5 | interface IToolsRowProps { 6 | className?: string; 7 | } 8 | 9 | const ToolsRow: React.FC = ({ className, children }) => { 10 | return ( 11 |
12 | {children} 13 |
14 | ); 15 | }; 16 | 17 | export default ToolsRow; 18 | -------------------------------------------------------------------------------- /apps/portal/public/item/options.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/portal/public/sidebar/gallery-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"], 7 | "jsx": "react" 8 | }, 9 | "include": [ 10 | "**/*.test.ts", 11 | "**/*.spec.ts", 12 | "**/*.test.tsx", 13 | "**/*.spec.tsx", 14 | "**/*.test.js", 15 | "**/*.spec.js", 16 | "**/*.test.jsx", 17 | "**/*.spec.jsx", 18 | "**/*.d.ts" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /apps/api/src/module/auth/services/login/interfaces/login-state.interface.ts: -------------------------------------------------------------------------------- 1 | import { ILoginProps } from "../../authentication.service"; 2 | import { AuthState, TokenContainer } from '../../../interfaces/auth.interface'; 3 | import { AuthContext } from "../../auth.context"; 4 | import { IUser } from '../../../../../interfaces/IUser'; 5 | 6 | 7 | export type Login = TokenContainer; 8 | 9 | export type LoginState = AuthState, ILoginProps>; 10 | -------------------------------------------------------------------------------- /apps/portal/.env.sample: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_EXTENSION_NAME=Rec 2 | NEXT_PUBLIC_EXTENSION_ID=gneepehahiglangakfifnpdlppijdkck 3 | NEXT_PUBLIC_GOOGLE_CLIENT_ID= 4 | NEXT_PUBLIC_EXTENSION_REDIRECT_URL= 5 | NEXT_PUBLIC_REBRANDLY_API_KEY= 6 | 7 | NEXT_PUBLIC_API_BASE_URL=http://localhost:3000 8 | NEXT_PUBLIC_WEBSITE_URL=http://localhost:4200 9 | NEXT_PUBLIC_STATIC_FILES_URL=http://localhost:3000 10 | 11 | NEXT_PUBLIC_DESKTOP_PROTOCOL=ever-rec: 12 | 13 | NEXT_PUBLIC_SENTRY_DSN= 14 | SENTRY_ORG=ever-co 15 | -------------------------------------------------------------------------------- /apps/portal/public/settings/trello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/public/whiteboards/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/module/video-services/mux/mux.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { HttpModule } from 'nestjs-http-promise'; 3 | import { AuthModule } from '../../auth/auth.module'; 4 | import { MuxController } from './mux.controller'; 5 | import { MuxService } from './mux.service'; 6 | 7 | @Module({ 8 | imports: [HttpModule, AuthModule], 9 | controllers: [MuxController], 10 | providers: [MuxService], 11 | exports: [MuxService], 12 | }) 13 | export class MuxModule {} 14 | -------------------------------------------------------------------------------- /apps/extensions/images/logo/trello-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/dropbox-icon-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/item/options.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/sidebar/gallery-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/overlay/components/videoCamera/video-camera.scss: -------------------------------------------------------------------------------- 1 | .rec { 2 | .video-container-main { 3 | width: 175px; 4 | 5 | .video-container { 6 | position: absolute; 7 | top: 20px; 8 | left: 105px; 9 | right: 0; 10 | bottom: 0; 11 | height: 175px; 12 | width: 175px; 13 | border-radius: 999px; 14 | transform: translateX(-50%); 15 | background-color: #3f4049; 16 | z-index: 2147483647; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/PlayButton/PlayButton.tsx: -------------------------------------------------------------------------------- 1 | import { FC } from 'react'; 2 | import AppSvg from '@/content/components/elements/AppSvg'; 3 | 4 | const PlayButton: FC = () => ( 5 |
12 | 13 |
14 | ); 15 | 16 | export default PlayButton; 17 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/workspace/MoveToWorkspaceModal/MoveToWorkspaceModal.module.scss: -------------------------------------------------------------------------------- 1 | .workspaceItem { 2 | background: #b8b1f8; 3 | padding: 10px; 4 | padding-left: 20px; 5 | color: black; 6 | border-radius: 5px; 7 | cursor: pointer; 8 | border: 1px solid #5b4dbe; 9 | transition: all 0.5s ease; 10 | margin-bottom: 10px; 11 | 12 | &.active, &:hover{ 13 | transition: all 0.5s ease; 14 | color: white; 15 | background: #5b4dbe; 16 | } 17 | } -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/myVideos/VideoItem/ThumbnailSkeletonLoader.tsx: -------------------------------------------------------------------------------- 1 | import styles from './ThumbnailSkeletonLoader.module.scss'; 2 | 3 | const SkeletonLoader = ({ 4 | width, 5 | height, 6 | }: { 7 | width?: number; 8 | height?: number; 9 | }) => ( 10 |
17 | ); 18 | 19 | export default SkeletonLoader; 20 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/workspace/MoveToWorkspaceModal/MoveToWorkspaceModal.module.scss: -------------------------------------------------------------------------------- 1 | .workspaceItem { 2 | background: #b8b1f8; 3 | padding: 10px; 4 | padding-left: 20px; 5 | color: black; 6 | border-radius: 5px; 7 | cursor: pointer; 8 | border: 1px solid #5b4dbe; 9 | transition: all 0.5s ease; 10 | margin-bottom: 10px; 11 | 12 | &.active, &:hover{ 13 | transition: all 0.5s ease; 14 | color: white; 15 | background: #5b4dbe; 16 | } 17 | } -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_videoEditorScreen/ItemTitleAuthor/ItemTitleAuthor.module.scss: -------------------------------------------------------------------------------- 1 | @use 'pagesScss/partials/_dotSeparator.scss'; 2 | 3 | .itemAuthor { 4 | display: flex; 5 | flex-direction: column; 6 | gap: 1rem; 7 | 8 | h3 { 9 | font-size: 1.3rem; 10 | font-weight: 600; 11 | } 12 | } 13 | 14 | .itemAuthorDetails { 15 | display: flex; 16 | gap: 0.5rem; 17 | 18 | img { 19 | width: 25px; 20 | height: 25px; 21 | border-radius: 100%; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/settings/icon-trello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/videoEditorScreen/chapters/VideoChapterCaveatPopover/VideoChapterCaveatPopover.module.scss: -------------------------------------------------------------------------------- 1 | .Caveats { 2 | padding: 1rem; 3 | border-radius: 1rem; 4 | 5 | h3 { 6 | font-weight: 600; 7 | margin-bottom: 0.5rem; 8 | } 9 | 10 | ul { 11 | list-style-type: disc; 12 | margin-left: 1rem; 13 | } 14 | 15 | p { 16 | max-width: 350px; 17 | } 18 | } 19 | 20 | .Paragraph { 21 | margin-top: 0.5rem; 22 | font-size: 0.9rem !important; 23 | } 24 | -------------------------------------------------------------------------------- /apps/extensions/src/content/recording/interfaces/IRecordingActionsProps.ts: -------------------------------------------------------------------------------- 1 | import { StatusMessages } from '@/content/utilities/hooks/useReactMediaRecorder'; 2 | 3 | export default interface IRecordingActionsProps { 4 | recordingStatus: StatusMessages; 5 | microphoneMuted: boolean; 6 | microphoneEnabled: boolean; 7 | stopRecording: () => void; 8 | pauseRecording: () => void; 9 | resumeRecording: () => void; 10 | muteOrUnmute: (mute: boolean) => void; 11 | cancelRecording: () => void; 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/src/content/utilities/hooks/useEnterKeyPress.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | const useEnterKeyPress = (callback: () => void) => { 4 | useEffect(() => { 5 | const keyPress = (e: KeyboardEvent) => { 6 | if (e.code === 'Enter') { 7 | callback(); 8 | } 9 | }; 10 | 11 | window.addEventListener('keydown', keyPress); 12 | return () => window.removeEventListener('keydown', keyPress); 13 | }); 14 | }; 15 | 16 | export default useEnterKeyPress; 17 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_videoEditorScreen/chapters/VideoChapterCaveatPopover/VideoChapterCaveatPopover.module.scss: -------------------------------------------------------------------------------- 1 | .Caveats { 2 | padding: 1rem; 3 | border-radius: 1rem; 4 | 5 | h3 { 6 | font-weight: 600; 7 | margin-bottom: 0.5rem; 8 | } 9 | 10 | ul { 11 | list-style-type: disc; 12 | margin-left: 1rem; 13 | } 14 | 15 | p { 16 | max-width: 350px; 17 | } 18 | } 19 | 20 | .Paragraph { 21 | margin-top: 0.5rem; 22 | font-size: 0.9rem !important; 23 | } 24 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/blackTT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/whiteTT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/images/icon-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/settings/dropbox.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/images/icon-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/images/logo/dropbox-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/Thumbnail/ThumbnailSkeletonLoader.tsx: -------------------------------------------------------------------------------- 1 | import * as styles from './ThumbnailSkeletonLoader.module.scss'; 2 | 3 | const SkeletonLoader = ({ 4 | width, 5 | height, 6 | }: { 7 | width?: number; 8 | height?: number; 9 | }) => ( 10 |
17 | ); 18 | 19 | export default SkeletonLoader; 20 | -------------------------------------------------------------------------------- /apps/portal/public/common/trello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/upload-image.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | import { IsImageFilename } from '../../validators/image-filename.validator'; 3 | import { IsOptionalId } from '../../validators/id.validator'; 4 | 5 | export class UploadImageDto { 6 | @IsString() 7 | @MaxLength(256) 8 | title: string; 9 | 10 | @IsImageFilename() 11 | @MaxLength(256) 12 | fullFileName: string; 13 | 14 | @IsOptionalId() 15 | folderId: string | false = false; 16 | } 17 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/upload-video.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString, MaxLength } from 'class-validator'; 2 | import { IsVideoFilename } from '../../validators/video-filename.validator'; 3 | import { IsOptionalId } from '../../validators/id.validator'; 4 | 5 | export class UploadVideoDto { 6 | @IsString() 7 | @MaxLength(256) 8 | title: string; 9 | 10 | @IsVideoFilename() 11 | @MaxLength(256) 12 | fullFileName: string; 13 | 14 | @IsOptionalId() 15 | folderId: string | false = false; 16 | } 17 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/pipes/validate-image-filename.pipe.ts: -------------------------------------------------------------------------------- 1 | import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common'; 2 | import { is_image_filename } from '../validators/image-filename.validator'; 3 | 4 | @Injectable() 5 | export class ValidateImageFilename implements PipeTransform { 6 | transform(value: string): string { 7 | if (is_image_filename(value)) { 8 | return value; 9 | } 10 | throw new BadRequestException('Invalid image filename'); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/pipes/validate-video-filename.pipe.ts: -------------------------------------------------------------------------------- 1 | import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common'; 2 | import { is_video_filename } from '../validators/video-filename.validator'; 3 | 4 | @Injectable() 5 | export class ValidateVideoFilename implements PipeTransform { 6 | transform(value: string): string { 7 | if (is_video_filename(value)) { 8 | return value; 9 | } 10 | throw new BadRequestException('Invalid video filename'); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/images/icon-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/blackTT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/whiteTT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/videoEditorScreen/ItemTitleAuthor/ItemTitleAuthor.module.scss: -------------------------------------------------------------------------------- 1 | @import '@/content/utilities/partials/_dotSeparator.scss'; 2 | 3 | .itemAuthor { 4 | display: flex; 5 | flex-direction: column; 6 | gap: 1rem; 7 | 8 | h3 { 9 | font-size: 1.3rem; 10 | font-weight: 600; 11 | } 12 | } 13 | 14 | .itemAuthorDetails { 15 | display: flex; 16 | gap: 0.5rem; 17 | 18 | img { 19 | width: 25px; 20 | height: 25px; 21 | border-radius: 100%; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /apps/extensions/src/content/popup/assets/emojitoolPanel.scss: -------------------------------------------------------------------------------- 1 | .rec { 2 | em-emoji-picker { 3 | --background-rgb: 'transparent'; 4 | --border-radius: 5px; 5 | --category-icon-size: 18px; 6 | --color-border-hover: rgba(0, 0, 0, 0.1); 7 | --color-border: rgba(0, 0, 0, 0.05); 8 | --rgb-accent: 91, 77, 190; 9 | --rgb-background: 'transparent'; 10 | --rgb-color: 0, 0, 0; 11 | --shadow: 'none'; 12 | height: 50vh; 13 | min-height: 300px; 14 | max-height: 500px; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/google-drive-logo-dark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/item/trello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/extensions/images/popup/navigation/myimages.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/settings/icon-trello.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/portal/app/services/email.ts: -------------------------------------------------------------------------------- 1 | import { sendWorkspaceInviteLinkAPI } from './api/email'; 2 | import { iDataResponseParser } from './helpers/iDataResponseParser'; 3 | 4 | export const sendWorkspaceInviteLink = async ( 5 | emails: string[], 6 | inviteId: string, 7 | inviterDisplayName: string, 8 | ) => { 9 | const response = await sendWorkspaceInviteLinkAPI( 10 | emails, 11 | inviteId, 12 | inviterDisplayName, 13 | ); 14 | const data = iDataResponseParser(response, false); 15 | return data; 16 | }; 17 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/blackT_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/whiteT_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/app/interfaces/Folders.ts: -------------------------------------------------------------------------------- 1 | import { ItemTypeEnum } from '@/content/panel/screens/imagesScreen/pages/shared/enums/itemTypeEnum'; 2 | 3 | export interface SingleFavFolder { 4 | name: string; 5 | id: string; 6 | type: ItemTypeEnum; 7 | workspaceId?: string; 8 | } 9 | 10 | export interface IFavoriteFolders { 11 | images: { [id: string]: SingleFavFolder }; 12 | videos: { [id: string]: SingleFavFolder }; 13 | workspaces: { 14 | [workspaceId: string]: { [id: string]: SingleFavFolder }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /apps/extensions/src/app/services/email.ts: -------------------------------------------------------------------------------- 1 | import { sendWorkspaceInviteLinkAPI } from './api/email'; 2 | import { iDataResponseParser } from './helpers/iDataResponseParser'; 3 | 4 | export const sendWorkspaceInviteLink = async ( 5 | emails: string[], 6 | inviteId: string, 7 | inviterDisplayName: string, 8 | ) => { 9 | const response = await sendWorkspaceInviteLinkAPI( 10 | emails, 11 | inviteId, 12 | inviterDisplayName, 13 | ); 14 | const data = iDataResponseParser(response, false); 15 | return data; 16 | }; 17 | -------------------------------------------------------------------------------- /apps/portal/app/services/helpers/iDataResponseParser.ts: -------------------------------------------------------------------------------- 1 | import { IDataResponse, ResStatusEnum } from '../../interfaces/IApiResponse'; 2 | import { errorHandler } from './errors'; 3 | 4 | export const iDataResponseParser = ( 5 | response: IDataResponse, 6 | showNotification = true, 7 | ): null | typeof response.data => { 8 | if (response.status === ResStatusEnum.error) { 9 | window && showNotification && errorHandler(response); 10 | return null; 11 | } else { 12 | return response.data as T; 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/ToolBtn/customToolBtn/ShareToolBtn/shareToolBtn.module.scss: -------------------------------------------------------------------------------- 1 | .mainContainer { 2 | transition-property: all; 3 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 4 | transition-duration: 150ms; 5 | } 6 | 7 | .title { 8 | font-size: 1rem; 9 | line-height: 1.5rem; 10 | font-weight: 600; 11 | margin-bottom: 0.5rem; 12 | } 13 | 14 | .container { 15 | display: flex; 16 | align-items: center; 17 | margin-bottom: 1rem; 18 | width: 300px; 19 | } -------------------------------------------------------------------------------- /apps/api/src/module/auth/interfaces/auth.interface.ts: -------------------------------------------------------------------------------- 1 | export interface AuthState { 2 | handle(context: T, payload: U): Promise; 3 | } 4 | 5 | export type AuthStateResult = T; 6 | 7 | export type TokenContainer = { 8 | accessToken: string; 9 | refreshToken: string; 10 | data: T; 11 | } 12 | 13 | export type AuthContextResult = Map>; 14 | 15 | export enum AuthProviderId { 16 | FIREBASE = 'firebase', 17 | GAUZY = 'gauzy' 18 | } 19 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/Interfaces/AddToDbProps.ts: -------------------------------------------------------------------------------- 1 | import { IChapter } from 'src/interfaces/IChapter'; 2 | import { IStreamingDbData } from 'src/interfaces/IEditorVideo'; 3 | 4 | export interface AddToDbProps { 5 | id: string; 6 | uid: string; 7 | title: string; 8 | refName: string; 9 | folderId: string | false; 10 | workspaceId: string; 11 | metadata: any; 12 | streamData?: IStreamingDbData; 13 | chapters?: IChapter[]; 14 | chaptersEnabled?: boolean; 15 | stage?: any; 16 | originalImage?: string; 17 | } 18 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/blackT_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/whiteT_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/shared/hooks/useInfiniteScroll.ts: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | 3 | 4 | const ITEMS_PER_PAGE = 9; 5 | 6 | const useInfiniteScroll = (toLoad?: number) => { 7 | const [itemsToLoad, setItemsToLoad] = useState(toLoad ?? ITEMS_PER_PAGE); 8 | 9 | const loadMoreItems = () => { 10 | setItemsToLoad((prevNumber) => prevNumber + (toLoad ?? ITEMS_PER_PAGE)); 11 | }; 12 | 13 | return { itemsToLoad, loadMoreItems }; 14 | }; 15 | 16 | export default useInfiniteScroll; 17 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/toolsPanel/ToolsRow.tsx: -------------------------------------------------------------------------------- 1 | import classNames from 'classnames'; 2 | import React from 'react'; 3 | 4 | interface IToolsRowProps { 5 | className?: string; 6 | children?: React.ReactNode; 7 | } 8 | 9 | const ToolsRow: React.FC = ({ className, children }) => { 10 | return ( 11 |
12 | {children} 13 |
14 | ); 15 | }; 16 | 17 | export default ToolsRow; 18 | -------------------------------------------------------------------------------- /apps/extensions/src/content/recording/recording.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Rec 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_whiteboardScreen/whiteboardHelpers/commentsPopup/commentContentPopup.module.scss: -------------------------------------------------------------------------------- 1 | .whiteboardComment { 2 | width: 344px; 3 | height: 42px; 4 | background: #ffffff; 5 | border: 1px solid #f2f2f7; 6 | box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); 7 | border-radius: 5px; 8 | padding: 6px; 9 | textarea { 10 | resize: none; 11 | &::placeholder { 12 | color: #d1d1d6; 13 | font-weight: 400; 14 | font-size: 13px; 15 | line-height: 16px; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/portal/public/assets/svg/tools-panel/heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/api/src/common/pipeline/pipeline.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, Global } from '@nestjs/common'; 2 | import { DiscoveryModule, Reflector } from '@nestjs/core'; 3 | import { PipelineExplorer } from './pipeline.explorer'; 4 | import { HandlerFactory } from './factory'; 5 | import { PipelineService } from './pipeline.service'; 6 | 7 | @Global() 8 | @Module({ 9 | imports: [DiscoveryModule], 10 | providers: [Reflector, PipelineExplorer, HandlerFactory, PipelineService], 11 | exports: [PipelineService], 12 | }) 13 | export class PipelineModule {} 14 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/folders/update-member-permissions.dto.ts: -------------------------------------------------------------------------------- 1 | import { Equals, IsBoolean, IsIn } from 'class-validator'; 2 | import { IsId } from '../../validators/id.validator'; 3 | 4 | export class UpdateFolderMemberPermissionsDto { 5 | @IsIn(['member', 'team']) 6 | permissionType: 'member' | 'team'; 7 | 8 | @IsId() 9 | id: string; // user or team id 10 | 11 | @Equals('folders') 12 | permissionItemType: 'folders'; 13 | 14 | @IsBoolean() 15 | write: boolean; 16 | 17 | @IsBoolean() 18 | read: boolean; 19 | } 20 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/imagesScreen/pages/myVideos/Thumbnail/Thumbnail.module.scss: -------------------------------------------------------------------------------- 1 | .thumbnail { 2 | display: flex; 3 | align-items: center; 4 | height: 176px; 5 | overflow: hidden; 6 | 7 | & > * { 8 | position: absolute; 9 | top: 0; 10 | left: 0; 11 | width: 100% !important; 12 | height: 100% !important; 13 | } 14 | } 15 | 16 | .paddingTop { 17 | padding-top: 49%; 18 | } 19 | 20 | .video { 21 | width: 100%; 22 | min-height: 100%; 23 | max-height: 100%; 24 | object-fit: cover; 25 | } 26 | -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_imagesScreen/pages/myVideos/VideoItem/Thumbnail.module.scss: -------------------------------------------------------------------------------- 1 | .thumbnail { 2 | display: flex; 3 | align-items: center; 4 | height: 176px; 5 | position: relative; 6 | overflow: hidden; 7 | 8 | & > * { 9 | position: absolute; 10 | top: 0; 11 | left: 0; 12 | width: 100%; 13 | height: 100%; 14 | } 15 | } 16 | 17 | .paddingTop { 18 | padding-top: 49%; 19 | } 20 | 21 | .video { 22 | width: 100%; 23 | min-height: 100%; 24 | max-height: 100%; 25 | object-fit: cover; 26 | } 27 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/validators/image-filename.validator.ts: -------------------------------------------------------------------------------- 1 | import { matches, Matches } from 'class-validator'; 2 | import { ValidationOptions } from 'class-validator/types/decorator/ValidationOptions'; 3 | 4 | export const IMAGE_FILENAME_REGEX = /^([A-Za-z0-9_-]*).(jpg|jpeg|png|gif)$/; 5 | 6 | export function is_image_filename(value: string) { 7 | return matches(value, IMAGE_FILENAME_REGEX); 8 | } 9 | 10 | export const IsImageFilename = (validationOptions?: ValidationOptions) => 11 | Matches(IMAGE_FILENAME_REGEX, validationOptions); 12 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/validators/video-filename.validator.ts: -------------------------------------------------------------------------------- 1 | import { matches, Matches } from 'class-validator'; 2 | import { ValidationOptions } from 'class-validator/types/decorator/ValidationOptions'; 3 | 4 | export const VIDEO_FILENAME_REGEX = /^([A-Za-z0-9_-]*).(mp4|webm|mov|ogg)$/; 5 | 6 | export function is_video_filename(value: string) { 7 | return matches(value, VIDEO_FILENAME_REGEX); 8 | } 9 | 10 | export const IsVideoFilename = (validationOptions?: ValidationOptions) => 11 | Matches(VIDEO_FILENAME_REGEX, validationOptions); 12 | -------------------------------------------------------------------------------- /apps/extensions/src/content/assests/svg/tools-panel/heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/components/controls/AppButtonSecond.module.scss: -------------------------------------------------------------------------------- 1 | @import 'pagesScss/partials/_colors.scss'; 2 | 3 | .appButtonSecond { 4 | background-color: $primary-violet; 5 | padding: 0.7rem 1.5rem; 6 | border-radius: 1.5rem; 7 | color: white; 8 | cursor: pointer; 9 | } 10 | 11 | .appButtonDisabled { 12 | background-color: $grey-light03; 13 | } 14 | 15 | .appButtonDanger { 16 | background-color: $accessible-red; 17 | } 18 | 19 | .appButtonDanger.appButtonDisabled { 20 | background-color: $accessible-red; 21 | opacity: 0.5; 22 | } 23 | -------------------------------------------------------------------------------- /apps/portal/public/common/more_horiz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/portal/public/images/more_horiz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/editorScreen/editorHelpers/pdf.ts: -------------------------------------------------------------------------------- 1 | import jsPDF from 'jspdf'; 2 | import { Stage } from 'konva/lib/Stage'; 3 | 4 | 5 | export const pdfFormation = (stage: Stage):Blob => { 6 | const width = stage.width(); 7 | const height = stage.height(); 8 | const orientation = width > height ? 'l' : 'p' 9 | const pdf = new jsPDF(orientation, 'px', [stage.width(), stage.height()]); 10 | pdf.addImage(stage.toDataURL(), 0, 0, stage.width(), stage.height()); 11 | const blob: Blob = pdf.output('blob'); 12 | return blob; 13 | } -------------------------------------------------------------------------------- /apps/portal/components/pagesComponents/_editorScreen/editorHelpers/pdf.ts: -------------------------------------------------------------------------------- 1 | import jsPDF from 'jspdf'; 2 | import { Stage } from 'konva/lib/Stage'; 3 | 4 | 5 | export const pdfFormation = (stage: Stage):Blob => { 6 | const width = stage.width(); 7 | const height = stage.height(); 8 | const orientation = width > height ? 'l' : 'p' 9 | const pdf = new jsPDF(orientation, 'px', [stage.width(), stage.height()]); 10 | pdf.addImage(stage.toDataURL(), 0, 0, stage.width(), stage.height()); 11 | const blob: Blob = pdf.output('blob'); 12 | return blob; 13 | } -------------------------------------------------------------------------------- /apps/api/src/module/video-services/api-video/api-video.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { HttpModule } from 'nestjs-http-promise'; 3 | import { ApiVideoController } from './api-video.controller'; 4 | import { ApiVideoService } from './api-video.service'; 5 | import { AuthModule } from '../../../module/auth/auth.module'; 6 | 7 | @Module({ 8 | imports: [HttpModule, AuthModule], 9 | controllers: [ApiVideoController], 10 | providers: [ApiVideoService], 11 | exports: [ApiVideoService], 12 | }) 13 | export class ApiVideoModule {} 14 | -------------------------------------------------------------------------------- /apps/api/src/module/workspace/dto/files/update-member-permissions.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsBoolean, IsIn } from 'class-validator'; 2 | import { IsId } from '../../validators/id.validator'; 3 | 4 | export class UpdateFileMemberPermissionsDto { 5 | @IsIn(['member', 'team']) 6 | permissionType: 'member' | 'team'; 7 | 8 | @IsId() 9 | id: string; // user or team id 10 | 11 | @IsIn(['screenshots', 'videos']) 12 | permissionItemType: 'screenshots' | 'videos'; 13 | 14 | @IsBoolean() 15 | write: boolean; 16 | 17 | @IsBoolean() 18 | read: boolean; 19 | } 20 | -------------------------------------------------------------------------------- /apps/extensions/images/panel/common/more_horiz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/extensions/src/app/services/helpers/iDataResponseParser.ts: -------------------------------------------------------------------------------- 1 | import { IDataResponse, ResStatusEnum } from '@/app/interfaces/IDataResponse'; 2 | import { errorHandler } from '@/app/services/helpers/errors'; 3 | 4 | export const iDataResponseParser = ( 5 | response: IDataResponse, 6 | showNotification = true, 7 | ): null | typeof response.data => { 8 | if (response.status === ResStatusEnum.error) { 9 | window && showNotification && errorHandler(response); 10 | return null; 11 | } else { 12 | return response.data as T; 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /apps/extensions/src/content/panel/screens/singleImageScreen/imageActions/ImageActionsCard.tsx: -------------------------------------------------------------------------------- 1 | import classNames from 'classnames'; 2 | 3 | 4 | const ImageActionsCard: React.FC<{ className?: string }> = ({ 5 | children, 6 | className = '', 7 | }) => { 8 | return ( 9 |
15 | {children} 16 |
17 | ); 18 | }; 19 | 20 | export default ImageActionsCard; 21 | -------------------------------------------------------------------------------- /apps/portal/public/item/video-item.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | --------------------------------------------------------------------------------