diff --git a/.prettierrc b/.prettierrc index 65261d68..57a53a3e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,5 @@ { - "trailingComma": "es5", + "trailingComma": "none", "tabWidth": 2, "singleQuote": true } diff --git a/angular.json b/angular.json index 37ed647d..9ad4430a 100644 --- a/angular.json +++ b/angular.json @@ -41,6 +41,8 @@ "with": "projects/ucap-webmessenger-app/src/environments/environment-browser.dev.ts" } ], + "polyfills": "projects/ucap-webmessenger-app/src/polyfills-es5.ts", + "tsConfig": "projects/ucap-webmessenger-app/tsconfig-es5.app.json", "optimization": false, "outputHashing": "all", "sourceMap": true, @@ -70,6 +72,8 @@ "with": "projects/ucap-webmessenger-app/src/environments/environment-browser.prod.ts" } ], + "polyfills": "projects/ucap-webmessenger-app/src/polyfills-es5.ts", + "tsConfig": "projects/ucap-webmessenger-app/tsconfig-es5.app.json", "optimization": true, "outputHashing": "all", "sourceMap": false, @@ -82,7 +86,7 @@ "budgets": [ { "type": "initial", - "maximumWarning": "2mb", + "maximumWarning": "4mb", "maximumError": "5mb" }, { @@ -140,7 +144,7 @@ "budgets": [ { "type": "initial", - "maximumWarning": "2mb", + "maximumWarning": "4mb", "maximumError": "5mb" }, { @@ -155,7 +159,8 @@ "serve": { "builder": "@angular-builders/custom-webpack:dev-server", "options": { - "browserTarget": "ucap-webmessenger-app:build" + "browserTarget": "ucap-webmessenger-app:build", + "disableHostCheck": true }, "configurations": { "browser-development": { @@ -354,6 +359,40 @@ } } }, + "ucap-webmessenger-api-message": { + "projectType": "library", + "root": "projects/ucap-webmessenger-api-message", + "sourceRoot": "projects/ucap-webmessenger-api-message/src", + "prefix": "ucap-api-message", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/ucap-webmessenger-api-message/tsconfig.lib.json", + "project": "projects/ucap-webmessenger-api-message/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ucap-webmessenger-api-message/src/test.ts", + "tsConfig": "projects/ucap-webmessenger-api-message/tsconfig.spec.json", + "karmaConfig": "projects/ucap-webmessenger-api-message/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ucap-webmessenger-api-message/tsconfig.lib.json", + "projects/ucap-webmessenger-api-message/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**"] + } + } + } + }, + "ucap-webmessenger-api": { "projectType": "library", "root": "projects/ucap-webmessenger-api", diff --git a/config/angular.webpack.config.js b/config/angular.webpack.config.js index c7013ead..1e970c61 100644 --- a/config/angular.webpack.config.js +++ b/config/angular.webpack.config.js @@ -4,14 +4,12 @@ module.exports = (config, options) => { const PRODUCTION = process.env.NODE_ENV === 'production'; const BROWSER = process.env.UCAP_ENV_RUNTIME === 'BROWSER'; - console.log('BROWSER', BROWSER, config.target); - if (!BROWSER) { config.target = 'electron-renderer'; } else { config.target = 'web'; config.node = { - fs: 'empty' + fs: 'empty', }; } @@ -21,7 +19,7 @@ module.exports = (config, options) => { __dirname, '..', 'projects/ucap-webmessenger-ui/src/assets/scss' - ) + ), }; return config; diff --git a/config/enviroment.ts b/config/enviroment.ts index a1d8751a..d7219673 100644 --- a/config/enviroment.ts +++ b/config/enviroment.ts @@ -13,6 +13,6 @@ export function getEnviroments() { __DEV__: channel === 'development', 'process.platform': s(process.platform), 'process.env.NODE_ENV': s(process.env.NODE_ENV || 'development'), - 'process.env.TEST_ENV': s(process.env.TEST_ENV) + 'process.env.TEST_ENV': s(process.env.TEST_ENV), }; } diff --git a/config/main.webpack.config.ts b/config/main.webpack.config.ts index 961a2542..5759bf65 100644 --- a/config/main.webpack.config.ts +++ b/config/main.webpack.config.ts @@ -20,18 +20,18 @@ const mainConfig: webpack.Configuration = { __dirname, '..', 'electron-projects/ucap-webmessenger-electron/src/index' - ) + ), }, target: 'electron-main', mode: enviroments.__DEV__ ? 'development' : 'production', devtool: 'source-map', optimization: { - noEmitOnErrors: true + noEmitOnErrors: true, }, externals, output: { filename: '[name].js', - path: path.resolve(__dirname, '..', outputDir) + path: path.resolve(__dirname, '..', outputDir), }, module: { rules: [ @@ -44,7 +44,7 @@ const mainConfig: webpack.Configuration = { 'electron-projects/ucap-webmessenger-electron/src' ), path.resolve(__dirname, '..', 'electron-projects'), - path.resolve(__dirname, '..', 'projects') + path.resolve(__dirname, '..', 'projects'), ], use: [ { @@ -55,20 +55,20 @@ const mainConfig: webpack.Configuration = { __dirname, '..', 'electron-projects/ucap-webmessenger-electron/tsconfig.electron.json' - ) - } - } + ), + }, + }, ], - exclude: /node_modules/ + exclude: /node_modules/, }, { test: /\.node$/, loader: 'awesome-node-loader', options: { - name: '[name].[ext]' - } - } - ] + name: '[name].[ext]', + }, + }, + ], }, plugins: [ new CleanWebpackPlugin({ verbose: false }), @@ -77,16 +77,16 @@ const mainConfig: webpack.Configuration = { new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.DefinePlugin( Object.assign({}, enviroments, { - __PROCESS_KIND__: JSON.stringify('main') + __PROCESS_KIND__: JSON.stringify('main'), }) ), new CopyWebpackPlugin([ { from: 'ucap-webmessenger-electron/resources/**/*', to: path.resolve(__dirname, '..', 'dist'), - context: 'electron-projects' - } - ]) + context: 'electron-projects', + }, + ]), ], resolve: { extensions: ['.js', '.ts'], @@ -101,6 +101,11 @@ const mainConfig: webpack.Configuration = { '..', 'electron-projects/ucap-webmessenger-electron-notification/src/public-api' ), + '@ucap-webmessenger/core': path.resolve( + __dirname, + '..', + 'projects/ucap-webmessenger-core/src/public-api' + ), '@ucap-webmessenger/native': path.resolve( __dirname, '..', @@ -115,14 +120,14 @@ const mainConfig: webpack.Configuration = { __dirname, '..', 'electron-projects/ucap-webmessenger-electron/src/public-api' - ) + ), }, - modules: [path.resolve(__dirname, '..', 'node_modules/')] + modules: [path.resolve(__dirname, '..', 'node_modules/')], }, node: { __dirname: false, - __filename: false - } + __filename: false, + }, }; export default [mainConfig]; diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..29789cd5 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3.1' + +services: + nginx: + image: nginx:1.17.5-alpine + volumes: + - ../dist/ucap-webmessenger-app:/usr/share/nginx/html:ro + ports: + - 8099:80 diff --git a/electron-projects/ucap-webmessenger-electron/resources/image/ico_64_64.png b/electron-projects/ucap-webmessenger-electron/resources/image/ico_64_64.png index adbc1dd4..382110d2 100644 Binary files a/electron-projects/ucap-webmessenger-electron/resources/image/ico_64_64.png and b/electron-projects/ucap-webmessenger-electron/resources/image/ico_64_64.png differ diff --git a/electron-projects/ucap-webmessenger-electron/src/index.ts b/electron-projects/ucap-webmessenger-electron/src/index.ts index 3e6f4e12..c0edd838 100644 --- a/electron-projects/ucap-webmessenger-electron/src/index.ts +++ b/electron-projects/ucap-webmessenger-electron/src/index.ts @@ -241,8 +241,9 @@ ipcMain.on( try { const buffer: Buffer = args[0]; const fileName: string = args[1]; + const mimeType: string = args[2]; let savePath: string = path.join( - !!args[2] ? args[2] : DefaultFolder.downloads(), + !!args[3] ? args[3] : DefaultFolder.downloads(), fileName ); savePath = await FileUtil.uniqueFileName(savePath); diff --git a/electron-projects/ucap-webmessenger-electron/tsconfig.electron.json b/electron-projects/ucap-webmessenger-electron/tsconfig.electron.json index 0eec2f0f..d01f9dcd 100644 --- a/electron-projects/ucap-webmessenger-electron/tsconfig.electron.json +++ b/electron-projects/ucap-webmessenger-electron/tsconfig.electron.json @@ -19,6 +19,9 @@ "@ucap-webmessenger/electron-notification": [ "../ucap-webmessenger-electron-notification/src/public-api" ], + "@ucap-webmessenger/core": [ + "../../projects/ucap-webmessenger-core/src/public-api" + ], "@ucap-webmessenger/native": [ "../../projects/ucap-webmessenger-native/src/public-api" ], diff --git a/package-lock.json b/package-lock.json index 53a09073..c7ce56cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2789,6 +2789,15 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "angular-split": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/angular-split/-/angular-split-3.0.2.tgz", + "integrity": "sha512-km59k1kEgVlplo2t4t5Ob43Vx16qVXWXsl5gbsdQtqrOW7341So4CFUmCjcZgfk1swu9RBaCdSQEqzNWOe/89w==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "ansi-align": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", @@ -4184,6 +4193,12 @@ } } }, + "classlist.js": { + "version": "1.1.20150312", + "resolved": "https://registry.npmjs.org/classlist.js/-/classlist.js-1.1.20150312.tgz", + "integrity": "sha1-HXCEL3Ai8I2awIbOaeWyUPLFd4k=", + "dev": true + }, "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", @@ -15387,6 +15402,12 @@ "minimalistic-assert": "^1.0.0" } }, + "web-animations-js": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==", + "dev": true + }, "webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", diff --git a/package.json b/package.json index e1df8b40..fa3f0254 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "start:main": "wait-on http-get://localhost:4200/ && npm run build:main:development && electron --nolazy --inspect-brk=9229 .", "start:renderer": "cross-env UCAP_ENV_RUNTIME=ELECTRON ng serve -c renderer-development", "start:browser": "cross-env UCAP_ENV_RUNTIME=BROWSER ng serve -c browser-development -o", + "build": "npm-run-all -p build:renderer build:main:production", "build:renderer": "cross-env NODE_ENV=production ng build --base-href ./", + "build:browser": "cross-env UCAP_ENV_RUNTIME=BROWSER ng build -c browser-development", "build:main:development": "cross-env NODE_ENV=development TS_NODE_PROJECT='./config/tsconfig.webpack.json' parallel-webpack --config=config/main.webpack.config.ts", "build:main:production": "cross-env NODE_ENV=production TS_NODE_PROJECT='./config/tsconfig.webpack.json' NODE_OPTIONS='--max_old_space_size=4096' parallel-webpack --config=config/main.webpack.config.ts", "test": "ng test", @@ -59,8 +61,10 @@ "@types/webpack": "^4.39.5", "@types/webpack-merge": "^4.1.5", "@types/webpack-node-externals": "^1.6.3", + "angular-split": "^3.0.2", "awesome-node-loader": "^1.1.1", "awesome-typescript-loader": "^5.2.1", + "classlist.js": "^1.1.20150312", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^5.0.4", "codelyzer": "^5.0.0", @@ -106,6 +110,7 @@ "tslint": "~5.15.0", "typescript": "~3.5.3", "wait-on": "^3.3.0", + "web-animations-js": "^2.3.2", "webpack": "4.39.2", "webpack-cli": "^3.3.7", "webpack-node-externals": "^1.7.2", diff --git a/projects/ucap-webmessenger-api-common/src/lib/config/module-config.ts b/projects/ucap-webmessenger-api-common/src/lib/config/module-config.ts new file mode 100644 index 00000000..c51a89c0 --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/config/module-config.ts @@ -0,0 +1,7 @@ +import { ModuleConfig as CoreModuleConfig } from '@ucap-webmessenger/core'; + +import { Urls } from './urls'; + +export interface ModuleConfig extends CoreModuleConfig { + acceptableFileExtensions: string[]; +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/types/token.ts b/projects/ucap-webmessenger-api-common/src/lib/config/token.ts similarity index 100% rename from projects/ucap-webmessenger-api-common/src/lib/types/token.ts rename to projects/ucap-webmessenger-api-common/src/lib/config/token.ts diff --git a/projects/ucap-webmessenger-api-common/src/lib/config/urls.ts b/projects/ucap-webmessenger-api-common/src/lib/config/urls.ts new file mode 100644 index 00000000..2fc7cb2f --- /dev/null +++ b/projects/ucap-webmessenger-api-common/src/lib/config/urls.ts @@ -0,0 +1,12 @@ +export interface Urls { + fileProfileSave: string; + fileTalkDownload: string; + fileTalkSave: string; + fileTalkShare: string; + massTalkDownload: string; + massTalkSave: string; + transMassTalkDownload: string; + transMassTalkSave: string; + translationReq: string; + translationSave: string; +} diff --git a/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts index 4ec66383..ba8e48b6 100644 --- a/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts +++ b/projects/ucap-webmessenger-api-common/src/lib/services/common-api.service.ts @@ -3,82 +3,92 @@ import { HttpClient, HttpEventType, HttpResponse, - HttpRequest + HttpRequest, } from '@angular/common/http'; import { Observable, Subject } from 'rxjs'; import { map, filter } from 'rxjs/operators'; -import { _MODULE_CONFIG } from '../types/token'; -import { ModuleConfig } from '../types/module-config'; import { FileProfileSaveRequest, FileProfileSaveResponse, encodeFileProfileSave, - decodeFileProfileSave + decodeFileProfileSave, } from '../apis/file-profile-save'; import { FileTalkDownloadRequest, encodeFileTalkDownload, - encodeFormDataFileTalkDownload + encodeFormDataFileTalkDownload, } from '../apis/file-talk-download'; import { FileTalkSaveRequest, FileTalkSaveResponse, encodeFileTalkSave, - decodeFileTalkSave + decodeFileTalkSave, } from '../apis/file-talk-save'; import { FileTalkShareRequest, FileTalkShareResponse, encodeFileTalkShare, - decodeFileTalkShare + decodeFileTalkShare, } from '../apis/file-talk-share'; import { MassTalkDownloadRequest, MassTalkDownloadResponse, encodeMassTalkDownload, - decodeMassTalkDownload + decodeMassTalkDownload, } from '../apis/mass-talk-download'; import { MassTalkSaveRequest, MassTalkSaveResponse, encodeMassTalkSave, - decodeMassTalkSave + decodeMassTalkSave, } from '../apis/mass-talk-save'; import { TransMassTalkDownloadRequest, TransMassTalkDownloadResponse, encodeTransMassTalkDownload, - decodeTransMassTalkDownload + decodeTransMassTalkDownload, } from '../apis/trans-mass-talk-download'; import { TransMassTalkSaveRequest, TransMassTalkSaveResponse, encodeTransMassTalkSave, - decodeTransMassTalkSave + decodeTransMassTalkSave, } from '../apis/trans-mass-talk-save'; import { TranslationReqRequest, TranslationReqResponse, encodeTranslationReq, - decodeTranslationReq + decodeTranslationReq, } from '../apis/translation-req'; import { TranslationSaveRequest, TranslationSaveResponse, encodeTranslationSave, - decodeTranslationSave + decodeTranslationSave, } from '../apis/translation-save'; +import { _MODULE_CONFIG } from '../config/token'; +import { ModuleConfig } from '../config/module-config'; +import { Urls } from '../config/urls'; +import { UrlConfig } from '@ucap-webmessenger/core'; + @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class CommonApiService { + readonly urls: Urls; + constructor( @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, private httpClient: HttpClient - ) {} + ) { + this.urls = UrlConfig.getUrls( + this.moduleConfig.hostConfig, + this.moduleConfig.urls + ); + } public fileProfileSave( req: FileProfileSaveRequest, @@ -86,12 +96,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - !!fileProfileSaveUrl - ? fileProfileSaveUrl - : this.moduleConfig.urls.fileProfileSave, + !!fileProfileSaveUrl ? fileProfileSaveUrl : this.urls.fileProfileSave, {}, { - params: encodeFileProfileSave(req) + params: encodeFileProfileSave(req), } ) .pipe(map(res => decodeFileProfileSave(res))); @@ -103,12 +111,10 @@ export class CommonApiService { ): string { const httpReq = new HttpRequest( 'GET', - !!fileTalkDownloadUrl - ? fileTalkDownloadUrl - : this.moduleConfig.urls.fileTalkDownload, + !!fileTalkDownloadUrl ? fileTalkDownloadUrl : this.urls.fileTalkDownload, {}, { - params: encodeFileTalkDownload(req) + params: encodeFileTalkDownload(req), } ); @@ -121,9 +127,7 @@ export class CommonApiService { ): Observable { const httpReq = new HttpRequest( 'POST', - !!fileTalkDownloadUrl - ? fileTalkDownloadUrl - : this.moduleConfig.urls.fileTalkDownload, + !!fileTalkDownloadUrl ? fileTalkDownloadUrl : this.urls.fileTalkDownload, encodeFormDataFileTalkDownload(req), { reportProgress: true, responseType: 'blob' } ); @@ -159,7 +163,7 @@ export class CommonApiService { ): Observable { const httpReq = new HttpRequest( 'POST', - !!fileTalkSaveUrl ? fileTalkSaveUrl : this.moduleConfig.urls.fileTalkSave, + !!fileTalkSaveUrl ? fileTalkSaveUrl : this.urls.fileTalkSave, encodeFileTalkSave(req), { reportProgress: true, responseType: 'text' as 'json' } ); @@ -185,7 +189,10 @@ export class CommonApiService { public acceptableExtensionForFileTalk(extensions: string[]): boolean { for (const extension of extensions) { if ( - -1 === this.moduleConfig.acceptableFileExtensions.indexOf(extension.toLowerCase()) + -1 === + this.moduleConfig.acceptableFileExtensions.indexOf( + extension.toLowerCase() + ) ) { return false; } @@ -198,10 +205,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.fileTalkShare, + this.urls.fileTalkShare, {}, { - params: encodeFileTalkShare(req) + params: encodeFileTalkShare(req), } ) .pipe(map(res => decodeFileTalkShare(res))); @@ -212,11 +219,11 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.massTalkDownload, + this.urls.massTalkDownload, {}, { params: encodeMassTalkDownload(req), - responseType: 'text' as 'json' + responseType: 'text' as 'json', } ) .pipe(map(res => decodeMassTalkDownload(res))); @@ -227,11 +234,11 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.massTalkSave, + this.urls.massTalkSave, {}, { params: encodeMassTalkSave(req), - responseType: 'text' as 'json' + responseType: 'text' as 'json', } ) .pipe(map(res => decodeMassTalkSave(res))); @@ -242,10 +249,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.transMassTalkDownload, + this.urls.transMassTalkDownload, {}, { - params: encodeTransMassTalkDownload(req) + params: encodeTransMassTalkDownload(req), } ) .pipe(map(res => decodeTransMassTalkDownload(res))); @@ -256,10 +263,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.transMassTalkSave, + this.urls.transMassTalkSave, {}, { - params: encodeTransMassTalkSave(req) + params: encodeTransMassTalkSave(req), } ) .pipe(map(res => decodeTransMassTalkSave(res))); @@ -270,10 +277,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.translationReq, + this.urls.translationReq, {}, { - params: encodeTranslationReq(req) + params: encodeTranslationReq(req), } ) .pipe(map(res => decodeTranslationReq(res))); @@ -284,10 +291,10 @@ export class CommonApiService { ): Observable { return this.httpClient .post( - this.moduleConfig.urls.translationSave, + this.urls.translationSave, {}, { - params: encodeTranslationSave(req) + params: encodeTranslationSave(req), } ) .pipe(map(res => decodeTranslationSave(res))); diff --git a/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts deleted file mode 100644 index 8799fa4f..00000000 --- a/projects/ucap-webmessenger-api-common/src/lib/types/module-config.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface ModuleConfig { - urls: { - fileProfileSave: string; - fileTalkDownload: string; - fileTalkSave: string; - fileTalkShare: string; - massTalkDownload: string; - massTalkSave: string; - transMassTalkDownload: string; - transMassTalkSave: string; - translationReq: string; - translationSave: string; - }; - acceptableFileExtensions: string[]; -} diff --git a/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts b/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts index 3e3baffb..2292850f 100644 --- a/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts +++ b/projects/ucap-webmessenger-api-common/src/lib/ucap-common-api.module.ts @@ -1,15 +1,16 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; -import { _MODULE_CONFIG } from './types/token'; import { CommonApiService } from './services/common-api.service'; -import { ModuleConfig } from './types/module-config'; + +import { _MODULE_CONFIG } from './config/token'; +import { ModuleConfig } from './config/module-config'; const SERVICES = [CommonApiService]; @NgModule({ declarations: [], imports: [], - exports: [] + exports: [], }) export class UCapCommonApiModule { public static forRoot( @@ -17,7 +18,7 @@ export class UCapCommonApiModule { ): ModuleWithProviders { return { ngModule: UCapCommonApiModule, - providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES], }; } } diff --git a/projects/ucap-webmessenger-api-common/src/public-api.ts b/projects/ucap-webmessenger-api-common/src/public-api.ts index 0a47d28d..82e0038c 100644 --- a/projects/ucap-webmessenger-api-common/src/public-api.ts +++ b/projects/ucap-webmessenger-api-common/src/public-api.ts @@ -2,8 +2,6 @@ * Public API Surface of ucap-webmessenger-api-common */ -export * from './lib/types/module-config'; - export * from './lib/apis/file-profile-save'; export * from './lib/apis/file-talk-download'; export * from './lib/apis/file-talk-save'; @@ -21,3 +19,6 @@ export * from './lib/models/file-upload-item'; export * from './lib/services/common-api.service'; export * from './lib/ucap-common-api.module'; + +export * from './lib/config/urls'; +export * from './lib/config/module-config'; diff --git a/projects/ucap-webmessenger-api-external/src/lib/config/module-config.ts b/projects/ucap-webmessenger-api-external/src/lib/config/module-config.ts new file mode 100644 index 00000000..8e49cd75 --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/config/module-config.ts @@ -0,0 +1,5 @@ +import { ModuleConfig as CoreModuleConfig } from '@ucap-webmessenger/core'; + +import { Urls } from './urls'; + +export interface ModuleConfig extends CoreModuleConfig {} diff --git a/projects/ucap-webmessenger-api-external/src/lib/types/token.ts b/projects/ucap-webmessenger-api-external/src/lib/config/token.ts similarity index 100% rename from projects/ucap-webmessenger-api-external/src/lib/types/token.ts rename to projects/ucap-webmessenger-api-external/src/lib/config/token.ts diff --git a/projects/ucap-webmessenger-api-external/src/lib/config/urls.ts b/projects/ucap-webmessenger-api-external/src/lib/config/urls.ts new file mode 100644 index 00000000..1912b8cb --- /dev/null +++ b/projects/ucap-webmessenger-api-external/src/lib/config/urls.ts @@ -0,0 +1,6 @@ +export interface Urls { + checkUserInfoEx: string; + companyList: string; + tokenUpdate: string; + urlInfo: string; +} diff --git a/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts index a4730adf..5da6b027 100644 --- a/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts +++ b/projects/ucap-webmessenger-api-external/src/lib/services/external-api.service.ts @@ -4,51 +4,61 @@ import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { _MODULE_CONFIG } from '../types/token'; -import { ModuleConfig } from '../types/module-config'; import { CheckUserInfoExRequest, CheckUserInfoExResponse, encodeCheckUserInfoEx, - decodeCheckUserInfoEx + decodeCheckUserInfoEx, } from '../apis/check-user-info-ex'; import { CompanyListRequest, CompanyListResponse, encodeCompanyList, - decodeCompanyList + decodeCompanyList, } from '../apis/company-list'; import { TokenUpdateRequest, TokenUpdateResponse, encodeTokenUpdate, - decodeTokenUpdate + decodeTokenUpdate, } from '../apis/token-update'; import { UrlInfoResponse, UrlInfoRequest, encodeUrlInfo, - decodeUrlInfo + decodeUrlInfo, } from '../apis/url-info'; +import { _MODULE_CONFIG } from '../config/token'; +import { ModuleConfig } from '../config/module-config'; +import { Urls } from '../config/urls'; +import { UrlConfig } from '@ucap-webmessenger/core'; + @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class ExternalApiService { + readonly urls: Urls; + constructor( @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, private httpClient: HttpClient - ) {} + ) { + this.urls = UrlConfig.getUrls( + this.moduleConfig.hostConfig, + this.moduleConfig.urls + ); + } public checkUserInfoEx( req: CheckUserInfoExRequest ): Observable { return this.httpClient .post( - this.moduleConfig.urls.checkUserInfoEx, + this.urls.checkUserInfoEx, {}, { - params: encodeCheckUserInfoEx(req) + params: encodeCheckUserInfoEx(req), } ) .pipe(map(res => decodeCheckUserInfoEx(res))); @@ -57,10 +67,10 @@ export class ExternalApiService { public companyList(req: CompanyListRequest): Observable { return this.httpClient .post( - this.moduleConfig.urls.companyList, + this.urls.companyList, {}, { - params: encodeCompanyList(req) + params: encodeCompanyList(req), } ) .pipe(map(res => decodeCompanyList(res))); @@ -69,10 +79,10 @@ export class ExternalApiService { public tokenUpdate(req: TokenUpdateRequest): Observable { return this.httpClient .post( - this.moduleConfig.urls.tokenUpdate, + this.urls.tokenUpdate, {}, { - params: encodeTokenUpdate(req) + params: encodeTokenUpdate(req), } ) .pipe(map(res => decodeTokenUpdate(res))); @@ -81,10 +91,10 @@ export class ExternalApiService { public urlInfo(req: UrlInfoRequest): Observable { return this.httpClient .post( - this.moduleConfig.urls.urlInfo, + this.urls.urlInfo, {}, { - params: encodeUrlInfo(req) + params: encodeUrlInfo(req), } ) .pipe(map(res => decodeUrlInfo(res))); diff --git a/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts deleted file mode 100644 index 91a494d8..00000000 --- a/projects/ucap-webmessenger-api-external/src/lib/types/module-config.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface ModuleConfig { - urls: { - checkUserInfoEx: string; - companyList: string; - tokenUpdate: string; - urlInfo: string; - }; -} diff --git a/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts b/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts index c21dada5..c6283c72 100644 --- a/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts +++ b/projects/ucap-webmessenger-api-external/src/lib/ucap-external-api.module.ts @@ -1,15 +1,16 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; -import { _MODULE_CONFIG } from './types/token'; import { ExternalApiService } from './services/external-api.service'; -import { ModuleConfig } from './types/module-config'; + +import { _MODULE_CONFIG } from './config/token'; +import { ModuleConfig } from './config/module-config'; const SERVICES = [ExternalApiService]; @NgModule({ declarations: [], imports: [], - exports: [] + exports: [], }) export class UCapExternalApiModule { public static forRoot( @@ -17,7 +18,7 @@ export class UCapExternalApiModule { ): ModuleWithProviders { return { ngModule: UCapExternalApiModule, - providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES], }; } } diff --git a/projects/ucap-webmessenger-api-external/src/public-api.ts b/projects/ucap-webmessenger-api-external/src/public-api.ts index b9a5d5ab..375f6493 100644 --- a/projects/ucap-webmessenger-api-external/src/public-api.ts +++ b/projects/ucap-webmessenger-api-external/src/public-api.ts @@ -2,8 +2,6 @@ * Public API Surface of ucap-webmessenger-api-public */ -export * from './lib/types/module-config'; - export * from './lib/models/company'; export * from './lib/apis/check-user-info-ex'; @@ -14,3 +12,6 @@ export * from './lib/apis/url-info'; export * from './lib/services/external-api.service'; export * from './lib/ucap-external-api.module'; + +export * from './lib/config/urls'; +export * from './lib/config/module-config'; diff --git a/projects/ucap-webmessenger-api-message/README.md b/projects/ucap-webmessenger-api-message/README.md new file mode 100644 index 00000000..8265c6ca --- /dev/null +++ b/projects/ucap-webmessenger-api-message/README.md @@ -0,0 +1,24 @@ +# UcapWebmessengerApiMessage + +This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.11. + +## Code scaffolding + +Run `ng generate component component-name --project ucap-webmessenger-api-message` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ucap-webmessenger-api-message`. +> Note: Don't forget to add `--project ucap-webmessenger-api-message` or else it will be added to the default project in your `angular.json` file. + +## Build + +Run `ng build ucap-webmessenger-api-message` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Publishing + +After building your library with `ng build ucap-webmessenger-api-message`, go to the dist folder `cd dist/ucap-webmessenger-api-message` and run `npm publish`. + +## Running unit tests + +Run `ng test ucap-webmessenger-api-message` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/projects/ucap-webmessenger-api-message/karma.conf.js b/projects/ucap-webmessenger-api-message/karma.conf.js new file mode 100644 index 00000000..30ab22f9 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ucap-webmessenger-api-message'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/projects/ucap-webmessenger-api-message/ng-package.json b/projects/ucap-webmessenger-api-message/ng-package.json new file mode 100644 index 00000000..7b43c75e --- /dev/null +++ b/projects/ucap-webmessenger-api-message/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ucap-webmessenger-api-message", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ucap-webmessenger-api-message/package.json b/projects/ucap-webmessenger-api-message/package.json new file mode 100644 index 00000000..2bc9d394 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/package.json @@ -0,0 +1,8 @@ +{ + "name": "@ucap-webmessenger/api-message", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^8.2.11", + "@angular/core": "^8.2.11" + } +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/apis/retrieve-send.ts b/projects/ucap-webmessenger-api-message/src/lib/apis/retrieve-send.ts new file mode 100644 index 00000000..7fec1638 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/apis/retrieve-send.ts @@ -0,0 +1,49 @@ +import { + APIRequest, + APIResponse, + APIEncoder, + APIDecoder, + ParameterUtil +} from '@ucap-webmessenger/api'; +import { DeviceType } from '@ucap-webmessenger/core'; +import { MessageType } from '../types/message.type'; +import { MessageList } from '../models/message-list'; + +export interface RetrieveRequest extends APIRequest { + userSeq: number; + deviceType: DeviceType; + tokenKey: string; + type: MessageType; + pageSize: number; + pageCount: number; +} + +export interface RetrieveSendResponse extends APIResponse { + responseCode: string; + responseMsg: string; + totalCount: number; + + messageList: MessageList[]; +} + +const RetrieveSendEncodeMap = {}; + +export const encodeRetrieve: APIEncoder = ( + req: RetrieveRequest +) => { + return ParameterUtil.encode(RetrieveSendEncodeMap, req); +}; + +export const decodeRetrieveSend: APIDecoder = ( + res: any +) => { + return { + statusCode: res.StatusCode, + errorMessage: res.ErrorMessage, + + responseCode: res.responseCode, + responseMsg: res.responseMsg, + totalCount: res.totalCount, + messageList: [] + } as RetrieveSendResponse; +}; diff --git a/projects/ucap-webmessenger-api-message/src/lib/config/module-config.ts b/projects/ucap-webmessenger-api-message/src/lib/config/module-config.ts new file mode 100644 index 00000000..8e49cd75 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/config/module-config.ts @@ -0,0 +1,5 @@ +import { ModuleConfig as CoreModuleConfig } from '@ucap-webmessenger/core'; + +import { Urls } from './urls'; + +export interface ModuleConfig extends CoreModuleConfig {} diff --git a/projects/ucap-webmessenger-api-message/src/lib/config/token.ts b/projects/ucap-webmessenger-api-message/src/lib/config/token.ts new file mode 100644 index 00000000..6cb383dd --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/config/token.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const _MODULE_CONFIG = new InjectionToken( + '@ucap-webmessenger/api-message config of module' +); diff --git a/projects/ucap-webmessenger-api-message/src/lib/config/urls.ts b/projects/ucap-webmessenger-api-message/src/lib/config/urls.ts new file mode 100644 index 00000000..e01d9548 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/config/urls.ts @@ -0,0 +1,47 @@ +export interface Urls { + /** 발신 메시지 list 조회 */ + retrieveSendMessageList: string; + /** 수신 메시지 list 조회 */ + retrieveRecvMessageList: string; + /** 예약 메시지 list 조회 */ + retrieveReservationMessageList: string; + /** 메시지 검색 list 조회 */ + retrieveSearchMessage: string; + + /** 메시지 발송 */ + sendNewMessage: string; + + /** 메시지 상세 정보 조회 */ + retrieveMessageDetail: string; + /** 메시지 읽음 */ + readMessage: string; + /** 읽음 확인 */ + retrieveReadCheck: string; + /** 발송 취소 */ + cancelMessage: string; + /** 예약 메시지 발송 취소 */ + cancelReservationMessage: string; + /** content Resource 파일 요청 */ + retrieveResourceFile: string; + + /** 메시지 삭제 */ + deleteMessage: string; + + /** My 메시지 등록 */ + saveMyMessage: string; + /** My 메시지 조회 */ + retrieveMyMessage: string; + /** My 메시지 삭제 */ + deleteMyMessage: string; + /** My 메시지 수정 */ + editMyMessage: string; + + /** 예약 메시지 수정 - 썸네일 기능 완료된 경우 */ + editReservationMessageEx: string; + + /** 메시지 전달 - 메시지 복사 후, 발송 */ + sendCopyMessage: string; + + /** 읽지 않은 메시지 개수 조회 */ + retrieveUnreadCount: string; +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/models/message-list.ts b/projects/ucap-webmessenger-api-message/src/lib/models/message-list.ts new file mode 100644 index 00000000..d5b05ca0 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/models/message-list.ts @@ -0,0 +1,30 @@ +import { MessageType } from '../types/message.type'; +import { CategoryType } from '../types/category.type'; +import { ContentType } from '../types/content.type'; + +export interface MessageList { + /** 메시지 ID */ + msgId: number; + /** 메시지 카테고리 */ + category: CategoryType; + /** 메시지 TITLE */ + title: string; + /** 메시지 제목 입력 여부 */ + titleYn: boolean; + /** 메시지 TYPE */ + type: MessageType; + /** 수신자의 시퀀스 */ + userSeq: number; + /** 수신자 */ + userName: string; + /** 수신자 수 */ + userCount: number; + /** 읽은 사람 수 */ + userReadCount: number; + /** 발신시간 */ + regDate: Date; + /** CONTENT 타입 */ + resType: ContentType; + /** 첨부파일 존재여부 */ + attachmentYn: boolean; +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.spec.ts b/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.spec.ts new file mode 100644 index 00000000..bf2baaeb --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.spec.ts @@ -0,0 +1,12 @@ +import { TestBed } from '@angular/core/testing'; + +import { MessageApiService } from './message-api.service'; + +describe('MessageApiService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: MessageApiService = TestBed.get(MessageApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.ts b/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.ts new file mode 100644 index 00000000..4771dfe8 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/services/message-api.service.ts @@ -0,0 +1,47 @@ +import { Injectable, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { _MODULE_CONFIG } from '../config/token'; +import { ModuleConfig } from '../config/module-config'; +import { UrlConfig } from '@ucap-webmessenger/core'; +import { Urls } from '../config/urls'; +import { + RetrieveRequest, + RetrieveSendResponse, + encodeRetrieve, + decodeRetrieveSend +} from '../apis/retrieve-send'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageApiService { + readonly urls: Urls; + + constructor( + @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, + private httpClient: HttpClient + ) { + this.urls = UrlConfig.getUrls( + this.moduleConfig.hostConfig, + this.moduleConfig.urls + ); + } + + public retrieveSendMessage( + req: RetrieveRequest + ): Observable { + return this.httpClient + .post( + this.urls.retrieveSendMessageList, + {}, + { + params: encodeRetrieve(req) + } + ) + .pipe(map(res => decodeRetrieveSend(res))); + } +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/types/category.type.ts b/projects/ucap-webmessenger-api-message/src/lib/types/category.type.ts new file mode 100644 index 00000000..02ab9f7c --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/types/category.type.ts @@ -0,0 +1,6 @@ +export enum CategoryType { + /** 일반 */ + General = 'G', + /** 공지 */ + Notice = 'N' +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/types/content.type.ts b/projects/ucap-webmessenger-api-message/src/lib/types/content.type.ts new file mode 100644 index 00000000..0bcf417a --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/types/content.type.ts @@ -0,0 +1,8 @@ +export enum ContentType { + /** 텍스트 */ + Text = 'T', + /** 이미지파일 */ + Image = 'F', + /** 첨부파일 */ + AttachFile = 'A' +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/types/message.type.ts b/projects/ucap-webmessenger-api-message/src/lib/types/message.type.ts new file mode 100644 index 00000000..89763903 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/types/message.type.ts @@ -0,0 +1,5 @@ +export enum MessageType { + Send = 'S', + Receive = 'R', + Reservation = 'B' +} diff --git a/projects/ucap-webmessenger-api-message/src/lib/ucap-message-api.module.ts b/projects/ucap-webmessenger-api-message/src/lib/ucap-message-api.module.ts new file mode 100644 index 00000000..601084a8 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/lib/ucap-message-api.module.ts @@ -0,0 +1,24 @@ +import { NgModule, ModuleWithProviders } from '@angular/core'; + +import { MessageApiService } from './services/message-api.service'; + +import { _MODULE_CONFIG } from './config/token'; +import { ModuleConfig } from './config/module-config'; + +const SERVICES = [MessageApiService]; + +@NgModule({ + declarations: [], + imports: [], + exports: [], +}) +export class UCapMessageApiModule { + public static forRoot( + config: ModuleConfig + ): ModuleWithProviders { + return { + ngModule: UCapMessageApiModule, + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES], + }; + } +} diff --git a/projects/ucap-webmessenger-api-message/src/public-api.ts b/projects/ucap-webmessenger-api-message/src/public-api.ts new file mode 100644 index 00000000..75b9cf44 --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/public-api.ts @@ -0,0 +1,17 @@ +/* + * Public API Surface of ucap-webmessenger-api-message + */ +export * from './lib/apis/retrieve-send'; + +export * from './lib/services/message-api.service'; + +export * from './lib/ucap-message-api.module'; + +export * from './lib/models/message-list'; + +export * from './lib/types/category.type'; +export * from './lib/types/content.type'; +export * from './lib/types/message.type'; + +export * from './lib/config/urls'; +export * from './lib/config/module-config'; diff --git a/projects/ucap-webmessenger-api-message/src/test.ts b/projects/ucap-webmessenger-api-message/src/test.ts new file mode 100644 index 00000000..978c64fb --- /dev/null +++ b/projects/ucap-webmessenger-api-message/src/test.ts @@ -0,0 +1,21 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/projects/ucap-webmessenger-api-message/tsconfig.lib.json b/projects/ucap-webmessenger-api-message/tsconfig.lib.json new file mode 100644 index 00000000..bd23948e --- /dev/null +++ b/projects/ucap-webmessenger-api-message/tsconfig.lib.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "declaration": true, + "inlineSources": true, + "types": [], + "lib": [ + "dom", + "es2018" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-message/tsconfig.spec.json b/projects/ucap-webmessenger-api-message/tsconfig.spec.json new file mode 100644 index 00000000..16da33db --- /dev/null +++ b/projects/ucap-webmessenger-api-message/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ucap-webmessenger-api-message/tslint.json b/projects/ucap-webmessenger-api-message/tslint.json new file mode 100644 index 00000000..75be226f --- /dev/null +++ b/projects/ucap-webmessenger-api-message/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "ucapApiMessage", + "camelCase" + ], + "component-selector": [ + true, + "element", + "ucap-api-message", + "kebab-case" + ] + } +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts b/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts index a4d08e08..4a1cfea9 100644 --- a/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts +++ b/projects/ucap-webmessenger-api-public/src/lib/apis/update-info.ts @@ -4,7 +4,7 @@ import { APIResponse, APIEncoder, APIDecoder, - ParameterUtil + ParameterUtil, } from '@ucap-webmessenger/api'; export interface UpdateInfoRequest extends APIRequest { @@ -19,7 +19,7 @@ export interface UpdateInfoResponse extends APIResponse { } const updateInfoEncodeMap = { - deviceType: 'p_device_type' + deviceType: 'p_device_type', }; export const encodeUpdateInfo: APIEncoder = ( @@ -35,6 +35,6 @@ export const decodeUpdateInfo: APIDecoder = (res: any) => { appVersion: res.AppVer, installUrl: res.InstallURL, launcherAppVersion: res.LauncherAppVer, - launcherInstallUrl: res.LauncherInstallURL + launcherInstallUrl: res.LauncherInstallURL, } as UpdateInfoResponse; }; diff --git a/projects/ucap-webmessenger-api-public/src/lib/config/module-config.ts b/projects/ucap-webmessenger-api-public/src/lib/config/module-config.ts new file mode 100644 index 00000000..8e49cd75 --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/config/module-config.ts @@ -0,0 +1,5 @@ +import { ModuleConfig as CoreModuleConfig } from '@ucap-webmessenger/core'; + +import { Urls } from './urls'; + +export interface ModuleConfig extends CoreModuleConfig {} diff --git a/projects/ucap-webmessenger-api-public/src/lib/types/token.ts b/projects/ucap-webmessenger-api-public/src/lib/config/token.ts similarity index 100% rename from projects/ucap-webmessenger-api-public/src/lib/types/token.ts rename to projects/ucap-webmessenger-api-public/src/lib/config/token.ts diff --git a/projects/ucap-webmessenger-api-public/src/lib/config/urls.ts b/projects/ucap-webmessenger-api-public/src/lib/config/urls.ts new file mode 100644 index 00000000..6a9da63f --- /dev/null +++ b/projects/ucap-webmessenger-api-public/src/lib/config/urls.ts @@ -0,0 +1,4 @@ +export interface Urls { + versionInfo2: string; + updateInfo: string; +} diff --git a/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts index d3dd1f98..739fdb6b 100644 --- a/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts +++ b/projects/ucap-webmessenger-api-public/src/lib/services/public-api.service.ts @@ -4,39 +4,49 @@ import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { _MODULE_CONFIG } from '../types/token'; import { VersionInfo2Request, VersionInfo2Response, encodeVersionInfo2, - decodeVersionInfo2 + decodeVersionInfo2, } from '../apis/version-info2'; import { UpdateInfoRequest, UpdateInfoResponse, encodeUpdateInfo, - decodeUpdateInfo + decodeUpdateInfo, } from '../apis/update-info'; -import { ModuleConfig } from '../types/module-config'; + +import { _MODULE_CONFIG } from '../config/token'; +import { ModuleConfig } from '../config/module-config'; +import { UrlConfig } from '@ucap-webmessenger/core'; +import { Urls } from '../config/urls'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export class PublicApiService { + readonly urls: Urls; + constructor( @Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig, private httpClient: HttpClient - ) {} + ) { + this.urls = UrlConfig.getUrls( + this.moduleConfig.hostConfig, + this.moduleConfig.urls + ); + } public versionInfo2( req: VersionInfo2Request ): Observable { return this.httpClient .post( - this.moduleConfig.urls.versionInfo2, + this.urls.versionInfo2, {}, { - params: encodeVersionInfo2(req) + params: encodeVersionInfo2(req), } ) .pipe(map((res: any) => decodeVersionInfo2(res))); @@ -45,10 +55,10 @@ export class PublicApiService { public updateInfo(req: UpdateInfoRequest): Observable { return this.httpClient .post( - this.moduleConfig.urls.updateInfo, + this.urls.updateInfo, {}, { - params: encodeUpdateInfo(req) + params: encodeUpdateInfo(req), } ) .pipe(map(res => decodeUpdateInfo(res))); diff --git a/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts b/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts deleted file mode 100644 index 3d90c146..00000000 --- a/projects/ucap-webmessenger-api-public/src/lib/types/module-config.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ModuleConfig { - urls: { - versionInfo2: string; - updateInfo: string; - }; -} diff --git a/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts b/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts index 3424d78f..cc929036 100644 --- a/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts +++ b/projects/ucap-webmessenger-api-public/src/lib/ucap-public-api.module.ts @@ -1,15 +1,16 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; -import { _MODULE_CONFIG } from './types/token'; import { PublicApiService } from './services/public-api.service'; -import { ModuleConfig } from './types/module-config'; + +import { _MODULE_CONFIG } from './config/token'; +import { ModuleConfig } from './config/module-config'; const SERVICES = [PublicApiService]; @NgModule({ declarations: [], imports: [], - exports: [] + exports: [], }) export class UCapPublicApiModule { public static forRoot( @@ -17,7 +18,7 @@ export class UCapPublicApiModule { ): ModuleWithProviders { return { ngModule: UCapPublicApiModule, - providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES] + providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES], }; } } diff --git a/projects/ucap-webmessenger-api-public/src/public-api.ts b/projects/ucap-webmessenger-api-public/src/public-api.ts index eb7db5ee..41cd5c4d 100644 --- a/projects/ucap-webmessenger-api-public/src/public-api.ts +++ b/projects/ucap-webmessenger-api-public/src/public-api.ts @@ -7,7 +7,9 @@ export * from './lib/apis/version-info2'; export * from './lib/services/public-api.service'; -export * from './lib/types/module-config'; export * from './lib/types/sync-mode.type'; export * from './lib/ucap-public-api.module'; + +export * from './lib/config/urls'; +export * from './lib/config/module-config'; diff --git a/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts b/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts index ec9005b5..e3db8044 100644 --- a/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts +++ b/projects/ucap-webmessenger-api/src/lib/types/status-code.type.ts @@ -1,4 +1,4 @@ export enum StatusCode { Success = '200', - Fail = '500' + Fail = '500', } diff --git a/projects/ucap-webmessenger-app/src/app/app-provider.module.ts b/projects/ucap-webmessenger-app/src/app/app-provider.module.ts index 5dfda4ed..9fea381a 100644 --- a/projects/ucap-webmessenger-app/src/app/app-provider.module.ts +++ b/projects/ucap-webmessenger-app/src/app/app-provider.module.ts @@ -1,35 +1,59 @@ -import { NgModule, APP_INITIALIZER } from '@angular/core'; +import { NgModule, APP_INITIALIZER, Type } from '@angular/core'; + +import { HttpClient } from '@angular/common/http'; + +import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native'; import { RESOLVERS } from './resolvers'; import { SERVICES } from './services'; import { AppService } from './services/app.service'; -import { HttpClient } from '@angular/common/http'; -import { UCAP_NATIVE_SERVICE } from '@ucap-webmessenger/native'; -import { environment } from '../environments/environment'; -export function initializeApp(appService: AppService) { +import { environment } from '../environments/environment'; +import { BrowserNativeService } from '@ucap-webmessenger/native-browser'; +import { ElectronNativeService } from '@ucap-webmessenger/native-electron'; + +export function initializeApp( + appService: AppService, + nativeService: NativeService +) { return (): Promise => { return appService.postInit(); }; } +// export function nativeServiceFactory(httpClient: HttpClient) { +// if ('browser' === environment.runtime) { +// return import('@ucap-webmessenger/native-browser').then( +// m => new m.BrowserNativeService(httpClient) +// ); +// } else { +// return import('@ucap-webmessenger/native-electron').then( +// m => new m.ElectronNativeService() +// ); +// } +// } + @NgModule({ imports: [], exports: [], providers: [ - ...SERVICES, - ...RESOLVERS, { provide: UCAP_NATIVE_SERVICE, - useClass: environment.modules.native.serviceClass, - deps: [HttpClient] + // useFactory: nativeServiceFactory, + useClass: + 'browser' === environment.runtime + ? BrowserNativeService + : ElectronNativeService, + deps: [HttpClient], }, + ...SERVICES, + ...RESOLVERS, { provide: APP_INITIALIZER, useFactory: initializeApp, deps: [AppService, UCAP_NATIVE_SERVICE], - multi: true - } - ] + multi: true, + }, + ], }) export class AppProviderModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app-routing.module.ts b/projects/ucap-webmessenger-app/src/app/app-routing.module.ts index e27fc322..99fef86b 100644 --- a/projects/ucap-webmessenger-app/src/app/app-routing.module.ts +++ b/projects/ucap-webmessenger-app/src/app/app-routing.module.ts @@ -10,26 +10,26 @@ const routes: Routes = [ import('./pages/messenger/messenger.page.module').then( m => m.AppMessengerPageModule ), - canActivate: [AppAuthGuard] + canActivate: [AppAuthGuard], }, { path: 'account', loadChildren: () => import('./pages/account/account.page.module').then( m => m.AppAccountPageModule - ) + ), }, { path: 'template', loadChildren: () => import('./pages/template/template.page.module').then( m => m.AppTemplatePageModule - ) - } + ), + }, ]; @NgModule({ imports: [RouterModule.forRoot(routes, { enableTracing: false })], - exports: [RouterModule] + exports: [RouterModule], }) export class AppRoutingModule {} diff --git a/projects/ucap-webmessenger-app/src/app/app.module.ts b/projects/ucap-webmessenger-app/src/app/app.module.ts index 2e3bc2e2..6e3a5d86 100644 --- a/projects/ucap-webmessenger-app/src/app/app.module.ts +++ b/projects/ucap-webmessenger-app/src/app/app.module.ts @@ -7,8 +7,16 @@ import { MatProgressBarModule } from '@angular/material/progress-bar'; import { PerfectScrollbarModule } from 'ngx-perfect-scrollbar'; +import { UCapUiModule } from '@ucap-webmessenger/ui'; +import { UCapUiAccountModule } from '@ucap-webmessenger/ui-account'; + +import { UCapWebStorageModule } from '@ucap-webmessenger/web-storage'; + +import { UCapUtilModule } from '@ucap-webmessenger/util'; + import { UCapCommonApiModule } from '@ucap-webmessenger/api-common'; import { UCapExternalApiModule } from '@ucap-webmessenger/api-external'; +import { UCapMessageApiModule } from '@ucap-webmessenger/api-message'; import { UCapPublicApiModule } from '@ucap-webmessenger/api-public'; import { UCapPiModule } from '@ucap-webmessenger/pi'; @@ -25,17 +33,8 @@ import { UCapServiceProtocolModule } from '@ucap-webmessenger/protocol-service'; import { UCapStatusProtocolModule } from '@ucap-webmessenger/protocol-status'; import { UCapSyncProtocolModule } from '@ucap-webmessenger/protocol-sync'; -import { UCapUiModule } from '@ucap-webmessenger/ui'; -import { UCapUiAccountModule } from '@ucap-webmessenger/ui-account'; - -import { UCapWebStorageModule } from '@ucap-webmessenger/web-storage'; - -import { UCapUtilModule } from '@ucap-webmessenger/util'; - import { LoggerModule, NgxLoggerLevel } from 'ngx-logger'; -import { environment } from '../environments/environment'; - import { AppProviderModule } from './app-provider.module'; import { AppRoutingModule } from './app-routing.module'; import { AppStoreModule } from './app-store.module'; @@ -47,6 +46,8 @@ import { GUARDS } from './guards'; import { AppMessengerLayoutModule } from './layouts/messenger/messenger.layout.module'; import { AppNativeLayoutModule } from './layouts/native/native.layout.module'; +import { environment } from '../environments/environment'; + @NgModule({ imports: [ BrowserModule, @@ -58,28 +59,15 @@ import { AppNativeLayoutModule } from './layouts/native/native.layout.module'; PerfectScrollbarModule, - UCapCommonApiModule.forRoot({ - urls: environment.urls.apiCommon, - acceptableFileExtensions: - environment.modules.event.acceptableFileExtensions - }), + UCapCommonApiModule.forRoot(environment.commonApiModuleConfig), - UCapPublicApiModule.forRoot({ - urls: environment.urls.apiPublic - }), - UCapExternalApiModule.forRoot({ - urls: environment.urls.apiExternal - }), + UCapPublicApiModule.forRoot(environment.publicApiModuleConfig), + UCapExternalApiModule.forRoot(environment.externalApiModuleConfig), + UCapMessageApiModule.forRoot(environment.messageApiModuleConfig), - UCapPiModule.forRoot({ - urls: environment.urls.pi - }), + UCapPiModule.forRoot(environment.piModuleConfig), - UCapProtocolModule.forRoot({ - urls: environment.urls.protocol, - reconnect: environment.protocol.reconnect, - requestId: environment.protocol.requestId - }), + UCapProtocolModule.forRoot(environment.protocolModuleConfig), UCapAuthenticationProtocolModule.forRoot(), UCapEventProtocolModule.forRoot(), UCapGroupProtocolModule.forRoot(), diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html index ff5c6c5e..0092f806 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.html @@ -1,11 +1,6 @@ - diff --git a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts index 82da29c2..4075c0aa 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/common/dialogs/file-viewer.dialog.component.ts @@ -3,7 +3,7 @@ import { OnInit, OnDestroy, Inject, - EventEmitter + EventEmitter, } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; @@ -15,7 +15,7 @@ import { take, map, finalize, tap } from 'rxjs/operators'; import { SnackBarService } from '@ucap-webmessenger/ui'; import { FileDownloadItem, - CommonApiService + CommonApiService, } from '@ucap-webmessenger/api-common'; export interface FileViewerDialogData { @@ -31,7 +31,7 @@ export interface FileViewerDialogResult {} @Component({ selector: 'app-layout-common-file-viewer', templateUrl: './file-viewer.dialog.component.html', - styleUrls: ['./file-viewer.dialog.component.scss'] + styleUrls: ['./file-viewer.dialog.component.scss'], }) export class FileViewerDialogComponent implements OnInit, OnDestroy { fileInfo: FileEventJson; @@ -40,8 +40,6 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy { deviceType: DeviceType; token: string; - fileDownloadItem: FileDownloadItem; - fileDownloadUrl: string; constructor( @@ -66,7 +64,7 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy { userSeq: this.userSeq, deviceType: this.deviceType, token: this.token, - attachmentsSeq: this.fileInfo.attachmentSeq + attachmentsSeq: this.fileInfo.attachmentSeq, }, this.downloadUrl ); @@ -76,8 +74,7 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy { ngOnDestroy(): void {} - onDownload(): void { - this.fileDownloadItem = new FileDownloadItem(); + onDownload(fileDownloadItem: FileDownloadItem): void { this.commonApiService .fileTalkDownload( { @@ -85,37 +82,36 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy { deviceType: this.deviceType, token: this.token, attachmentsSeq: this.fileInfo.attachmentSeq, - fileDownloadItem: this.fileDownloadItem + fileDownloadItem, }, this.downloadUrl ) .pipe( take(1), map(async rawBlob => { - const blob = rawBlob.slice( - 0, - rawBlob.size, - MimeUtil.getMimeFromExtension(this.fileInfo.fileExt) - ); + const mimeType = MimeUtil.getMimeFromExtension(this.fileInfo.fileExt); + const blob = rawBlob.slice(0, rawBlob.size, mimeType); FileUtil.fromBlobToBuffer(blob) .then(buffer => { this.nativeService - .saveFile(buffer, this.fileInfo.fileName) - .pipe(take(1)) - .subscribe(result => { + .saveFile(buffer, this.fileInfo.fileName, mimeType) + .then(result => { if (!!result) { this.snackBarService.open( `파일이 경로[${result}]에 저장되었습니다.`, '', { duration: 3000, - verticalPosition: 'bottom' + verticalPosition: 'bottom', } ); } else { this.snackBarService.open('파일 저장에 실패하였습니다.'); } + }) + .catch(reason => { + this.snackBarService.open('파일 저장에 실패하였습니다.'); }); }) .catch(reason => { @@ -123,7 +119,9 @@ export class FileViewerDialogComponent implements OnInit, OnDestroy { }); }), finalize(() => { - this.fileDownloadItem = undefined; + setTimeout(() => { + fileDownloadItem.downloadingProgress$ = undefined; + }, 1000); }) ) .subscribe(); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html index 71099332..28ec68e9 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.html @@ -9,8 +9,17 @@
- + @@ -18,7 +27,7 @@ @@ -32,16 +41,28 @@ matBadgePosition="above after" >chat--> -
- + matBadgePosition="above after" + > + - + d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z" + >
@@ -51,8 +72,17 @@
- + @@ -73,16 +103,27 @@
- - + - + c-0.1,0-0.2,0-0.2,0c-1.5-0.1-2.9-0.7-4-1.2c-2.9-1.4-5.4-3.4-7.5-5.9C4.5,13,3.3,11.1,2.6,9C2.1,7.7,1.9,6.7,2,5.8z" + >
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts index e9b6a2c0..e141bee9 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-side.component.ts @@ -20,6 +20,7 @@ import { UserInfoDN } from '@ucap-webmessenger/protocol-query'; import { MatTabChangeEvent, MatTabGroup } from '@angular/material'; +import { RightDrawer } from '@app/types'; export enum MainMenu { Group = 'GROUP', @@ -144,6 +145,11 @@ export class LeftSideComponent implements OnInit { icon: 'add', tooltip: 'New Group Add', divisionType: 'GROUP_NEW_ADD' + }, + { + icon: 'sms', + tooltip: 'Message', + divisionType: 'MESSAGE' } ]; } @@ -247,6 +253,16 @@ export class LeftSideComponent implements OnInit { this.onClickNewChat('TIMER'); } break; + + case 'MESSAGE': + { + this.store.dispatch( + ChatStore.selectedRightDrawer({ + req: RightDrawer.Message + }) + ); + } + break; } } } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html index 7edc38e5..19570fd5 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/left-sidenav/group.component.html @@ -17,7 +17,7 @@ [companyList]="companyList$ | async" [companyCode]="companyCode" (keyDownEnter)="onKeyDownEnterOrganizationTenantSearch($event)" - (cancel)="onClickCancel($event)" + (cancel)="onClickCancel()" >
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html index 9a1f51b2..a152ee78 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.html @@ -66,7 +66,7 @@ + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts index 2c3e2a0a..8f23ba54 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/messages.component.ts @@ -6,7 +6,7 @@ import { ElementRef, AfterViewInit, Output, - EventEmitter + EventEmitter, } from '@angular/core'; import { ucapAnimations, @@ -20,7 +20,7 @@ import { AlertDialogData, AlertDialogResult, FileUploadQueueComponent, - StringUtil + StringUtil, } from '@ucap-webmessenger/ui'; import { Store, select } from '@ngrx/store'; import { NGXLogger } from 'ngx-logger'; @@ -33,7 +33,7 @@ import { isRecallable, InfoResponse, EventJson, - FileEventJson + FileEventJson, } from '@ucap-webmessenger/protocol-event'; import * as AppStore from '@app/store'; @@ -47,36 +47,36 @@ import { EnvironmentsInfo, KEY_ENVIRONMENTS_INFO, UserSelectDialogType, - RightDrawer + RightDrawer, } from '@app/types'; import { RoomInfo, UserInfo, RoomType } from '@ucap-webmessenger/protocol-room'; import { tap, take, map, catchError } from 'rxjs/operators'; import { FileInfo, - FormComponent as UCapUiChatFormComponent + FormComponent as UCapUiChatFormComponent, } from '@ucap-webmessenger/ui-chat'; import { KEY_VER_INFO } from '@app/types/ver-info.type'; import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { MatMenuTrigger, MatSnackBarRef, - SimpleSnackBar + SimpleSnackBar, } from '@angular/material'; import { CommonApiService, FileUploadItem, FileTalkSaveRequest, - FileTalkSaveResponse + FileTalkSaveResponse, } from '@ucap-webmessenger/api-common'; import { CreateChatDialogComponent, CreateChatDialogData, - CreateChatDialogResult + CreateChatDialogResult, } from '../dialogs/chat/create-chat.dialog.component'; import { FileViewerDialogComponent, FileViewerDialogData, - FileViewerDialogResult + FileViewerDialogResult, } from '@app/layouts/common/dialogs/file-viewer.dialog.component'; import { CONST, FileUtil } from '@ucap-webmessenger/core'; import { PerfectScrollbarComponent } from 'ngx-perfect-scrollbar'; @@ -84,12 +84,12 @@ import { StatusCode } from '@ucap-webmessenger/api'; import { EditChatRoomDialogComponent, EditChatRoomDialogResult, - EditChatRoomDialogData + EditChatRoomDialogData, } from '../dialogs/chat/edit-chat-room.dialog.component'; import { SelectGroupDialogComponent, SelectGroupDialogResult, - SelectGroupDialogData + SelectGroupDialogData, } from '../dialogs/group/select-group.dialog.component'; import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; @@ -97,7 +97,7 @@ import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; selector: 'app-layout-messenger-messages', templateUrl: './messages.component.html', styleUrls: ['./messages.component.scss'], - animations: ucapAnimations + animations: ucapAnimations, }) export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { @Output() @@ -379,7 +379,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { // duration: 3000, verticalPosition: 'bottom', horizontalPosition: 'center', - panelClass: ['chat-snackbar-class'] + panelClass: ['chat-snackbar-class'], }); this.snackBarPreviewEvent.onAction().subscribe(() => { this.setEventMoreInit(); @@ -420,7 +420,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { EventStore.info({ roomSeq: this.roomInfo.roomSeq, baseSeq: seq, - requestCount: CONST.EVENT_INFO_READ_COUNT + requestCount: CONST.EVENT_INFO_READ_COUNT, }) ); } @@ -438,8 +438,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { width: '360px', data: { title: 'Alert', - message: `대화내용을 입력해주세요.` - } + message: `대화내용을 입력해주세요.`, + }, }); return; } @@ -453,8 +453,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { roomSeq: this.roomInfo.roomSeq, eventType: EventType.MassText, // sentMessage: message.replace(/\n/gi, '\r\n') - sentMessage: message - } + sentMessage: message, + }, }) ); } else { @@ -464,8 +464,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { req: { roomSeq: this.roomInfo.roomSeq, eventType: EventType.Character, - sentMessage: message - } + sentMessage: message, + }, }) ); } @@ -479,20 +479,19 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { onMassDetail(value: number) { this.store.dispatch( ChatStore.selectedMassDetail({ - massEventSeq: value + massEventSeq: value, }) ); } async onFileViewer(fileInfo: FileEventJson) { - this.logger.debug('onFileViewer', fileInfo); const result = await this.dialogService.open< FileViewerDialogComponent, FileViewerDialogData, FileViewerDialogResult >(FileViewerDialogComponent, { position: { - top: '30px' + top: '30px', }, maxWidth: '100vw', maxHeight: '100vh', @@ -505,8 +504,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { downloadUrl: this.sessionVerInfo.downloadUrl, deviceType: this.environmentsInfo.deviceType, token: this.loginRes.tokenString, - userSeq: this.loginRes.userSeq - } + userSeq: this.loginRes.userSeq, + }, }); } @@ -532,7 +531,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { const info = { senderSeq: this.loginRes.userSeq, - roomSeq: this.roomInfo.roomSeq + roomSeq: this.roomInfo.roomSeq, }; const allObservables: Observable[] = []; @@ -553,7 +552,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { 'rv', 'ts', 'webm', - 'wmv' + 'wmv', ].indexOf(FileUtil.getExtension(fileUploadItem.file.name)) ) { thumbnail = await FileUtil.thumbnail(fileUploadItem.file); @@ -568,7 +567,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { file: fileUploadItem.file, fileName: fileUploadItem.file.name, thumb: thumbnail, - fileUploadItem + fileUploadItem, }; allObservables.push( @@ -600,8 +599,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { req: { roomSeq: info.roomSeq, eventType: EventType.File, - sentMessage: res.returnJson - } + sentMessage: res.returnJson, + }, }) ); } @@ -627,7 +626,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { this.messageContextMenuTrigger.menu.focusFirstItem('mouse'); this.messageContextMenuTrigger.menuData = { message: params.message, - loginRes: this.loginRes + loginRes: this.loginRes, }; this.messageContextMenuTrigger.openMenu(); } @@ -647,7 +646,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { this.snackBarService.open('클립보드에 복사되었습니다.', '', { duration: 3000, verticalPosition: 'top', - horizontalPosition: 'center' + horizontalPosition: 'center', }); } } @@ -659,7 +658,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { userSeq: this.loginRes.userSeq, deviceType: this.environmentsInfo.deviceType, token: this.loginRes.tokenString, - eventMassSeq: message.seq + eventMassSeq: message.seq, }) .pipe(take(1)) .subscribe(res => { @@ -670,7 +669,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { { duration: 3000, verticalPosition: 'top', - horizontalPosition: 'center' + horizontalPosition: 'center', } ); } @@ -694,8 +693,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { data: { type: UserSelectDialogType.MessageForward, title: 'MessageForward', - ignoreRoom: [this.roomInfo] - } + ignoreRoom: [this.roomInfo], + }, }); if (!!result && !!result.choice && result.choice) { @@ -719,10 +718,10 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { req: { roomSeq: '-999', eventType: message.type, - sentMessage: message.sentMessage + sentMessage: message.sentMessage, }, trgtUserSeqs: userSeqs, - trgtRoomSeq: roomSeq + trgtRoomSeq: roomSeq, }) ); } @@ -738,9 +737,9 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { req: { roomSeq: '-999', eventType: message.type, - sentMessage: message.sentMessage + sentMessage: message.sentMessage, }, - trgtUserSeqs: [this.loginRes.talkWithMeBotSeq] + trgtUserSeqs: [this.loginRes.talkWithMeBotSeq], }) ); } @@ -756,15 +755,15 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { width: '220px', data: { title: 'Delete', - html: `선택한 메시지를 삭제하시겠습니까?
삭제된 메시지는 내 대화방에서만 적용되며 상대방의 대화방에서는 삭제되지 않습니다.` - } + html: `선택한 메시지를 삭제하시겠습니까?
삭제된 메시지는 내 대화방에서만 적용되며 상대방의 대화방에서는 삭제되지 않습니다.`, + }, }); if (!!result && !!result.choice && result.choice) { this.store.dispatch( EventStore.del({ roomSeq: this.roomInfo.roomSeq, - eventSeq: message.seq + eventSeq: message.seq, }) ); } @@ -780,8 +779,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { width: '220px', data: { title: 'ReCall', - html: `해당 대화를 회수하시겠습니까?
상대방 대화창에서도 회수됩니다.` - } + html: `해당 대화를 회수하시겠습니까?
상대방 대화창에서도 회수됩니다.`, + }, }); if (!!result && !!result.choice && result.choice) { @@ -789,7 +788,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { EventStore.cancel({ roomSeq: this.roomInfo.roomSeq, eventSeq: message.seq, - deviceType: this.environmentsInfo.deviceType + deviceType: this.environmentsInfo.deviceType, }) ); } @@ -806,7 +805,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { { this.store.dispatch( ChatStore.selectedRightDrawer({ - req: RightDrawer.AlbumBox + req: RightDrawer.AlbumBox, }) ); } @@ -815,7 +814,16 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { { this.store.dispatch( ChatStore.selectedRightDrawer({ - req: RightDrawer.FileBox + req: RightDrawer.FileBox, + }) + ); + } + break; + case 'OPEN_ROOM_USER': + { + this.store.dispatch( + ChatStore.selectedRightDrawer({ + req: RightDrawer.RoomUser, }) ); } @@ -833,8 +841,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { title: 'Edit Chat Member', curRoomUser: this.userInfoList.filter( user => user.seq !== this.loginRes.userSeq - ) - } + ), + }, }); if (!!result && !!result.choice && result.choice) { @@ -856,8 +864,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { RoomStore.inviteOrOpen({ req: { divCd: 'Invite', - userSeqs - } + userSeqs, + }, }) ); } @@ -873,8 +881,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { >(SelectGroupDialogComponent, { width: '600px', data: { - title: 'Group Select' - } + title: 'Group Select', + }, }); if (!!result && !!result.choice && result.choice) { @@ -891,7 +899,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { this.store.dispatch( SyncStore.updateGroupMember({ oldGroup, - trgtUserSeq + trgtUserSeq, }) ); } @@ -908,8 +916,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { width: '600px', data: { title: 'Edit Chat Room', - roomInfo: this.roomInfo - } + roomInfo: this.roomInfo, + }, }); if (!!result && !!result.choice && result.choice) { @@ -926,8 +934,8 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { roomName, receiveAlarm: roomInfo.receiveAlarm, syncAll: - roomNameChangeTarget.toUpperCase() === 'ALL' ? true : false - } + roomNameChangeTarget.toUpperCase() === 'ALL' ? true : false, + }, }) ); @@ -939,7 +947,7 @@ export class MessagesComponent implements OnInit, OnDestroy, AfterViewInit { this.store.dispatch( RoomStore.updateTimeRoomInterval({ roomSeq: roomInfo.roomSeq, - timerInterval: timeRoomInterval + timerInterval: timeRoomInterval, }) ); } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.html index 0337b70b..28ff1ca3 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.html @@ -1,7 +1,34 @@ +
+ {{ selectedRightDrawer }} + + + +
+ + + + + + + + + + diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.ts index 0b0f4893..65945641 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer.component.ts @@ -1,18 +1,39 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { RightDrawer } from '@app/types'; +import { UserInfo } from '@ucap-webmessenger/protocol-room'; +import { + UserInfoSS, + UserInfoF, + UserInfoDN, +} from '@ucap-webmessenger/protocol-query'; @Component({ selector: 'app-layout-messenger-right-drawer', templateUrl: './right-drawer.component.html', - styleUrls: ['./right-drawer.component.scss'] + styleUrls: ['./right-drawer.component.scss'], }) export class RightDrawerComponent implements OnInit { @Input() selectedRightDrawer: RightDrawer; + @Output() + openProfile = new EventEmitter< + UserInfo | UserInfoSS | UserInfoF | UserInfoDN + >(); + @Output() + closeRightDrawer = new EventEmitter(); + RightDrawer = RightDrawer; constructor() {} ngOnInit() {} + + onClickOpenProfile(userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN) { + this.openProfile.emit(userInfo); + } + + onClickClose() { + this.closeRightDrawer.emit(); + } } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.html index 26983003..89549d79 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.html @@ -1 +1,104 @@ -

album-box works!

+
+
+ + + + +
+
+ + Select File. + + + + +
    +
  • name : {{ selectedFile.info.name }}
  • +
  • size : {{ selectedFile.info.size | ucapBytes }}
  • +
  • + date : + {{ selectedFile.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }} +
  • +
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+
+ + + + + + + +
+
+
+
+
+ + +
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.scss index e69de29b..c3c22de5 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.scss +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.scss @@ -0,0 +1,24 @@ +.album-box { + height: 100%; + overflow: hidden; + + .search-list { + overflow: auto; + } +} + +.img-item { + cursor: pointer; + max-width: 150px; + min-width: 150px; +} + +.preview-image { + max-height: 300px; +} + +.btn-box { + button { + margin: 5px; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.ts index e4737472..4c0a9cf0 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/album-box.component.ts @@ -1,12 +1,198 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core'; +import { MatPaginator, MatTableDataSource } from '@angular/material'; +import { + FileInfo, + FileDownloadInfo, + FileType, +} from '@ucap-webmessenger/protocol-file'; +import { Subscription, combineLatest } from 'rxjs'; +import { Store, select } from '@ngrx/store'; + +import * as AppStore from '@app/store'; +import * as ChatStore from '@app/store/messenger/chat'; +import { tap, map } from 'rxjs/operators'; +import { + Info, + EventJson, + FileEventJson, +} from '@ucap-webmessenger/protocol-event'; +import { FileUtil } from '@ucap-webmessenger/core'; +import { CommonApiService } from '@ucap-webmessenger/api-common'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; +import { EnvironmentsInfo, KEY_ENVIRONMENTS_INFO } from '@app/types'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; + +export interface FileInfoTotal { + info: FileInfo; + checkInfo: FileDownloadInfo[]; + eventInfo?: Info; +} @Component({ selector: 'app-layout-chat-right-drawer-album-box', templateUrl: './album-box.component.html', - styleUrls: ['./album-box.component.scss'] + styleUrls: ['./album-box.component.scss'], }) -export class AlbumBoxComponent implements OnInit { - constructor() {} +export class AlbumBoxComponent implements OnInit, OnDestroy { + filteredList: FileInfoTotal[] = []; + fileInfoTotal: FileInfoTotal[]; + fileInfoList: FileInfo[]; + fileInfoListSubscription: Subscription; - ngOnInit() {} + selectedFile: FileInfoTotal; + selectedFileList: FileInfoTotal[] = []; + + loginRes: LoginResponse; + environmentsInfo: EnvironmentsInfo; + sessionVerinfo: VersionInfo2Response; + + FileType = FileType; + currentTabIndex = 0; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private commonApiService: CommonApiService + ) { + this.loginRes = this.sessionStorageService.get( + KEY_LOGIN_RES_INFO + ); + this.environmentsInfo = this.sessionStorageService.get( + KEY_ENVIRONMENTS_INFO + ); + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + } + + ngOnInit() { + this.fileInfoListSubscription = combineLatest([ + this.store.pipe(select(AppStore.MessengerSelector.RoomSelector.roomInfo)), + this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.selectAllFileInfoList) + ), + this.store.pipe( + select( + AppStore.MessengerSelector.EventSelector.selectAllFileInfoCheckList + ) + ), + this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.selectAllInfoList) + ), + ]) + .pipe( + tap(() => (this.fileInfoTotal = [])), + tap(([roomInfo, fileInfoList, fileInfoCheckList, eventList]) => { + this.fileInfoList = fileInfoList.filter(fileInfo => { + if ( + fileInfo.roomSeq === roomInfo.roomSeq && + (fileInfo.type === FileType.Image || + fileInfo.type === FileType.Video) + ) { + return true; + } else { + return false; + } + }); + + this.fileInfoList.map(fileInfo => { + const events = eventList.filter( + event => event.seq === fileInfo.eventSeq + ); + + this.fileInfoTotal.push({ + info: fileInfo, + checkInfo: fileInfoCheckList.filter( + checkInfo => checkInfo.seq === fileInfo.seq + ), + eventInfo: + events.length > 0 ? (events[0] as Info) : null, + }); + }); + + this.onSelectedIndexChange(this.currentTabIndex); + }) + ) + .subscribe(); + } + + ngOnDestroy(): void { + if (!!this.fileInfoListSubscription) { + this.fileInfoListSubscription.unsubscribe(); + } + } + + getExtention(name: string): string { + return FileUtil.getExtension(name); + } + + getImageUrl(fileInfo: FileInfoTotal): string { + return this.commonApiService.urlForFileTalkDownload( + { + userSeq: this.loginRes.userSeq, + deviceType: this.environmentsInfo.deviceType, + token: this.loginRes.tokenString, + attachmentsSeq: fileInfo.info.seq, + }, + this.sessionVerinfo.downloadUrl + ); + } + + onSelectedIndexChange(index: number) { + this.selectedFile = null; + this.currentTabIndex = index; + if (this.currentTabIndex === 0) { + // Image + this.filteredList = this.fileInfoTotal.filter( + fileInfo => fileInfo.info.type === FileType.Image + ); + } else { + // Video + this.filteredList = this.fileInfoTotal.filter( + fileInfo => fileInfo.info.type === FileType.Video + ); + } + } + + onClickImage(event: MouseEvent, fileInfo: FileInfoTotal) { + if (!!event) { + event.preventDefault(); + event.stopPropagation(); + } + + this.selectedFile = fileInfo; + } + + getCheckItem(fileInfo: FileInfoTotal) { + if (this.selectedFileList) { + if ( + this.selectedFileList.filter( + info => info.info.seq === fileInfo.info.seq + ).length > 0 + ) { + return true; + } else { + return false; + } + } else { + return false; + } + } + onCheckItem(value: boolean, fileInfo: FileInfoTotal) { + if (value) { + this.onClickImage(undefined, fileInfo); + this.selectedFileList.push(fileInfo); + } else { + this.selectedFileList = this.selectedFileList.filter( + info => info.info.seq !== fileInfo.info.seq + ); + } + } + + onClickDownload(fileInfo: FileInfoTotal) { + console.log(fileInfo); + } } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.html index e361c50b..2e3a5ced 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.html @@ -1 +1,108 @@ -

file-box works!

+
+
+ + + + +
+
+ + Select File. + + +
+
+
+
    +
  • name : {{ selectedFile.info.name }}
  • +
  • size : {{ selectedFile.info.size | ucapBytes }}
  • +
  • + date : + {{ selectedFile.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }} +
  • +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Name{{ element.info.name }}Size + {{ element.info.size | ucapBytes }} + sendDate + {{ element.info.sendDate | dateToStringFormat: 'YYYY.MM.DD' }} + receivedUser + {{ element.info.receivedUserCount }} +
+ + +
+
+ + +
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.scss index e69de29b..a6c2e8f4 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.scss +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.scss @@ -0,0 +1,14 @@ +table { + width: 100%; +} + +.mat-row:hover { + background: rgba(0, 0, 0, 0.04); + cursor: pointer; +} + +.btn-box { + button { + margin: 5px; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.ts index dd06f32f..2f2a2d29 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/file-box.component.ts @@ -1,12 +1,218 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild, OnDestroy } from '@angular/core'; +import { MatPaginator, MatTableDataSource, MatSort } from '@angular/material'; +import { + FileInfo, + FileDownloadInfo, + FileType, +} from '@ucap-webmessenger/protocol-file'; +import { Subscription, combineLatest } from 'rxjs'; +import { Store, select } from '@ngrx/store'; + +import * as AppStore from '@app/store'; +import * as ChatStore from '@app/store/messenger/chat'; +import { tap, map } from 'rxjs/operators'; +import { FileUtil } from '@ucap-webmessenger/core'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; + +export interface FileInfoTotal { + info: FileInfo; + checkInfo: FileDownloadInfo[]; +} @Component({ selector: 'app-layout-chat-right-drawer-file-box', templateUrl: './file-box.component.html', - styleUrls: ['./file-box.component.scss'] + styleUrls: ['./file-box.component.scss'], }) -export class FileBoxComponent implements OnInit { - constructor() {} +export class FileBoxComponent implements OnInit, OnDestroy { + displayedColumns: string[] = [ + 'check', + 'name', + 'size', + 'sendDate', + 'receivedUserCount', + ]; + dataSource = new MatTableDataSource(); - ngOnInit() {} + fileInfoTotal: FileInfoTotal[]; + fileInfoList: FileInfo[]; + fileInfoListSubscription: Subscription; + + selectedFile: FileInfoTotal; + selectedFileList: FileInfoTotal[] = []; + + loginRes: LoginResponse; + + currentTabIndex = 0; + + @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; + @ViewChild(MatSort, { static: true }) sort: MatSort; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService + ) { + this.loginRes = this.sessionStorageService.get( + KEY_LOGIN_RES_INFO + ); + } + + ngOnInit() { + this.fileInfoListSubscription = combineLatest([ + this.store.pipe(select(AppStore.MessengerSelector.RoomSelector.roomInfo)), + this.store.pipe( + select(AppStore.MessengerSelector.EventSelector.selectAllFileInfoList) + ), + this.store.pipe( + select( + AppStore.MessengerSelector.EventSelector.selectAllFileInfoCheckList + ) + ), + ]) + .pipe( + tap(() => (this.fileInfoTotal = [])), + tap(([roomInfo, fileInfoList, fileInfoCheckList]) => { + this.fileInfoList = fileInfoList.filter(fileInfo => { + if ( + fileInfo.roomSeq === roomInfo.roomSeq && + (fileInfo.type === FileType.File || + fileInfo.type === FileType.Sound) + ) { + return true; + } else { + return false; + } + }); + + this.fileInfoList.map(fileInfo => { + this.fileInfoTotal.push({ + info: fileInfo, + checkInfo: fileInfoCheckList.filter( + checkInfo => checkInfo.seq === fileInfo.seq + ), + }); + }); + + this.onSelectedIndexChange(this.currentTabIndex); + }) + ) + .subscribe(); + + this.dataSource.sortingDataAccessor = (item, property) => { + switch (property) { + case 'name': + return item.info.name; + case 'size': + return item.info.size; + case 'sendDate': + return item.info.sendDate; + case 'receivedUserCount': + return item.info.receivedUserCount; + default: + return item[property]; + } + }; + this.dataSource.sort = this.sort; + this.dataSource.paginator = this.paginator; + } + + ngOnDestroy(): void { + if (!!this.fileInfoListSubscription) { + this.fileInfoListSubscription.unsubscribe(); + } + } + + getExtention(name: string): string { + return FileUtil.getExtension(name); + } + + onSelectedIndexChange(index: number) { + this.selectedFile = null; + this.currentTabIndex = index; + if (this.currentTabIndex === 0) { + // Receive + this.dataSource.data = this.fileInfoTotal.filter( + fileInfo => fileInfo.info.senderSeq !== this.loginRes.userSeq + ); + } else { + // send + this.dataSource.data = this.fileInfoTotal.filter( + fileInfo => fileInfo.info.senderSeq === this.loginRes.userSeq + ); + } + } + + getCheckAllUser() { + const data = this.dataSource + .sortData(this.dataSource.data, this.sort) + .filter((u, i) => i >= this.paginator.pageSize * this.paginator.pageIndex) + .filter((u, i) => i < this.paginator.pageSize); + if ( + data.filter( + dInfo => + this.selectedFileList.filter( + fileInfo => fileInfo.info.seq === dInfo.info.seq + ).length === 0 + ).length > 0 + ) { + return false; + } else { + return true; + } + } + onCheckAllkUser(value: boolean) { + const data = this.dataSource + .sortData(this.dataSource.data, this.sort) + .filter((u, i) => i >= this.paginator.pageSize * this.paginator.pageIndex) + .filter((u, i) => i < this.paginator.pageSize); + + if (!!data && data.length > 0) { + if (value) { + this.selectedFileList.push( + ...data.filter(dInfo => + this.selectedFileList.filter( + fileInfo => fileInfo.info.seq !== dInfo.info.seq + ) + ) + ); + } else { + this.selectedFileList = this.selectedFileList.filter( + fileInfo => + !( + data.filter(dInfo => dInfo.info.seq === fileInfo.info.seq) + .length > 0 + ) + ); + } + } + } + getCheckUser(fileInfo: FileInfoTotal) { + if (this.selectedFileList) { + if ( + this.selectedFileList.filter( + info => info.info.seq === fileInfo.info.seq + ).length > 0 + ) { + return true; + } else { + return false; + } + } else { + return false; + } + } + onCheckUser(value: boolean, fileInfo: FileInfoTotal) { + if (value) { + this.selectedFileList.push(fileInfo); + } else { + this.selectedFileList = this.selectedFileList.filter( + info => info.info.seq !== fileInfo.info.seq + ); + } + } + onClickRow(row: FileInfoTotal) { + this.selectedFile = row; + } } diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/index.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/index.ts index dc7431d2..2c8c66fe 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/index.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/index.ts @@ -1,4 +1,11 @@ import { FileBoxComponent } from './file-box.component'; import { AlbumBoxComponent } from './album-box.component'; +import { RoomUserListComponent } from './room-user-list.component'; +import { MessageBoxComponent } from './message-box.component'; -export const RIGHT_DRAWER_COMPONENTS = [FileBoxComponent, AlbumBoxComponent]; +export const RIGHT_DRAWER_COMPONENTS = [ + FileBoxComponent, + AlbumBoxComponent, + RoomUserListComponent, + MessageBoxComponent +]; diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.html new file mode 100644 index 00000000..155ffc31 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.html @@ -0,0 +1,3 @@ +
+

message-box works!

+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.scss new file mode 100644 index 00000000..2dd77e82 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.scss @@ -0,0 +1,3 @@ +div.message-box { + width: 600px; +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.spec.ts new file mode 100644 index 00000000..5a6261b4 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MessageBoxComponent } from './message-box.component'; + +describe('MessageBoxComponent', () => { + let component: MessageBoxComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MessageBoxComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MessageBoxComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.ts new file mode 100644 index 00000000..4a5c83c2 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/message-box.component.ts @@ -0,0 +1,113 @@ +import { + Component, + OnInit, + OnDestroy, + Output, + EventEmitter +} from '@angular/core'; +import { Subscription, of } from 'rxjs'; +import { Store, select } from '@ngrx/store'; +import { tap, map, catchError } from 'rxjs/operators'; + +import * as AppStore from '@app/store'; +import * as SyncStore from '@app/store/messenger/sync'; +import * as RoomStore from '@app/store/messenger/room'; + +import { UserInfo } from '@ucap-webmessenger/protocol-room'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { DialogService } from '@ucap-webmessenger/ui'; +import { + SelectGroupDialogComponent, + SelectGroupDialogResult, + SelectGroupDialogData +} from '../../dialogs/group/select-group.dialog.component'; +import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; +import { + CreateChatDialogComponent, + CreateChatDialogResult, + CreateChatDialogData +} from '../../dialogs/chat/create-chat.dialog.component'; +import { UserSelectDialogType } from '@app/types'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; +import { + MessageApiService, + RetrieveRequest, + MessageType +} from '@ucap-webmessenger/api-message'; +import { DeviceType } from '@ucap-webmessenger/core'; +import { StatusCode } from '@ucap-webmessenger/api'; + +@Component({ + selector: 'app-layout-chat-right-drawer-message-box', + templateUrl: './message-box.component.html', + styleUrls: ['./message-box.component.scss'] +}) +export class MessageBoxComponent implements OnInit, OnDestroy { + userInfoList: UserInfo[]; + userInfoListSubscription: Subscription; + + loginRes: LoginResponse; + sessionVerinfo: VersionInfo2Response; + + messageSendListSubscription: Subscription; + + pageSize = 100; // default + currentPage = 0; // start index is 0. + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private dialogService: DialogService, + private messageApiService: MessageApiService + ) { + this.loginRes = this.sessionStorageService.get( + KEY_LOGIN_RES_INFO + ); + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + } + + ngOnInit() { + this.userInfoListSubscription = this.store + .pipe( + select(AppStore.MessengerSelector.RoomSelector.selectUserinfolist), + tap(userInfoList => { + this.userInfoList = userInfoList; + }) + ) + .subscribe(); + + this.messageSendListSubscription = this.messageApiService + .retrieveSendMessage({ + userSeq: this.loginRes.userSeq, + deviceType: DeviceType.PC, + tokenKey: this.loginRes.tokenString, + type: MessageType.Send, + pageSize: this.pageSize, + pageCount: this.currentPage + } as RetrieveRequest) + .pipe( + map(res => { + console.log(res); + if (res.statusCode === StatusCode.Success) { + } else { + } + }), + catchError(error => of(console.log(error))) + ) + .subscribe(); + } + + ngOnDestroy(): void { + if (!!this.userInfoListSubscription) { + this.userInfoListSubscription.unsubscribe(); + } + if (!!this.messageSendListSubscription) { + this.messageSendListSubscription.unsubscribe(); + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.html new file mode 100644 index 00000000..df71280d --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.html @@ -0,0 +1,25 @@ +
+
+ + +
+
+ + +
+
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.scss b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.scss new file mode 100644 index 00000000..4269c3e8 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.scss @@ -0,0 +1,15 @@ +.list { + width: 300px; + height: 100%; + overflow: hidden; + + .search-list { + overflow: auto; + } +} + +.btn-box { + button { + margin: 5px; + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.spec.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.spec.ts new file mode 100644 index 00000000..2509f62a --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RoomUserListComponent } from './room-user-list.component'; + +describe('RoomUserListComponent', () => { + let component: RoomUserListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RoomUserListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RoomUserListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.ts new file mode 100644 index 00000000..560935c2 --- /dev/null +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/components/right-drawer/room-user-list.component.ts @@ -0,0 +1,168 @@ +import { + Component, + OnInit, + OnDestroy, + Output, + EventEmitter, +} from '@angular/core'; +import { Subscription } from 'rxjs'; +import { Store, select } from '@ngrx/store'; +import { tap, map } from 'rxjs/operators'; + +import * as AppStore from '@app/store'; +import * as SyncStore from '@app/store/messenger/sync'; +import * as RoomStore from '@app/store/messenger/room'; + +import { UserInfo } from '@ucap-webmessenger/protocol-room'; +import { VersionInfo2Response } from '@ucap-webmessenger/api-public'; +import { SessionStorageService } from '@ucap-webmessenger/web-storage'; +import { KEY_VER_INFO } from '@app/types/ver-info.type'; +import { DialogService } from '@ucap-webmessenger/ui'; +import { + SelectGroupDialogComponent, + SelectGroupDialogResult, + SelectGroupDialogData, +} from '../../dialogs/group/select-group.dialog.component'; +import { GroupDetailData } from '@ucap-webmessenger/protocol-sync'; +import { + CreateChatDialogComponent, + CreateChatDialogResult, + CreateChatDialogData, +} from '../../dialogs/chat/create-chat.dialog.component'; +import { UserSelectDialogType } from '@app/types'; +import { LoginResponse } from '@ucap-webmessenger/protocol-authentication'; +import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type'; + +@Component({ + selector: 'app-layout-chat-right-drawer-room-user-list', + templateUrl: './room-user-list.component.html', + styleUrls: ['./room-user-list.component.scss'], +}) +export class RoomUserListComponent implements OnInit, OnDestroy { + @Output() + openProfile = new EventEmitter(); + + userInfoList: UserInfo[]; + userInfoListSubscription: Subscription; + + loginRes: LoginResponse; + sessionVerinfo: VersionInfo2Response; + + constructor( + private store: Store, + private sessionStorageService: SessionStorageService, + private dialogService: DialogService + ) { + this.loginRes = this.sessionStorageService.get( + KEY_LOGIN_RES_INFO + ); + this.sessionVerinfo = this.sessionStorageService.get( + KEY_VER_INFO + ); + } + + ngOnInit() { + this.userInfoListSubscription = this.store + .pipe( + select(AppStore.MessengerSelector.RoomSelector.selectUserinfolist), + tap(userInfoList => { + this.userInfoList = userInfoList; + }) + ) + .subscribe(); + } + + ngOnDestroy(): void { + if (!!this.userInfoListSubscription) { + this.userInfoListSubscription.unsubscribe(); + } + } + + getStatusBulkInfo(buddy: UserInfo) { + return this.store.pipe( + select( + AppStore.MessengerSelector.StatusSelector.selectEntitiesStatusBulkInfo + ), + map(statusBulkInfo => + !!statusBulkInfo ? statusBulkInfo[buddy.seq] : undefined + ) + ); + } + + onClickOpenProfile(userInfo: UserInfo) { + this.openProfile.emit(userInfo); + } + + async onClickAddMember() { + const result = await this.dialogService.open< + CreateChatDialogComponent, + CreateChatDialogData, + CreateChatDialogResult + >(CreateChatDialogComponent, { + width: '600px', + data: { + type: UserSelectDialogType.EditChatMember, + title: 'Edit Chat Member', + curRoomUser: this.userInfoList.filter( + user => user.seq !== this.loginRes.userSeq + ), + }, + }); + + if (!!result && !!result.choice && result.choice) { + const userSeqs: number[] = []; + if (!!result.selectedUserList && result.selectedUserList.length > 0) { + result.selectedUserList.map(user => { + userSeqs.push(user.seq); + }); + } + + if (userSeqs.length > 0) { + // include me + userSeqs.push(this.loginRes.userSeq); + + this.store.dispatch( + RoomStore.inviteOrOpen({ + req: { + divCd: 'Invite', + userSeqs, + }, + }) + ); + } + } + } + + async onClickAddGroup() { + const result = await this.dialogService.open< + SelectGroupDialogComponent, + SelectGroupDialogData, + SelectGroupDialogResult + >(SelectGroupDialogComponent, { + width: '600px', + data: { + title: 'Group Select', + }, + }); + + if (!!result && !!result.choice && result.choice) { + if (!!result.group) { + const oldGroup: GroupDetailData = result.group; + const trgtUserSeq: number[] = []; + result.group.userSeqs.map(seq => trgtUserSeq.push(seq)); + this.userInfoList + .filter(v => result.group.userSeqs.indexOf(v.seq) < 0) + .forEach(user => { + trgtUserSeq.push(user.seq); + }); + + this.store.dispatch( + SyncStore.updateGroupMember({ + oldGroup, + trgtUserSeq, + }) + ); + } + } + } +} diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html index 0b7338cc..efcd0f4a 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/dialogs/chat/create-chat.dialog.component.html @@ -44,7 +44,7 @@ (keyDownEnter)=" onKeyDownEnterOrganizationTenantSearch($event) " - (cancel)="onClickCancel($event)" + (cancel)="onClickCancel()" >
diff --git a/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts index a766d9e8..8a5bb275 100644 --- a/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts +++ b/projects/ucap-webmessenger-app/src/app/layouts/messenger/messenger.layout.module.ts @@ -22,7 +22,13 @@ import { MatTabsModule } from '@angular/material/tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; -import { MatCheckboxModule } from '@angular/material'; +import { + MatCheckboxModule, + MatTableModule, + MatPaginatorModule, + MatRippleModule, + MatSortModule +} from '@angular/material'; import { MatListModule } from '@angular/material/list'; import { MatChipsModule } from '@angular/material/chips'; @@ -70,6 +76,10 @@ import { DIALOGS } from './dialogs'; MatCheckboxModule, MatRadioModule, MatSelectModule, + MatTableModule, + MatSortModule, + MatPaginatorModule, + MatRippleModule, PerfectScrollbarModule, diff --git a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html index dff20e2b..29a0e328 100644 --- a/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html +++ b/projects/ucap-webmessenger-app/src/app/pages/messenger/components/main.page.component.html @@ -1,37 +1,57 @@
-
- -
- - -
- - - -
- + - - - -
+
+ +
+ + + + +
+ + + +
+ + + + +
+
+ - + - + + {{ fileInfo.fileName }} @@ -18,9 +29,20 @@ > - - + + +
(); @Output() - download = new EventEmitter(); + download = new EventEmitter(); + + fileDownloadItem: FileDownloadItem; constructor() {} ngOnInit() {} onClickDownload(): void { - this.download.emit(); + this.fileDownloadItem = new FileDownloadItem(); + this.download.emit(this.fileDownloadItem); } onClickClose(): void { diff --git a/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.html b/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.html index 6d3a0430..1d791071 100644 --- a/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.html +++ b/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/sound-viewer.component.html @@ -22,6 +22,11 @@ Close +
(); + download = new EventEmitter(); @Output() closed = new EventEmitter(); @@ -41,6 +42,7 @@ export class SoundViewerComponent implements OnInit { currentTime = 0; volume = 0.1; loading = false; + fileDownloadItem: FileDownloadItem; constructor() {} @@ -90,7 +92,8 @@ export class SoundViewerComponent implements OnInit { } onClickDownload(): void { - this.download.emit(); + this.fileDownloadItem = new FileDownloadItem(); + this.download.emit(this.fileDownloadItem); } onClickClose(): void { diff --git a/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.html b/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.html index 43b5bf3e..9a3f9778 100644 --- a/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.html +++ b/projects/ucap-webmessenger-ui/src/lib/components/file-viewer/video-viewer.component.html @@ -1,8 +1,18 @@
- + @@ -23,9 +33,20 @@ (click)="onClickDownload()" > - - + + @@ -33,16 +54,30 @@ mat-icon-button color="warn" class="ucap-image-viewer-action btn-close" - matTooltip="뷰어닫기" + matTooltip="뷰어닫기" (click)="onClickClose()" > - + +
(); + download = new EventEmitter(); @Output() closed = new EventEmitter(); @@ -41,6 +42,7 @@ export class VideoViewerComponent implements OnInit { currentTime = 0; volume = 0.1; loading = false; + fileDownloadItem: FileDownloadItem; constructor() {} @@ -90,7 +92,8 @@ export class VideoViewerComponent implements OnInit { } onClickDownload(): void { - this.download.emit(); + this.fileDownloadItem = new FileDownloadItem(); + this.download.emit(this.fileDownloadItem); } onClickClose(): void { diff --git a/projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.html b/projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.html index e99f1d24..37e8206f 100644 --- a/projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.html +++ b/projects/ucap-webmessenger-ui/src/lib/dialogs/alert.dialog.component.html @@ -9,7 +9,7 @@
- diff --git a/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.spec.ts b/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.spec.ts deleted file mode 100644 index c854451b..00000000 --- a/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* tslint:disable:no-unused-variable */ - -import { TestBed, async } from '@angular/core/testing'; -import { DatesPipe } from './dates.pipe'; - -describe('Pipe: Datese', () => { - it('create an instance', () => { - let pipe = new DatesPipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.ts b/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.ts index 51252580..2ed825bc 100644 --- a/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.ts +++ b/projects/ucap-webmessenger-ui/src/lib/pipes/dates.pipe.ts @@ -2,7 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { StringUtil } from '../utils/string.util'; @Pipe({ - name: 'dateToStringChatList' + name: 'dateToStringChatList', }) export class DateToStringForChatRoomListPipe implements PipeTransform { transform(value: any): string { @@ -36,3 +36,18 @@ export class DateToStringForChatRoomListPipe implements PipeTransform { } } } + +@Pipe({ + name: 'dateToStringFormat', +}) +export class DateToStringFormatPipe implements PipeTransform { + transform(value: any, format?: string): string { + const date = new Date(value.toString()); + + if (!!format) { + return StringUtil.dateFormat(date, format); + } else { + return StringUtil.dateFormat(date, 'YYYY.MM.DD'); + } + } +} diff --git a/projects/ucap-webmessenger-ui/src/lib/pipes/linefeed.pipe.spec.ts b/projects/ucap-webmessenger-ui/src/lib/pipes/linefeed.pipe.spec.ts deleted file mode 100644 index 36d41f53..00000000 --- a/projects/ucap-webmessenger-ui/src/lib/pipes/linefeed.pipe.spec.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* tslint:disable:no-unused-variable */ - -import { TestBed, async } from '@angular/core/testing'; -import { LinefeedPipe } from './linefeed.pipe'; - -describe('Pipe: Linefeede', () => { - it('create an instance', () => { - let pipe = new LinefeedPipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/projects/ucap-webmessenger-ui/src/lib/ucap-ui.module.ts b/projects/ucap-webmessenger-ui/src/lib/ucap-ui.module.ts index fb3aebea..e536581a 100644 --- a/projects/ucap-webmessenger-ui/src/lib/ucap-ui.module.ts +++ b/projects/ucap-webmessenger-ui/src/lib/ucap-ui.module.ts @@ -39,7 +39,10 @@ import { ConfirmDialogComponent } from './dialogs/confirm.dialog.component'; import { BytesPipe } from './pipes/bytes.pipe'; import { LinefeedToHtmlPipe, HtmlToLinefeedPipe } from './pipes/linefeed.pipe'; -import { DateToStringForChatRoomListPipe } from './pipes/dates.pipe'; +import { + DateToStringForChatRoomListPipe, + DateToStringFormatPipe, +} from './pipes/dates.pipe'; import { SecondsToMinutesPipe } from './pipes/seconds-to-minutes.pipe'; const COMPONENTS = [ @@ -51,26 +54,27 @@ const COMPONENTS = [ DocumentViewerComponent, ImageViewerComponent, SoundViewerComponent, - VideoViewerComponent + VideoViewerComponent, ]; const DIALOGS = [AlertDialogComponent, ConfirmDialogComponent]; const DIRECTIVES = [ ClickOutsideDirective, FileUploadForDirective, - ImageDirective + ImageDirective, ]; const PIPES = [ BytesPipe, LinefeedToHtmlPipe, HtmlToLinefeedPipe, DateToStringForChatRoomListPipe, - SecondsToMinutesPipe + DateToStringFormatPipe, + SecondsToMinutesPipe, ]; const SERVICES = [ BottomSheetService, ClipboardService, DialogService, - SnackBarService + SnackBarService, ]; @NgModule({ @@ -86,17 +90,17 @@ const SERVICES = [ MatSnackBarModule, MatToolbarModule, MatTooltipModule, - DragDropModule + DragDropModule, ], exports: [...COMPONENTS, ...DIRECTIVES, ...PIPES], declarations: [...COMPONENTS, ...DIALOGS, ...DIRECTIVES, ...PIPES], - entryComponents: [...DIALOGS] + entryComponents: [...DIALOGS], }) export class UCapUiModule { public static forRoot(): ModuleWithProviders { return { ngModule: UCapUiModule, - providers: [...SERVICES] + providers: [...SERVICES], }; } } diff --git a/projects/ucap-webmessenger-ui/src/lib/utils/string.util.ts b/projects/ucap-webmessenger-ui/src/lib/utils/string.util.ts index f348f5af..af71eb99 100644 --- a/projects/ucap-webmessenger-ui/src/lib/utils/string.util.ts +++ b/projects/ucap-webmessenger-ui/src/lib/utils/string.util.ts @@ -2,7 +2,7 @@ import { EventType, EventJson, FileEventJson, - MassTextEventJson + MassTextEventJson, } from '@ucap-webmessenger/protocol-event'; import { FileType } from '@ucap-webmessenger/protocol-file'; @@ -79,7 +79,7 @@ export class StringUtil { '수요일', '목요일', '금요일', - '토요일' + '토요일', ]; const weekKorShortName = ['일', '월', '화', '수', '목', '금', '토']; @@ -91,56 +91,62 @@ export class StringUtil { 'Wednesday', 'Thursday', 'Friday', - 'Saturday' + 'Saturday', ]; const weekEngShortName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; - return f.replace(/(yyyy|yy|MM|dd|KS|KL|ES|EL|HH|hh|mm|ss|a\/p)/gi, $1 => { - switch ($1) { - case 'yyyy': - return date.getFullYear().toString(); // 년 (4자리) + return f.replace( + /(YYYY|yyyy|YY|yy|MM|DD|dd|KS|KL|ES|EL|HH|hh|mm|ss|a\/p)/gi, + $1 => { + switch ($1) { + case 'YYYY': + case 'yyyy': + return date.getFullYear().toString(); // 년 (4자리) - case 'yy': - return StringUtil.zeroFill(date.getFullYear() % 1000, 2); // 년 (2자리) + case 'YY': + case 'yy': + return StringUtil.zeroFill(date.getFullYear() % 1000, 2); // 년 (2자리) - case 'MM': - return StringUtil.zeroFill(date.getMonth() + 1, 2); // 월 (2자리) + case 'MM': + return StringUtil.zeroFill(date.getMonth() + 1, 2); // 월 (2자리) - case 'dd': - return StringUtil.zeroFill(date.getDate(), 2); // 일 (2자리) + case 'DD': + case 'dd': + return StringUtil.zeroFill(date.getDate(), 2); // 일 (2자리) - case 'KS': - return weekKorShortName[date.getDay()]; // 요일 (짧은 한글) + case 'KS': + return weekKorShortName[date.getDay()]; // 요일 (짧은 한글) - case 'KL': - return weekKorName[date.getDay()]; // 요일 (긴 한글) + case 'KL': + return weekKorName[date.getDay()]; // 요일 (긴 한글) - case 'ES': - return weekEngShortName[date.getDay()]; // 요일 (짧은 영어) + case 'ES': + return weekEngShortName[date.getDay()]; // 요일 (짧은 영어) - case 'EL': - return weekEngName[date.getDay()]; // 요일 (긴 영어) + case 'EL': + return weekEngName[date.getDay()]; // 요일 (긴 영어) - case 'HH': - return StringUtil.zeroFill(date.getHours(), 2); // 시간 (24시간 기준, 2자리) + case 'HH': + return StringUtil.zeroFill(date.getHours(), 2); // 시간 (24시간 기준, 2자리) - case 'hh': - return StringUtil.zeroFill(date.getHours() % 12, 2); // 시간 (12시간 기준, 2자리) + case 'hh': + return StringUtil.zeroFill(date.getHours() % 12, 2); // 시간 (12시간 기준, 2자리) - case 'mm': - return StringUtil.zeroFill(date.getMinutes(), 2); // 분 (2자리) + case 'mm': + return StringUtil.zeroFill(date.getMinutes(), 2); // 분 (2자리) - case 'ss': - return StringUtil.zeroFill(date.getSeconds(), 2); // 초 (2자리) + case 'ss': + return StringUtil.zeroFill(date.getSeconds(), 2); // 초 (2자리) - case 'a/p': - return date.getHours() < 12 ? '오전' : '오후'; // 오전/오후 구분 + case 'a/p': + return date.getHours() < 12 ? '오전' : '오후'; // 오전/오후 구분 - default: - return $1; + default: + return $1; + } } - }); + ); } public static convertFinalEventMessage( diff --git a/tsconfig.json b/tsconfig.json index d28256cd..d45269df 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,10 @@ "module": "esnext", "moduleResolution": "node", "importHelpers": true, - "target": "es5", + "target": "es2015", "typeRoots": ["node_modules/@types"], "lib": ["es2018", "dom"], "paths": { - "@app/*": ["projects/ucap-webmessenger-app/src/app/*"], "@ucap-webmessenger/core": [ "projects/ucap-webmessenger-core/src/public-api" ], @@ -31,6 +30,9 @@ "@ucap-webmessenger/api-external": [ "projects/ucap-webmessenger-api-external/src/public-api" ], + "@ucap-webmessenger/api-message": [ + "projects/ucap-webmessenger-api-message/src/public-api" + ], "@ucap-webmessenger/pi": ["projects/ucap-webmessenger-pi/src/public-api"], "@ucap-webmessenger/ui": ["projects/ucap-webmessenger-ui/src/public-api"], "@ucap-webmessenger/ui-account": [ @@ -126,6 +128,7 @@ "@ucap-webmessenger/util": [ "projects/ucap-webmessenger-util/src/public-api" ], + "@app/*": ["projects/ucap-webmessenger-app/src/app/*"], "@ucap-webmessenger/electron-core": [ "electron-projects/ucap-webmessenger-electron-core/src/public-api" ],