* 'main' of https://freeleaps.com:3443/products/freeleaps:
  fix the import path in utils
  use '@' for all import
  add websocket framework

# Conflicts:
#	frontend/src/pages/user/requests/Home.vue
This commit is contained in:
min.jiang 2024-06-23 01:21:53 +08:00
commit 97709a8e50
44 changed files with 168 additions and 154 deletions

2
env.sh
View File

@ -1,4 +1,4 @@
INT_DIR="../freeleaps-int/sites/freeleaps/deploy" INT_DIR="@/freeleaps-int/sites/freeleaps/deploy"
DEPLOY_DIR="deploy" DEPLOY_DIR="deploy"
FE_ENV="$DEPLOY_DIR/.fe.env" FE_ENV="$DEPLOY_DIR/.fe.env"
if [ -d "$INT_DIR" ]; then if [ -d "$INT_DIR" ]; then

View File

@ -86,7 +86,7 @@
</div> </div>
</template> </template>
<script> <script>
import { UserAuthApi } from '../utils/backend/index' import { UserAuthApi } from '@/utils/backend/index'
export default { export default {
name: 'HeaderGuest', name: 'HeaderGuest',

View File

@ -1,4 +1,4 @@
import { userRoleEnum } from '../types/index' import { userRoleEnum } from '@/types/index'
export default { export default {
methods: { methods: {
//public //public

View File

@ -1,4 +1,4 @@
import { signinActionEnum } from '../types/index' import { signinActionEnum } from '@/types/index'
export default { export default {
methods: { methods: {
mnx_userSignedin(authResposne, keepMeSignedin) { mnx_userSignedin(authResposne, keepMeSignedin) {

View File

@ -36,8 +36,8 @@ import {
UserAuthApi, UserAuthApi,
applicantValidator applicantValidator
// userProfileValidator, // userProfileValidator,
} from '../../utils/index' } from '@/utils/index'
import { signinActionEnum } from '../../types/index' import { signinActionEnum } from '@/types/index'
export default { export default {
name: 'FrontDoor', name: 'FrontDoor',

View File

@ -24,8 +24,8 @@
</template> </template>
<script> <script>
import { UserAuthApi } from '../../utils/index' import { UserAuthApi } from '@/utils/index'
import { signinActionEnum } from '../../types/index' import { signinActionEnum } from '@/types/index'
export default { export default {
name: 'NewUserSetFlid', name: 'NewUserSetFlid',
props: { props: {

View File

@ -38,7 +38,7 @@
</template> </template>
<script> <script>
import { UserAuthApi, passwordValidator } from '../../utils/index' import { UserAuthApi, passwordValidator } from '@/utils/index'
export default { export default {
name: 'NewUserSetPassword', name: 'NewUserSetPassword',
props: {}, props: {},

View File

@ -24,8 +24,8 @@
</template> </template>
<script> <script>
import { signinActionEnum } from '../../types' import { signinActionEnum } from '@/types'
import { UserAuthApi } from '../../utils/index' import { UserAuthApi } from '@/utils/index'
export default { export default {
name: 'SigninWithEmailAndCode', name: 'SigninWithEmailAndCode',
props: { props: {

View File

@ -30,8 +30,8 @@
</template> </template>
<script> <script>
import { signinActionEnum } from '../../types' import { signinActionEnum } from '@/types'
import { UserAuthApi } from '../../utils/index' import { UserAuthApi } from '@/utils/index'
export default { export default {
name: 'SigninWithEmailAndCode', name: 'SigninWithEmailAndCode',
props: { props: {

View File

@ -5,7 +5,7 @@
</div> </div>
</template> </template>
<script> <script>
import { LabApi } from '../../../utils/index' import { LabApi } from '@/utils/index'
export default { export default {
name: 'TranslationHome', name: 'TranslationHome',
components: {}, components: {},

View File

@ -13,7 +13,7 @@
</div> </div>
</template> </template>
<script> <script>
import { ContentApi } from '../../utils/index' import { ContentApi } from '@/utils/index'
export default { export default {
name: 'About', name: 'About',
components: {}, components: {},

View File

@ -13,7 +13,7 @@
</div> </div>
</template> </template>
<script> <script>
import { ContentApi } from '../../utils/index' import { ContentApi } from '@/utils/index'
export default { export default {
name: 'Blogs', name: 'Blogs',
components: {}, components: {},

View File

@ -18,7 +18,7 @@
</div> </div>
</template> </template>
<script> <script>
import { ContentApi } from '../../utils/index' import { ContentApi } from '@/utils/index'
export default { export default {
name: 'Career', name: 'Career',
components: {}, components: {},

View File

@ -7,7 +7,7 @@
</div> </div>
</template> </template>
<script> <script>
import { ContentApi } from '../../utils/index' import { ContentApi } from '@/utils/index'
export default { export default {
name: 'Contact', name: 'Contact',
components: {}, components: {},

View File

@ -4,9 +4,6 @@
</div> </div>
</template> </template>
<script> <script>
// import { pdfjsLib } from '../../plugins/index'
// import { ContentApi } from '../../utils/index'
// import { Buffer } from 'buffer'
import { ContentApi } from '@/utils/index' import { ContentApi } from '@/utils/index'
import PDFReader from '@/components/PDFReader.vue' import PDFReader from '@/components/PDFReader.vue'
export default { export default {

View File

@ -8,7 +8,7 @@
import { import {
UserProfileApi UserProfileApi
// userProfileValidator, // userProfileValidator,
} from '../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'UserFinance', name: 'UserFinance',
props: {}, props: {},

View File

@ -5,7 +5,7 @@
</template> </template>
<script> <script>
import { HistoryApi } from '../../../utils/index' import { HistoryApi } from '@/utils/index'
export default { export default {
name: 'UserHistory', name: 'UserHistory',
props: {}, props: {},

View File

@ -710,14 +710,9 @@
<script> <script>
import SvgIcon from '@/components/SvgIcon.vue' import SvgIcon from '@/components/SvgIcon.vue'
import { moneyCollectionTypeEnum } from '../../../types/index' import { moneyCollectionTypeEnum } from '@/types/index'
import { import { UserProfileApi, elementHandler, textAreaAujuster, passwordValidator } from '@/utils/index'
UserProfileApi,
elementHandler,
textAreaAujuster,
passwordValidator
} from '../../../utils/index'
import FreeleapsEditor from '@/components/FreeleapsEditor.vue' import FreeleapsEditor from '@/components/FreeleapsEditor.vue'
export default { export default {

View File

@ -8,7 +8,7 @@
import { import {
UserProfileApi UserProfileApi
// userProfileValidator, // userProfileValidator,
} from '../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'UserSubscription', name: 'UserSubscription',
props: {}, props: {},

View File

@ -78,8 +78,8 @@
</div> </div>
</template> </template>
<script> <script>
import SvgIcon from '../../../components/SvgIcon.vue' import SvgIcon from '@/components/SvgIcon.vue'
import { MessageHubApi, DateUtils } from '../../../utils/index' import { MessageHubApi, DateUtils } from '@/utils/index'
export default { export default {
components: { SvgIcon }, components: { SvgIcon },
name: 'MessageHub', name: 'MessageHub',

View File

@ -266,7 +266,7 @@
import { import {
ProviderHubApi ProviderHubApi
// userProfileValidator, // userProfileValidator,
} from '../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'ProviderHub', name: 'ProviderHub',
props: {}, props: {},

View File

@ -75,12 +75,12 @@
Propose Propose
</button> </button>
<div class="request-description-content" v-html="request.content"></div> <div class="request-description-content" v-html="request.content"></div>
<div class="preview-btn-container" v-for="(file, index) in request.attached_files" :key="index"> <div v-for="(file, index) in request.attached_files" :key="index">
<button class="btn btn-link" data-bs-toggle="modal" data-bs-target="#previewModal" :data-bs-file="file.file_name" :data-bs-rid="request.id" :data-bs-did="file.document_id"> <button @click="previewAttachedFile(request.id, file.document_id)">
Preview {{ file.file_name }} Preview{{ file.file_name }}
</button> </button>
<button class="btn btn-link" @click="downloadAttachedFile(request.id, file.document_id)"> <button @click="downloadAttachedFile(request.id, file.document_id)">
Download {{ file.file_name }} Download{{ file.file_name }}
</button> </button>
</div> </div>
</div> </div>
@ -177,56 +177,24 @@
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="previewModal" ref="previewModal" aria-labelledby="previewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="previewModalLabel">{{previewModal.filename}}</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<PDFReader :doc="previewModal.doc" />
</div>
</div>
</div>
</div>
</template> </template>
<script> <script>
import { RequestHubApi, WorksapceApi, DateUtils, requestHubUtils } from '../../../utils/index' import { RequestHubApi, WorksapceApi, DateUtils, requestHubUtils } from '@/utils/index'
import { proposingModelEnum } from '../../../types/index' import { proposingModelEnum } from '@/types/index'
import PDFReader from '@/components/PDFReader.vue'
export default { export default {
name: 'RequestHub', name: 'RequestHub',
props: {}, props: {},
mounted() { mounted() {
this.fetchRequests() this.fetchRequests()
this.$refs.previewModal.addEventListener('shown.bs.modal', event => {
const relatedTarget = event.relatedTarget
const filename = relatedTarget.getAttribute('data-bs-file')
this.previewModal = { filename }
const requestId = relatedTarget.getAttribute('data-bs-rid')
const documentId = relatedTarget.getAttribute('data-bs-did')
WorksapceApi.fetchAttachedFileAsMediaData(requestId, documentId)
.then((response) => {
this.previewModal.doc = {url: response.data}
})
.catch((error) => {
this.mnx_backendErrorHandler(error)
})
})
this.$refs.previewModal.addEventListener('hidden.bs.modal', () => {
this.previewModal = {}
})
}, },
data() { data() {
return { return {
requestGroups: [], requestGroups: [],
message: null, message: null
previewModal: {}
} }
}, },
components: { PDFReader },
methods: { methods: {
fetchRequests() { fetchRequests() {
RequestHubApi.fetchRequestForHub() RequestHubApi.fetchRequestForHub()
@ -244,6 +212,18 @@ export default {
getDateFromFulltimeString(fulltime) { getDateFromFulltimeString(fulltime) {
return DateUtils.FromJsonToDateString(fulltime) return DateUtils.FromJsonToDateString(fulltime)
}, },
previewAttachedFile(request_id, document_id) {
// !!! SHOULD NOT use PdfContentViewer which is designed for unlogged in users.
// !!! Instead, should have a dedicated pdf viewer which should follow the figma design.
// WorksapceApi.fetchAttachedFileAsMediaData(request_id, document_id)
// .then((response) => {
// let media_data = response.data
// console.log(media_data)
// })
// .catch((error) => {
// this.mnx_backendErrorHandler(error)
// })
},
downloadAttachedFile(request_id, document_id) { downloadAttachedFile(request_id, document_id) {
WorksapceApi.fetchAttachedFileAsDownload(request_id, document_id) WorksapceApi.fetchAttachedFileAsDownload(request_id, document_id)
.then((response) => { .then((response) => {
@ -431,15 +411,4 @@ export default {
@extend .text-start; @extend .text-start;
font-weight: bold; font-weight: bold;
} }
.preview-btn-container {
display: flex;
text-align: left;
.btn-link {
font-weight: bold;
margin-right: 15px;
text-decoration: underline;
}
}
</style> </style>

View File

@ -15,7 +15,7 @@
import { import {
UserProfileApi UserProfileApi
// userProfileValidator, // userProfileValidator,
} from '../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'ProposalSubmitted', name: 'ProposalSubmitted',
props: { props: {

View File

@ -291,14 +291,14 @@
</template> </template>
<script> <script>
import { requestHubUtils, RequestHubApi } from '../../../utils/index' import { requestHubUtils, RequestHubApi } from '@/utils/index'
import { import {
proposingModelEnum, proposingModelEnum,
preparedProposal, preparedProposal,
preparedProposalStage, preparedProposalStage,
preparedProposalSummary, preparedProposalSummary,
proposalUtils proposalUtils
} from '../../../types/index' } from '@/types/index'
import SvgIcon from '@/components/SvgIcon.vue' import SvgIcon from '@/components/SvgIcon.vue'
import FreeleapsEditor from '@/components/FreeleapsEditor.vue' import FreeleapsEditor from '@/components/FreeleapsEditor.vue'
export default { export default {

View File

@ -571,7 +571,13 @@
</template> </template>
<script> <script>
import { WorksapceApi, DateUtils, requestIssueUtils, requestHubUtils } from '../../../utils/index' import {
WorksapceApi,
DateUtils,
requestIssueUtils,
requestHubUtils,
WsConnectionFactory
} from '@/utils/index'
import { import {
projectStatusEnum, projectStatusEnum,
projectIssueStatusEnum, projectIssueStatusEnum,
@ -582,12 +588,13 @@ import {
milestoneStatusEnum, milestoneStatusEnum,
convertIntoToMilestoneStatus, convertIntoToMilestoneStatus,
convertIntoToProjectIssueStatus convertIntoToProjectIssueStatus
} from '../../../types/index' } from '@/types/index'
export default { export default {
name: 'Workspace', name: 'Workspace',
props: {}, props: {},
mounted() { mounted() {
this.fetchView() this.fetchView()
//this.connectWebSocket()
}, },
data() { data() {
return { return {
@ -598,7 +605,9 @@ export default {
qrCode: { qrCode: {
imageUrl: null, imageUrl: null,
index: null index: null
} },
downstream_web_socket: null
} }
}, },
@ -905,6 +914,27 @@ export default {
default: default:
return false return false
} }
},
/** web socket. we put them here for test purpose. they need to be moved to an appropriate place**/
websocketOnOpen(event) {
console.log(event)
},
websocketOnMessage(event) {
console.log(event.data)
},
websocketOnError(event) {
console.log(event)
},
websocketOnClose(event) {
console.log(event)
},
connectWebSocket() {
this.downstream_web_socket = WsConnectionFactory.CreateWebSocket(
this.websocketOnOpen,
this.websocketOnMessage,
this.websocketOnError,
this.websocketOnClose
)
} }
} }
} }

View File

@ -44,8 +44,8 @@
</template> </template>
<script> <script>
import { WorksapceApi, DateUtils } from '../../../../utils/index' import { WorksapceApi, DateUtils } from '@/utils/index'
import { projectStatusEnum, convertIntoToProjectStatus } from '../../../../types/index' import { projectStatusEnum, convertIntoToProjectStatus } from '@/types/index'
export default { export default {
name: 'MyWorkspaceProjects', name: 'MyWorkspaceProjects',
props: {}, props: {},

View File

@ -44,8 +44,8 @@
</template> </template>
<script> <script>
import { WorksapceApi, DateUtils } from '../../../../utils/index' import { WorksapceApi, DateUtils } from '@/utils/index'
import { projectStatusEnum, convertIntoToProjectStatus } from '../../../../types/index' import { projectStatusEnum, convertIntoToProjectStatus } from '@/types/index'
export default { export default {
name: 'MyWorkspaceProposal', name: 'MyWorkspaceProposal',
props: {}, props: {},

View File

@ -13,7 +13,7 @@
import { import {
UserProfileApi UserProfileApi
// requestHubUtils, // requestHubUtils,
} from '../../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'RquestIssueDeposit', name: 'RquestIssueDeposit',
props: { props: {

View File

@ -11,7 +11,7 @@
import { import {
UserProfileApi UserProfileApi
// userProfileValidator, // userProfileValidator,
} from '../../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'RquestIssueDeposited', name: 'RquestIssueDeposited',
props: { props: {

View File

@ -170,8 +170,8 @@
</template> </template>
<script> <script>
import { WorksapceApi, textAreaAujuster, requestIssueUtils } from '../../../../utils/index' import { WorksapceApi, textAreaAujuster, requestIssueUtils } from '@/utils/index'
import { requestIssuingModelEnum } from '../../../../types/index' import { requestIssuingModelEnum } from '@/types/index'
import FreeleapsEditor from '@/components/FreeleapsEditor.vue' import FreeleapsEditor from '@/components/FreeleapsEditor.vue'
import InputSelector from '@/components/InputSelector.vue' import InputSelector from '@/components/InputSelector.vue'
import SvgIcon from '@/components/SvgIcon.vue' import SvgIcon from '@/components/SvgIcon.vue'

View File

@ -15,7 +15,7 @@
import { import {
UserProfileApi UserProfileApi
// userProfileValidator, // userProfileValidator,
} from '../../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'RquestIssueSubmitted', name: 'RquestIssueSubmitted',
props: { props: {

View File

@ -44,8 +44,8 @@
</template> </template>
<script> <script>
import { WorksapceApi, DateUtils } from '../../../../utils/index' import { WorksapceApi, DateUtils } from '@/utils/index'
import { projectStatusEnum, convertIntoToProjectStatus } from '../../../../types/index' import { projectStatusEnum, convertIntoToProjectStatus } from '@/types/index'
export default { export default {
name: 'MyWorkspaceRequest', name: 'MyWorkspaceRequest',
props: {}, props: {},

View File

@ -88,8 +88,8 @@
</template> </template>
<script> <script>
import { WorksapceApi, requestIssueUtils, DateUtils } from '../../../../utils/index' import { WorksapceApi, requestIssueUtils, DateUtils } from '@/utils/index'
import { requestStatusEnum, convertIntoToRequestStatus } from '../../../../types/index' import { requestStatusEnum, convertIntoToRequestStatus } from '@/types/index'
export default { export default {
name: 'RequestManage', name: 'RequestManage',
props: { props: {

View File

@ -65,7 +65,7 @@
import { import {
WorksapceApi WorksapceApi
// userProfileValidator, // userProfileValidator,
} from '../../../../utils/index' } from '@/utils/index'
export default { export default {
name: 'ReviewProposalBeforeAccetance', name: 'ReviewProposalBeforeAccetance',
props: { props: {

View File

@ -2,70 +2,70 @@ import { createRouter, createWebHistory } from 'vue-router'
import { store, userRoleEnum } from '../store/index' import { store, userRoleEnum } from '../store/index'
//public //public
import About from '../../pages/public/About.vue' import About from '@/pages/public/About.vue'
import Blogs from '../../pages/public/Blogs.vue' import Blogs from '@/pages/public/Blogs.vue'
import Career from '../../pages/public/Career.vue' import Career from '@/pages/public/Career.vue'
import Contact from '../../pages/public/Contact.vue' import Contact from '@/pages/public/Contact.vue'
import PdfContentViewer from '../../pages/public/PdfContentViewer.vue' import PdfContentViewer from '@/pages/public/PdfContentViewer.vue'
import LinkContentViewer from '../../pages/public/LinkContentViewer.vue' import LinkContentViewer from '@/pages/public/LinkContentViewer.vue'
//guest //guest
import FrontDoor from '../../pages/guest/FrontDoor.vue' import FrontDoor from '@/pages/guest/FrontDoor.vue'
import SigninWithEmailAndCode from '../../pages/guest/SigninWithEmailAndCode.vue' import SigninWithEmailAndCode from '@/pages/guest/SigninWithEmailAndCode.vue'
import NewUserSetPassword from '../../pages/guest/NewUserSetPassword.vue' import NewUserSetPassword from '@/pages/guest/NewUserSetPassword.vue'
import NewUserSetFlid from '../../pages/guest/NewUserSetFlid.vue' import NewUserSetFlid from '@/pages/guest/NewUserSetFlid.vue'
import SigninWithEmailAndPassword from '../../pages/guest/SigninWithEmailAndPassword.vue' import SigninWithEmailAndPassword from '@/pages/guest/SigninWithEmailAndPassword.vue'
//Workspace projects //Workspace projects
import MyWorkspaceProjects from '../../pages/user/workspace/projectManage/Home.vue' import MyWorkspaceProjects from '@/pages/user/workspace/projectManage/Home.vue'
import ProjectManage from '../../pages/user/workspace/projectManage/ProjectManage.vue' import ProjectManage from '@/pages/user/workspace/projectManage/ProjectManage.vue'
import ProjectManageCode from '../../pages/user/workspace/projectManage/Code.vue' import ProjectManageCode from '@/pages/user/workspace/projectManage/Code.vue'
import ProjectManageDeploy from '../../pages/user/workspace/projectManage/Deploy.vue' import ProjectManageDeploy from '@/pages/user/workspace/projectManage/Deploy.vue'
import ProjectManageGeneral from '../../pages/user/workspace/projectManage/General.vue' import ProjectManageGeneral from '@/pages/user/workspace/projectManage/General.vue'
import ProjectManageIssues from '../../pages/user/workspace/projectManage/Issues.vue' import ProjectManageIssues from '@/pages/user/workspace/projectManage/Issues.vue'
import ProjectManageProduct from '../../pages/user/workspace/projectManage/Product.vue' import ProjectManageProduct from '@/pages/user/workspace/projectManage/Product.vue'
import ProjectManageProgress from '../../pages/user/workspace/projectManage/Progress.vue' import ProjectManageProgress from '@/pages/user/workspace/projectManage/Progress.vue'
//Workspace Requests //Workspace Requests
import MyWorkspaceRequests from '../../pages/user/workspace/requestManage/Home.vue' import MyWorkspaceRequests from '@/pages/user/workspace/requestManage/Home.vue'
/// Request Issue /// Request Issue
import IssueRequest from '../../pages/user/workspace/requestIssue/Issue.vue' import IssueRequest from '@/pages/user/workspace/requestIssue/Issue.vue'
import RequestSubmitted from '../../pages/user/workspace/requestIssue/Submitted.vue' import RequestSubmitted from '@/pages/user/workspace/requestIssue/Submitted.vue'
import RequestDeposit from '../../pages/user/workspace/requestIssue/Deposit.vue' import RequestDeposit from '@/pages/user/workspace/requestIssue/Deposit.vue'
import RequestDeposited from '../../pages/user/workspace/requestIssue/Deposited.vue' import RequestDeposited from '@/pages/user/workspace/requestIssue/Deposited.vue'
//Workspace Proposals //Workspace Proposals
import MyWorkspaceProposals from '../../pages/user/workspace/proposalManage/Home.vue' import MyWorkspaceProposals from '@/pages/user/workspace/proposalManage/Home.vue'
//Message Hub //Message Hub
import MessageHub from '../../pages/user/messages/Home.vue' import MessageHub from '@/pages/user/messages/Home.vue'
//Provider Hub //Provider Hub
import ProviderHub from '../../pages/user/providers/Home.vue' import ProviderHub from '@/pages/user/providers/Home.vue'
//Request Hub //Request Hub
import RequestHub from '../../pages/user/requests/Home.vue' import RequestHub from '@/pages/user/requests/Home.vue'
import MakeProposal from '../../pages/user/requests/Propose.vue' import MakeProposal from '@/pages/user/requests/Propose.vue'
import ProposalSubmitted from '../../pages/user/requests/ProposalSubmitted.vue' import ProposalSubmitted from '@/pages/user/requests/ProposalSubmitted.vue'
import RequestManage from '../../pages/user/workspace/requestManage/Manage.vue' import RequestManage from '@/pages/user/workspace/requestManage/Manage.vue'
import ReviewProposalBeforeAccetance from '../../pages/user/workspace/requestManage/ReviewProposal.vue' import ReviewProposalBeforeAccetance from '@/pages/user/workspace/requestManage/ReviewProposal.vue'
import UserProfile from '../../pages/user/account/UserProfile.vue' import UserProfile from '@/pages/user/account/UserProfile.vue'
import UserFinance from '../../pages/user/account/UserFinance.vue' import UserFinance from '@/pages/user/account/UserFinance.vue'
import UserHistory from '../../pages/user/account/UserHistory.vue' import UserHistory from '@/pages/user/account/UserHistory.vue'
import Workspace from '../../pages/user/workspace/Home.vue' import Workspace from '@/pages/user/workspace/Home.vue'
import FooterGuest from '../../footers/FooterGuest.vue' import FooterGuest from '@/footers/FooterGuest.vue'
import FooterUser from '../../footers/FooterUser.vue' import FooterUser from '@/footers/FooterUser.vue'
import HeaderGuest from '../../headers/HeaderGuest.vue' import HeaderGuest from '@/headers/HeaderGuest.vue'
import HeaderUser from '../../headers/HeaderUser.vue' import HeaderUser from '@/headers/HeaderUser.vue'
//Lab //Lab
import LabHome from '../../pages/lab/Home.vue' import LabHome from '@/pages/lab/Home.vue'
import TranslationHome from '../../pages/lab/translation/Home.vue' import TranslationHome from '@/pages/lab/translation/Home.vue'
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createWebHistory(),

View File

@ -1,4 +1,4 @@
import { userRoleEnum } from '../../types/index' import { userRoleEnum } from '@/types/index'
const userProfileStore = { const userProfileStore = {
namespaced: true, namespaced: true,

View File

@ -7,3 +7,4 @@ export { MessageHubApi } from './messageHub'
export { HistoryApi } from './history' export { HistoryApi } from './history'
export { ContentApi } from './content' export { ContentApi } from './content'
export { LabApi } from './lab' export { LabApi } from './lab'
export { WsConnectionFactory } from './websocket'

View File

@ -0,0 +1,14 @@
import { userUtils } from '../store/index'
class WsConnectionFactory {
static CreateWebSocket(onOpen, onMessage, onError, onClose) {
let jwt = userUtils.getJwtToken()
this.socket = new WebSocket(`/ws/downstream/online_platform_notification?token=${jwt}`)
this.socket.onopen = onOpen
this.socket.onmessage = onMessage
this.socket.onerror = onError
this.socket.onclose = onClose
}
}
export { WsConnectionFactory }

View File

@ -7,7 +7,8 @@ export {
MessageHubApi, MessageHubApi,
HistoryApi, HistoryApi,
ContentApi, ContentApi,
LabApi LabApi,
WsConnectionFactory
} from './backend/index' } from './backend/index'
export { userUtils, userProfileUtils, requestIssueUtils, requestHubUtils } from './store/index' export { userUtils, userProfileUtils, requestIssueUtils, requestHubUtils } from './store/index'

View File

@ -1,4 +1,4 @@
import { store } from '../../plugins/index' import { store } from '@/plugins/index'
class RequestHubUtils { class RequestHubUtils {
constructor(store) { constructor(store) {

View File

@ -1,4 +1,4 @@
import { store } from '../../plugins/index' import { store } from '@/plugins/index'
class RequestIssueUtils { class RequestIssueUtils {
constructor(store) { constructor(store) {

View File

@ -1,4 +1,4 @@
import { store } from '../../plugins/index' import { store } from '@/plugins/index'
class UserProfileUtils { class UserProfileUtils {
constructor(store) { constructor(store) {

View File

@ -1,4 +1,4 @@
import { store } from '../../plugins/index' import { store } from '@/plugins/index'
class UserUtils { class UserUtils {
constructor(store) { constructor(store) {

View File

@ -11,6 +11,7 @@ function resolve(dir) {
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => { export default defineConfig(({ command, mode }) => {
let API_URL = 'http://127.0.0.1:8001' let API_URL = 'http://127.0.0.1:8001'
let WEBSOCKET_URL = 'ws://127.0.0.1:8001'
let PORT = '5173' let PORT = '5173'
if (command === 'serve') { if (command === 'serve') {
@ -18,6 +19,7 @@ export default defineConfig(({ command, mode }) => {
console.log('loading environment variables from .env and .env.' + mode + ' under ' + process.cwd()) console.log('loading environment variables from .env and .env.' + mode + ' under ' + process.cwd())
const env = loadEnv(mode, process.cwd()); const env = loadEnv(mode, process.cwd());
API_URL = `${env.VITE_API_URL ?? 'http://127.0.0.1:8001'}`; API_URL = `${env.VITE_API_URL ?? 'http://127.0.0.1:8001'}`;
WEBSOCKET_URL = `${env.VITE_WEBSOCKET_URL ?? 'ws://127.0.0.1:8001'}`;
PORT = `${env.VITE_PORT ?? '5173'}`; PORT = `${env.VITE_PORT ?? '5173'}`;
} else { } else {
// command === 'build' // command === 'build'
@ -58,6 +60,11 @@ export default defineConfig(({ command, mode }) => {
target: API_URL, target: API_URL,
ws: true, ws: true,
changeOrigin: true changeOrigin: true
},
'^/ws/': {
target: WEBSOCKET_URL,
ws: true,
changeOrigin: true
} }
}, },
port: PORT, port: PORT,