sync
This commit is contained in:
parent
62314da2ad
commit
0c9867beb9
160
angular.json
160
angular.json
|
@ -1526,6 +1526,166 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"api-webex": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/api-webex",
|
||||||
|
"sourceRoot": "projects/api-webex/src",
|
||||||
|
"prefix": "lib",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/api-webex/tsconfig.lib.json",
|
||||||
|
"project": "projects/api-webex/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/api-webex/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/api-webex/src/test.ts",
|
||||||
|
"tsConfig": "projects/api-webex/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/api-webex/karma.conf.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"builder": "@angular-devkit/build-angular:tslint",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": [
|
||||||
|
"projects/api-webex/tsconfig.lib.json",
|
||||||
|
"projects/api-webex/tsconfig.spec.json"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"**/node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ui-call": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/ui-call",
|
||||||
|
"sourceRoot": "projects/ui-call/src",
|
||||||
|
"prefix": "lib",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/ui-call/tsconfig.lib.json",
|
||||||
|
"project": "projects/ui-call/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/ui-call/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/ui-call/src/test.ts",
|
||||||
|
"tsConfig": "projects/ui-call/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/ui-call/karma.conf.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"builder": "@angular-devkit/build-angular:tslint",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": [
|
||||||
|
"projects/ui-call/tsconfig.lib.json",
|
||||||
|
"projects/ui-call/tsconfig.spec.json"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"**/node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"api-contact": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/api-contact",
|
||||||
|
"sourceRoot": "projects/api-contact/src",
|
||||||
|
"prefix": "lib",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/api-contact/tsconfig.lib.json",
|
||||||
|
"project": "projects/api-contact/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/api-contact/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/api-contact/src/test.ts",
|
||||||
|
"tsConfig": "projects/api-contact/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/api-contact/karma.conf.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"builder": "@angular-devkit/build-angular:tslint",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": [
|
||||||
|
"projects/api-contact/tsconfig.lib.json",
|
||||||
|
"projects/api-contact/tsconfig.spec.json"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"**/node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"store-call": {
|
||||||
|
"projectType": "library",
|
||||||
|
"root": "projects/store-call",
|
||||||
|
"sourceRoot": "projects/store-call/src",
|
||||||
|
"prefix": "lib",
|
||||||
|
"architect": {
|
||||||
|
"build": {
|
||||||
|
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": "projects/store-call/tsconfig.lib.json",
|
||||||
|
"project": "projects/store-call/ng-package.json"
|
||||||
|
},
|
||||||
|
"configurations": {
|
||||||
|
"production": {
|
||||||
|
"tsConfig": "projects/store-call/tsconfig.lib.prod.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"builder": "@angular-devkit/build-angular:karma",
|
||||||
|
"options": {
|
||||||
|
"main": "projects/store-call/src/test.ts",
|
||||||
|
"tsConfig": "projects/store-call/tsconfig.spec.json",
|
||||||
|
"karmaConfig": "projects/store-call/karma.conf.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"builder": "@angular-devkit/build-angular:tslint",
|
||||||
|
"options": {
|
||||||
|
"tsConfig": [
|
||||||
|
"projects/store-call/tsconfig.lib.json",
|
||||||
|
"projects/store-call/tsconfig.spec.json"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"**/node_modules/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cli": {
|
"cli": {
|
||||||
|
|
4397
package-lock.json
generated
4397
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
118
package.json
118
package.json
|
@ -7,12 +7,14 @@
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
"build": "ng build",
|
"build": "ng build",
|
||||||
"build:all": "npm-run-all -s build:logger build:core build:util:all build:api:all build:protocol:all build:native:all build:store:all build:ui-material:all build:ui:all build:ui-skin:all",
|
"build:all": "npm-run-all -s build:logger build:core build:util:all build:api:all build:protocol:all build:native:all build:store:all build:ui-material:all build:ui:all build:ui-skin:all",
|
||||||
"build:api:all": "npm-run-all -s build:api-common build:api-external build:api-message build:api-prompt build:api-public build:pi",
|
"build:api:all": "npm-run-all -s build:api-common build:api-external build:api-message build:api-prompt build:api-webex build:api-contact build:api-public build:pi",
|
||||||
"build:api-common": "node ./scripts/build.js api-common",
|
"build:api-common": "node ./scripts/build.js api-common",
|
||||||
"build:api-external": "node ./scripts/build.js api-external",
|
"build:api-external": "node ./scripts/build.js api-external",
|
||||||
"build:api-message": "node ./scripts/build.js api-message",
|
"build:api-message": "node ./scripts/build.js api-message",
|
||||||
"build:api-prompt": "node ./scripts/build.js api-prompt",
|
"build:api-prompt": "node ./scripts/build.js api-prompt",
|
||||||
"build:api-public": "node ./scripts/build.js api-public",
|
"build:api-public": "node ./scripts/build.js api-public",
|
||||||
|
"build:api-webex": "node ./scripts/build.js api-webex",
|
||||||
|
"build:api-contact": "node ./scripts/build.js api-contact",
|
||||||
"build:pi": "node ./scripts/build.js pi",
|
"build:pi": "node ./scripts/build.js pi",
|
||||||
"build:core": "node ./scripts/build.js core",
|
"build:core": "node ./scripts/build.js core",
|
||||||
"build:logger": "node ./scripts/build.js logger",
|
"build:logger": "node ./scripts/build.js logger",
|
||||||
|
@ -39,28 +41,32 @@
|
||||||
"build:web-socket": "node ./scripts/build.js web-socket",
|
"build:web-socket": "node ./scripts/build.js web-socket",
|
||||||
"build:web-storage": "node ./scripts/build.js web-storage",
|
"build:web-storage": "node ./scripts/build.js web-storage",
|
||||||
"build:i18n": "node ./scripts/build.js i18n",
|
"build:i18n": "node ./scripts/build.js i18n",
|
||||||
"build:store:all": "npm-run-all -s build:store-authentication build:store-organization build:store-group build:store-chat",
|
"build:store:all": "npm-run-all -s build:store-authentication build:store-organization build:store-group build:store-chat build:store-call",
|
||||||
"build:store-authentication": "node ./scripts/build.js store-authentication",
|
"build:store-authentication": "node ./scripts/build.js store-authentication",
|
||||||
"build:store-chat": "node ./scripts/build.js store-chat",
|
"build:store-chat": "node ./scripts/build.js store-chat",
|
||||||
"build:store-group": "node ./scripts/build.js store-group",
|
"build:store-group": "node ./scripts/build.js store-group",
|
||||||
"build:store-organization": "node ./scripts/build.js store-organization",
|
"build:store-organization": "node ./scripts/build.js store-organization",
|
||||||
|
"build:store-call": "node ./scripts/build.js store-call",
|
||||||
"build:ui-material:all": "npm-run-all -s build:ui-material",
|
"build:ui-material:all": "npm-run-all -s build:ui-material",
|
||||||
"build:ui-material": "node ./scripts/build.js ui-material useScssBundle",
|
"build:ui-material": "node ./scripts/build.js ui-material useScssBundle",
|
||||||
"build:ui:all": "npm-run-all -s build:ui build:ui-organization build:ui-authentication build:ui-group build:ui-chat",
|
"build:ui:all": "npm-run-all -s build:ui build:ui-organization build:ui-authentication build:ui-group build:ui-chat build:ui-call",
|
||||||
"build:ui": "node ./scripts/build.js ui useScssBundle",
|
"build:ui": "node ./scripts/build.js ui useScssBundle",
|
||||||
"build:ui-organization": "node ./scripts/build.js ui-organization useScssBundle",
|
"build:ui-organization": "node ./scripts/build.js ui-organization useScssBundle",
|
||||||
"build:ui-authentication": "node ./scripts/build.js ui-authentication useScssBundle",
|
"build:ui-authentication": "node ./scripts/build.js ui-authentication useScssBundle",
|
||||||
"build:ui-group": "node ./scripts/build.js ui-group useScssBundle",
|
"build:ui-group": "node ./scripts/build.js ui-group useScssBundle",
|
||||||
"build:ui-chat": "node ./scripts/build.js ui-chat useScssBundle",
|
"build:ui-chat": "node ./scripts/build.js ui-chat useScssBundle",
|
||||||
|
"build:ui-call": "node ./scripts/build.js ui-call useScssBundle",
|
||||||
"build:ui-skin:all": "npm-run-all -s build:ui-skin-default",
|
"build:ui-skin:all": "npm-run-all -s build:ui-skin-default",
|
||||||
"build:ui-skin-default": "node ./scripts/build.js ui-skin-default useScssBundle",
|
"build:ui-skin-default": "node ./scripts/build.js ui-skin-default useScssBundle",
|
||||||
"publish:all": "npm-run-all -s publish:logger publish:core publish:util:all publish:api:all publish:protocol:all publish:native:all publish:store:all publish:ui-material:all publish:ui:all publish:ui-skin:all",
|
"publish:all": "npm-run-all -s publish:logger publish:core publish:util:all publish:api:all publish:protocol:all publish:native:all publish:store:all publish:ui-material:all publish:ui:all publish:ui-skin:all",
|
||||||
"publish:api:all": "npm-run-all -s publish:api-common publish:api-external publish:api-message publish:api-prompt publish:api-public publish:pi",
|
"publish:api:all": "npm-run-all -s publish:api-common publish:api-external publish:api-message publish:api-prompt publish:api-webex publish:api-contact publish:api-public publish:pi",
|
||||||
"publish:api-common": "cd ./dist/api-common && npm publish",
|
"publish:api-common": "cd ./dist/api-common && npm publish",
|
||||||
"publish:api-external": "cd ./dist/api-external && npm publish",
|
"publish:api-external": "cd ./dist/api-external && npm publish",
|
||||||
"publish:api-message": "cd ./dist/api-message && npm publish",
|
"publish:api-message": "cd ./dist/api-message && npm publish",
|
||||||
"publish:api-prompt": "cd ./dist/api-prompt && npm publish",
|
"publish:api-prompt": "cd ./dist/api-prompt && npm publish",
|
||||||
"publish:api-public": "cd ./dist/api-public && npm publish",
|
"publish:api-public": "cd ./dist/api-public && npm publish",
|
||||||
|
"publish:api-webex": "cd ./dist/api-webex && npm publish",
|
||||||
|
"publish:api-contact": "cd ./dist/api-contact && npm publish",
|
||||||
"publish:pi": "cd ./dist/pi && npm publish",
|
"publish:pi": "cd ./dist/pi && npm publish",
|
||||||
"publish:core": "cd ./dist/core && npm publish",
|
"publish:core": "cd ./dist/core && npm publish",
|
||||||
"publish:logger": "cd ./dist/logger && npm publish",
|
"publish:logger": "cd ./dist/logger && npm publish",
|
||||||
|
@ -87,19 +93,21 @@
|
||||||
"publish:web-socket": "cd ./dist/web-socket && npm publish",
|
"publish:web-socket": "cd ./dist/web-socket && npm publish",
|
||||||
"publish:web-storage": "cd ./dist/web-storage && npm publish",
|
"publish:web-storage": "cd ./dist/web-storage && npm publish",
|
||||||
"publish:i18n": "cd ./dist/i18n && npm publish",
|
"publish:i18n": "cd ./dist/i18n && npm publish",
|
||||||
"publish:store:all": "npm-run-all -s publish:store-organization publish:store-authentication publish:store-group publish:store-chat",
|
"publish:store:all": "npm-run-all -s publish:store-organization publish:store-authentication publish:store-group publish:store-chat publish:store-call",
|
||||||
"publish:store-authentication": "cd ./dist/store-authentication && npm publish",
|
"publish:store-authentication": "cd ./dist/store-authentication && npm publish",
|
||||||
"publish:store-chat": "cd ./dist/store-chat && npm publish",
|
"publish:store-chat": "cd ./dist/store-chat && npm publish",
|
||||||
"publish:store-group": "cd ./dist/store-group && npm publish",
|
"publish:store-group": "cd ./dist/store-group && npm publish",
|
||||||
"publish:store-organization": "cd ./dist/store-organization && npm publish",
|
"publish:store-organization": "cd ./dist/store-organization && npm publish",
|
||||||
|
"publish:store-call": "cd ./dist/store-call && npm publish",
|
||||||
"publish:ui-material:all": "npm-run-all -s publish:ui-material",
|
"publish:ui-material:all": "npm-run-all -s publish:ui-material",
|
||||||
"publish:ui-material": "cd ./dist/ui-material && npm publish",
|
"publish:ui-material": "cd ./dist/ui-material && npm publish",
|
||||||
"publish:ui:all": "npm-run-all -s publish:ui publish:ui-organization publish:ui-authentication publish:ui-group publish:ui-chat",
|
"publish:ui:all": "npm-run-all -s publish:ui publish:ui-organization publish:ui-authentication publish:ui-group publish:ui-chat publish:ui-call",
|
||||||
"publish:ui": "cd ./dist/ui && npm publish",
|
"publish:ui": "cd ./dist/ui && npm publish",
|
||||||
"publish:ui-organization": "cd ./dist/ui-organization && npm publish",
|
"publish:ui-organization": "cd ./dist/ui-organization && npm publish",
|
||||||
"publish:ui-authentication": "cd ./dist/ui-authentication && npm publish",
|
"publish:ui-authentication": "cd ./dist/ui-authentication && npm publish",
|
||||||
"publish:ui-group": "cd ./dist/ui-group && npm publish",
|
"publish:ui-group": "cd ./dist/ui-group && npm publish",
|
||||||
"publish:ui-chat": "cd ./dist/ui-chat && npm publish",
|
"publish:ui-chat": "cd ./dist/ui-chat && npm publish",
|
||||||
|
"publish:ui-call": "cd ./dist/ui-call && npm publish",
|
||||||
"publish:ui-skin:all": "npm-run-all -s publish:ui-skin-default",
|
"publish:ui-skin:all": "npm-run-all -s publish:ui-skin-default",
|
||||||
"publish:ui-skin-default": "cd ./dist/ui-skin-default && npm publish",
|
"publish:ui-skin-default": "cd ./dist/ui-skin-default && npm publish",
|
||||||
"test": "ng test",
|
"test": "ng test",
|
||||||
|
@ -108,7 +116,9 @@
|
||||||
"storybook": "start-storybook -p 6006",
|
"storybook": "start-storybook -p 6006",
|
||||||
"build-storybook": "build-storybook"
|
"build-storybook": "build-storybook"
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {
|
||||||
|
"tslib": "^1.10.0"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "^0.900.6",
|
"@angular-devkit/build-angular": "^0.900.6",
|
||||||
"@angular-devkit/build-ng-packagr": "^0.900.6",
|
"@angular-devkit/build-ng-packagr": "^0.900.6",
|
||||||
|
@ -143,24 +153,38 @@
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@types/jasminewd2": "~2.0.3",
|
||||||
"@types/moment-timezone": "^0.5.12",
|
"@types/moment-timezone": "^0.5.12",
|
||||||
"@types/node": "^12.12.30",
|
"@types/node": "^12.12.30",
|
||||||
"@ucap/api": "~0.0.1",
|
"@ucap/api": "~0.0.5",
|
||||||
"@ucap/api-common": "~0.0.7",
|
"@ucap/api-common": "~0.0.12",
|
||||||
"@ucap/api-external": "~0.0.2",
|
"@ucap/api-contact": "~0.0.5",
|
||||||
"@ucap/api-message": "~0.0.1",
|
"@ucap/api-external": "~0.0.8",
|
||||||
"@ucap/api-prompt": "~0.0.1",
|
"@ucap/api-message": "~0.0.7",
|
||||||
"@ucap/api-public": "~0.0.1",
|
"@ucap/api-prompt": "~0.0.6",
|
||||||
"@ucap/core": "~0.0.14",
|
"@ucap/api-public": "~0.0.6",
|
||||||
"@ucap/logger": "~0.0.12",
|
"@ucap/api-webex": "~0.0.2",
|
||||||
"@ucap/native": "~0.0.19",
|
"@ucap/core": "~0.0.15",
|
||||||
|
"@ucap/domain-authentication": "~0.0.4",
|
||||||
|
"@ucap/domain-authorization": "~0.0.3",
|
||||||
|
"@ucap/domain-call": "~0.0.4",
|
||||||
|
"@ucap/domain-chat": "~0.0.3",
|
||||||
|
"@ucap/domain-common": "~0.0.1",
|
||||||
|
"@ucap/domain-group": "~0.0.2",
|
||||||
|
"@ucap/domain-message": "~0.0.1",
|
||||||
|
"@ucap/domain-organization": "~0.0.1",
|
||||||
|
"@ucap/domain-status": "~0.0.1",
|
||||||
|
"@ucap/i18n": "~0.0.2",
|
||||||
|
"@ucap/logger": "~0.0.14",
|
||||||
|
"@ucap/native": "~0.0.27",
|
||||||
"@ucap/ng-api-common": "file:pack/ucap-ng-api-common-0.0.1.tgz",
|
"@ucap/ng-api-common": "file:pack/ucap-ng-api-common-0.0.1.tgz",
|
||||||
|
"@ucap/ng-api-contact": "file:pack/ucap-ng-api-contact-0.0.2.tgz",
|
||||||
"@ucap/ng-api-external": "file:pack/ucap-ng-api-external-0.0.1.tgz",
|
"@ucap/ng-api-external": "file:pack/ucap-ng-api-external-0.0.1.tgz",
|
||||||
"@ucap/ng-api-message": "file:pack/ucap-ng-api-message-0.0.1.tgz",
|
"@ucap/ng-api-message": "file:pack/ucap-ng-api-message-0.0.1.tgz",
|
||||||
"@ucap/ng-api-prompt": "file:pack/ucap-ng-api-prompt-0.0.1.tgz",
|
"@ucap/ng-api-prompt": "file:pack/ucap-ng-api-prompt-0.0.1.tgz",
|
||||||
"@ucap/ng-api-public": "file:pack/ucap-ng-api-public-0.0.1.tgz",
|
"@ucap/ng-api-public": "file:pack/ucap-ng-api-public-0.0.1.tgz",
|
||||||
"@ucap/ng-core": "file:pack/ucap-ng-core-0.0.7.tgz",
|
"@ucap/ng-api-webex": "file:pack/ucap-ng-api-webex-0.0.1.tgz",
|
||||||
"@ucap/ng-i18n": "file:pack/ucap-ng-i18n-0.0.6.tgz",
|
"@ucap/ng-core": "file:pack/ucap-ng-core-0.0.9.tgz",
|
||||||
|
"@ucap/ng-i18n": "file:pack/ucap-ng-i18n-0.0.8.tgz",
|
||||||
"@ucap/ng-logger": "file:pack/ucap-ng-logger-0.0.2.tgz",
|
"@ucap/ng-logger": "file:pack/ucap-ng-logger-0.0.2.tgz",
|
||||||
"@ucap/ng-native": "file:pack/ucap-ng-native-0.0.5.tgz",
|
"@ucap/ng-native": "file:pack/ucap-ng-native-0.0.12.tgz",
|
||||||
"@ucap/ng-pi": "file:pack/ucap-ng-pi-0.0.1.tgz",
|
"@ucap/ng-pi": "file:pack/ucap-ng-pi-0.0.1.tgz",
|
||||||
"@ucap/ng-protocol": "file:pack/ucap-ng-protocol-0.0.3.tgz",
|
"@ucap/ng-protocol": "file:pack/ucap-ng-protocol-0.0.3.tgz",
|
||||||
"@ucap/ng-protocol-authentication": "file:pack/ucap-ng-protocol-authentication-0.0.3.tgz",
|
"@ucap/ng-protocol-authentication": "file:pack/ucap-ng-protocol-authentication-0.0.3.tgz",
|
||||||
|
@ -178,39 +202,41 @@
|
||||||
"@ucap/ng-protocol-status": "file:pack/ucap-ng-protocol-status-0.0.3.tgz",
|
"@ucap/ng-protocol-status": "file:pack/ucap-ng-protocol-status-0.0.3.tgz",
|
||||||
"@ucap/ng-protocol-sync": "file:pack/ucap-ng-protocol-sync-0.0.3.tgz",
|
"@ucap/ng-protocol-sync": "file:pack/ucap-ng-protocol-sync-0.0.3.tgz",
|
||||||
"@ucap/ng-protocol-umg": "file:pack/ucap-ng-protocol-umg-0.0.3.tgz",
|
"@ucap/ng-protocol-umg": "file:pack/ucap-ng-protocol-umg-0.0.3.tgz",
|
||||||
"@ucap/ng-store-authentication": "file:pack/ucap-ng-store-authentication-0.0.14.tgz",
|
"@ucap/ng-store-authentication": "file:pack/ucap-ng-store-authentication-0.0.17.tgz",
|
||||||
"@ucap/ng-store-chat": "file:pack/ucap-ng-store-chat-0.0.66.tgz",
|
"@ucap/ng-store-call": "file:pack/ucap-ng-store-call-0.0.7.tgz",
|
||||||
"@ucap/ng-store-group": "file:pack/ucap-ng-store-group-0.0.22.tgz",
|
"@ucap/ng-store-chat": "file:pack/ucap-ng-store-chat-0.0.74.tgz",
|
||||||
"@ucap/ng-store-organization": "file:pack/ucap-ng-store-organization-0.0.20.tgz",
|
"@ucap/ng-store-group": "file:pack/ucap-ng-store-group-0.0.25.tgz",
|
||||||
"@ucap/ng-ui": "file:pack/ucap-ng-ui-0.0.97.tgz",
|
"@ucap/ng-store-organization": "file:pack/ucap-ng-store-organization-0.0.23.tgz",
|
||||||
"@ucap/ng-ui-authentication": "file:pack/ucap-ng-ui-authentication-0.0.29.tgz",
|
"@ucap/ng-ui": "file:pack/ucap-ng-ui-0.0.108.tgz",
|
||||||
"@ucap/ng-ui-chat": "file:pack/ucap-ng-ui-chat-0.0.72.tgz",
|
"@ucap/ng-ui-authentication": "file:pack/ucap-ng-ui-authentication-0.0.32.tgz",
|
||||||
"@ucap/ng-ui-group": "file:pack/ucap-ng-ui-group-0.0.78.tgz",
|
"@ucap/ng-ui-call": "file:pack/ucap-ng-ui-call-0.0.15.tgz",
|
||||||
|
"@ucap/ng-ui-chat": "file:pack/ucap-ng-ui-chat-0.0.80.tgz",
|
||||||
|
"@ucap/ng-ui-group": "file:pack/ucap-ng-ui-group-0.0.87.tgz",
|
||||||
"@ucap/ng-ui-material": "file:pack/ucap-ng-ui-material-0.0.4.tgz",
|
"@ucap/ng-ui-material": "file:pack/ucap-ng-ui-material-0.0.4.tgz",
|
||||||
"@ucap/ng-ui-organization": "file:pack/ucap-ng-ui-organization-0.0.202.tgz",
|
"@ucap/ng-ui-organization": "file:pack/ucap-ng-ui-organization-0.0.222.tgz",
|
||||||
"@ucap/ng-ui-skin-default": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz",
|
"@ucap/ng-ui-skin-default": "file:pack/ucap-ng-ui-skin-default-0.0.1.tgz",
|
||||||
"@ucap/ng-web-socket": "file:pack/ucap-ng-web-socket-0.0.2.tgz",
|
"@ucap/ng-web-socket": "file:pack/ucap-ng-web-socket-0.0.2.tgz",
|
||||||
"@ucap/ng-web-storage": "file:pack/ucap-ng-web-storage-0.0.3.tgz",
|
"@ucap/ng-web-storage": "file:pack/ucap-ng-web-storage-0.0.3.tgz",
|
||||||
"@ucap/pi": "~0.0.8",
|
"@ucap/pi": "~0.0.9",
|
||||||
"@ucap/protocol": "~0.0.11",
|
"@ucap/protocol": "~0.0.20",
|
||||||
"@ucap/protocol-authentication": "~0.0.5",
|
"@ucap/protocol-authentication": "~0.0.7",
|
||||||
"@ucap/protocol-buddy": "~0.0.5",
|
"@ucap/protocol-buddy": "~0.0.6",
|
||||||
"@ucap/protocol-event": "~0.0.6",
|
"@ucap/protocol-event": "~0.0.11",
|
||||||
"@ucap/protocol-file": "~0.0.6",
|
"@ucap/protocol-file": "~0.0.7",
|
||||||
"@ucap/protocol-group": "~0.0.5",
|
"@ucap/protocol-group": "~0.0.6",
|
||||||
"@ucap/protocol-info": "~0.0.9",
|
"@ucap/protocol-info": "~0.0.10",
|
||||||
"@ucap/protocol-inner": "~0.0.4",
|
"@ucap/protocol-inner": "~0.0.5",
|
||||||
"@ucap/protocol-option": "~0.0.7",
|
"@ucap/protocol-option": "~0.0.9",
|
||||||
"@ucap/protocol-ping": "~0.0.4",
|
"@ucap/protocol-ping": "~0.0.7",
|
||||||
"@ucap/protocol-query": "~0.0.5",
|
"@ucap/protocol-query": "~0.0.8",
|
||||||
"@ucap/protocol-room": "~0.0.7",
|
"@ucap/protocol-room": "~0.0.9",
|
||||||
"@ucap/protocol-service": "~0.0.4",
|
"@ucap/protocol-service": "~0.0.5",
|
||||||
"@ucap/protocol-status": "~0.0.5",
|
"@ucap/protocol-status": "~0.0.6",
|
||||||
"@ucap/protocol-sync": "~0.0.6",
|
"@ucap/protocol-sync": "~0.0.8",
|
||||||
"@ucap/protocol-umg": "~0.0.5",
|
"@ucap/protocol-umg": "~0.0.5",
|
||||||
"@ucap/ui-scss": "~0.0.5",
|
"@ucap/ui-scss": "~0.0.5",
|
||||||
"@ucap/web-socket": "~0.0.5",
|
"@ucap/web-socket": "~0.0.10",
|
||||||
"@ucap/web-storage": "~0.0.5",
|
"@ucap/web-storage": "~0.0.9",
|
||||||
"autolinker": "^3.13.0",
|
"autolinker": "^3.13.0",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"babel-loader": "^8.1.0",
|
"babel-loader": "^8.1.0",
|
||||||
|
|
24
projects/api-contact/README.md
Normal file
24
projects/api-contact/README.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# ApiContact
|
||||||
|
|
||||||
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.11.
|
||||||
|
|
||||||
|
## Code scaffolding
|
||||||
|
|
||||||
|
Run `ng generate component component-name --project api-contact` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project api-contact`.
|
||||||
|
> Note: Don't forget to add `--project api-contact` or else it will be added to the default project in your `angular.json` file.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Run `ng build api-contact` to build the project. The build artifacts will be stored in the `dist/` directory.
|
||||||
|
|
||||||
|
## Publishing
|
||||||
|
|
||||||
|
After building your library with `ng build api-contact`, go to the dist folder `cd dist/api-contact` and run `npm publish`.
|
||||||
|
|
||||||
|
## Running unit tests
|
||||||
|
|
||||||
|
Run `ng test api-contact` 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).
|
32
projects/api-contact/karma.conf.js
Normal file
32
projects/api-contact/karma.conf.js
Normal file
|
@ -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/api-contact'),
|
||||||
|
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
|
||||||
|
});
|
||||||
|
};
|
11
projects/api-contact/ng-package.json
Normal file
11
projects/api-contact/ng-package.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||||
|
"dest": "../../dist/api-contact",
|
||||||
|
"lib": {
|
||||||
|
"entryFile": "src/public-api.ts",
|
||||||
|
"umdModuleIds": {
|
||||||
|
"@ucap/api-contact": "@ucap/api-contact",
|
||||||
|
"@ucap/ng-core": "@ucap/ng-core"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
projects/api-contact/package.json
Normal file
16
projects/api-contact/package.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "@ucap/ng-api-contact",
|
||||||
|
"version": "0.0.2",
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^9.0.2",
|
||||||
|
"@angular/core": "^9.0.2",
|
||||||
|
"@ucap/api-contact": "~0.0.1",
|
||||||
|
"@ucap/ng-core": "~0.0.1",
|
||||||
|
"axios": "^0.19.2",
|
||||||
|
"rxjs": "~6.5.4",
|
||||||
|
"tslib": "^1.10.0"
|
||||||
|
}
|
||||||
|
}
|
5
projects/api-contact/src/lib/config/token.ts
Normal file
5
projects/api-contact/src/lib/config/token.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import { InjectionToken } from '@angular/core';
|
||||||
|
|
||||||
|
export const _MODULE_CONFIG = new InjectionToken(
|
||||||
|
'@ucap/ng api-contact config of module'
|
||||||
|
);
|
24
projects/api-contact/src/lib/contact-api.module.ts
Normal file
24
projects/api-contact/src/lib/contact-api.module.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import { NgModule, ModuleWithProviders } from '@angular/core';
|
||||||
|
|
||||||
|
import { ModuleConfig } from '@ucap/api-contact';
|
||||||
|
|
||||||
|
import { _MODULE_CONFIG } from './config/token';
|
||||||
|
|
||||||
|
import { ContactApiService } from './services/contact-api.service';
|
||||||
|
|
||||||
|
const SERVICES = [ContactApiService];
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class ContactApiRootModule {}
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class ContactApiModule {
|
||||||
|
public static forRoot(
|
||||||
|
config: ModuleConfig
|
||||||
|
): ModuleWithProviders<ContactApiRootModule> {
|
||||||
|
return {
|
||||||
|
ngModule: ContactApiRootModule,
|
||||||
|
providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AXIOS_INSTANCE } from '@ucap/ng-core';
|
||||||
|
|
||||||
|
import { ContactApiService } from './contact-api.service';
|
||||||
|
import { _MODULE_CONFIG } from '../config/token';
|
||||||
|
|
||||||
|
describe('ContactApiService', () => {
|
||||||
|
let service: ContactApiService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
providers: [
|
||||||
|
{ provide: _MODULE_CONFIG, useValue: _MODULE_CONFIG },
|
||||||
|
{ provide: AXIOS_INSTANCE, useValue: AXIOS_INSTANCE }
|
||||||
|
]
|
||||||
|
});
|
||||||
|
service = TestBed.inject(ContactApiService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
24
projects/api-contact/src/lib/services/contact-api.service.ts
Normal file
24
projects/api-contact/src/lib/services/contact-api.service.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import { Injectable, Inject } from '@angular/core';
|
||||||
|
|
||||||
|
import { AxiosInstance } from 'axios';
|
||||||
|
|
||||||
|
import {
|
||||||
|
ModuleConfig,
|
||||||
|
ContactApiService as UcapContactApiService
|
||||||
|
} from '@ucap/api-contact';
|
||||||
|
|
||||||
|
import { AXIOS_INSTANCE } from '@ucap/ng-core';
|
||||||
|
|
||||||
|
import { _MODULE_CONFIG } from '../config/token';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class ContactApiService extends UcapContactApiService {
|
||||||
|
constructor(
|
||||||
|
@Inject(_MODULE_CONFIG) moduleConfig: ModuleConfig,
|
||||||
|
@Inject(AXIOS_INSTANCE) axios: AxiosInstance
|
||||||
|
) {
|
||||||
|
super(moduleConfig, axios);
|
||||||
|
}
|
||||||
|
}
|
6
projects/api-contact/src/public-api.ts
Normal file
6
projects/api-contact/src/public-api.ts
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/*
|
||||||
|
* Public API Surface of api-contact
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './lib/services/contact-api.service';
|
||||||
|
export * from './lib/contact-api.module';
|
26
projects/api-contact/src/test.ts
Normal file
26
projects/api-contact/src/test.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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: {
|
||||||
|
context(path: string, deep?: boolean, filter?: RegExp): {
|
||||||
|
keys(): string[];
|
||||||
|
<T>(id: string): T;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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);
|
23
projects/api-contact/tsconfig.lib.json
Normal file
23
projects/api-contact/tsconfig.lib.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/lib",
|
||||||
|
"target": "es2015",
|
||||||
|
"declaration": true,
|
||||||
|
"inlineSources": true,
|
||||||
|
"types": [],
|
||||||
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"es2018"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"skipTemplateCodegen": true,
|
||||||
|
"strictMetadataEmit": true,
|
||||||
|
"enableResourceInlining": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"src/test.ts",
|
||||||
|
"**/*.spec.ts"
|
||||||
|
]
|
||||||
|
}
|
6
projects/api-contact/tsconfig.lib.prod.json
Normal file
6
projects/api-contact/tsconfig.lib.prod.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.lib.json",
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"enableIvy": false
|
||||||
|
}
|
||||||
|
}
|
17
projects/api-contact/tsconfig.spec.json
Normal file
17
projects/api-contact/tsconfig.spec.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/spec",
|
||||||
|
"types": [
|
||||||
|
"jasmine",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/test.ts"
|
||||||
|
],
|
||||||
|
"include": [
|
||||||
|
"**/*.spec.ts",
|
||||||
|
"**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
17
projects/api-contact/tslint.json
Normal file
17
projects/api-contact/tslint.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tslint.json",
|
||||||
|
"rules": {
|
||||||
|
"directive-selector": [
|
||||||
|
true,
|
||||||
|
"attribute",
|
||||||
|
"lib",
|
||||||
|
"camelCase"
|
||||||
|
],
|
||||||
|
"component-selector": [
|
||||||
|
true,
|
||||||
|
"element",
|
||||||
|
"lib",
|
||||||
|
"kebab-case"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
24
projects/api-webex/README.md
Normal file
24
projects/api-webex/README.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# ApiWebex
|
||||||
|
|
||||||
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.11.
|
||||||
|
|
||||||
|
## Code scaffolding
|
||||||
|
|
||||||
|
Run `ng generate component component-name --project api-webex` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project api-webex`.
|
||||||
|
> Note: Don't forget to add `--project api-webex` or else it will be added to the default project in your `angular.json` file.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Run `ng build api-webex` to build the project. The build artifacts will be stored in the `dist/` directory.
|
||||||
|
|
||||||
|
## Publishing
|
||||||
|
|
||||||
|
After building your library with `ng build api-webex`, go to the dist folder `cd dist/api-webex` and run `npm publish`.
|
||||||
|
|
||||||
|
## Running unit tests
|
||||||
|
|
||||||
|
Run `ng test api-webex` 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).
|
32
projects/api-webex/karma.conf.js
Normal file
32
projects/api-webex/karma.conf.js
Normal file
|
@ -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/api-webex'),
|
||||||
|
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
|
||||||
|
});
|
||||||
|
};
|
11
projects/api-webex/ng-package.json
Normal file
11
projects/api-webex/ng-package.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||||
|
"dest": "../../dist/api-webex",
|
||||||
|
"lib": {
|
||||||
|
"entryFile": "src/public-api.ts",
|
||||||
|
"umdModuleIds": {
|
||||||
|
"@ucap/api-webex": "@ucap/api-webex",
|
||||||
|
"@ucap/ng-core": "@ucap/ng-core"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
projects/api-webex/package.json
Normal file
16
projects/api-webex/package.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "@ucap/ng-api-webex",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^9.0.2",
|
||||||
|
"@angular/core": "^9.0.2",
|
||||||
|
"@ucap/api-webex": "~0.0.1",
|
||||||
|
"@ucap/ng-core": "~0.0.1",
|
||||||
|
"axios": "^0.19.2",
|
||||||
|
"rxjs": "~6.5.4",
|
||||||
|
"tslib": "^1.10.0"
|
||||||
|
}
|
||||||
|
}
|
5
projects/api-webex/src/lib/config/token.ts
Normal file
5
projects/api-webex/src/lib/config/token.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import { InjectionToken } from '@angular/core';
|
||||||
|
|
||||||
|
export const _MODULE_CONFIG = new InjectionToken(
|
||||||
|
'@ucap/ng-api-webex config of module'
|
||||||
|
);
|
17
projects/api-webex/src/lib/services/conference.service.ts
Normal file
17
projects/api-webex/src/lib/services/conference.service.ts
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import { Injectable, Inject } from '@angular/core';
|
||||||
|
|
||||||
|
import {
|
||||||
|
ModuleConfig,
|
||||||
|
ConferenceService as UcapConferenceService
|
||||||
|
} from '@ucap/api-webex';
|
||||||
|
|
||||||
|
import { _MODULE_CONFIG } from '../config/token';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class ConferenceService extends UcapConferenceService {
|
||||||
|
constructor(@Inject(_MODULE_CONFIG) moduleConfig: ModuleConfig) {
|
||||||
|
super(moduleConfig);
|
||||||
|
}
|
||||||
|
}
|
24
projects/api-webex/src/lib/webex-api.module.ts
Normal file
24
projects/api-webex/src/lib/webex-api.module.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import { NgModule, ModuleWithProviders } from '@angular/core';
|
||||||
|
|
||||||
|
import { ModuleConfig } from '@ucap/api-webex';
|
||||||
|
|
||||||
|
import { _MODULE_CONFIG } from './config/token';
|
||||||
|
|
||||||
|
import { ConferenceService } from './services/conference.service';
|
||||||
|
|
||||||
|
const SERVICES = [ConferenceService];
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class WebexApiRootModule {}
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class WebexApiModule {
|
||||||
|
public static forRoot(
|
||||||
|
config: ModuleConfig
|
||||||
|
): ModuleWithProviders<WebexApiRootModule> {
|
||||||
|
return {
|
||||||
|
ngModule: WebexApiRootModule,
|
||||||
|
providers: [{ provide: _MODULE_CONFIG, useValue: config }, ...SERVICES]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
7
projects/api-webex/src/public-api.ts
Normal file
7
projects/api-webex/src/public-api.ts
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/*
|
||||||
|
* Public API Surface of api-webex
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './lib/services/conference.service';
|
||||||
|
|
||||||
|
export * from './lib/webex-api.module';
|
26
projects/api-webex/src/test.ts
Normal file
26
projects/api-webex/src/test.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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: {
|
||||||
|
context(path: string, deep?: boolean, filter?: RegExp): {
|
||||||
|
keys(): string[];
|
||||||
|
<T>(id: string): T;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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);
|
23
projects/api-webex/tsconfig.lib.json
Normal file
23
projects/api-webex/tsconfig.lib.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/lib",
|
||||||
|
"target": "es2015",
|
||||||
|
"declaration": true,
|
||||||
|
"inlineSources": true,
|
||||||
|
"types": [],
|
||||||
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"es2018"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"skipTemplateCodegen": true,
|
||||||
|
"strictMetadataEmit": true,
|
||||||
|
"enableResourceInlining": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"src/test.ts",
|
||||||
|
"**/*.spec.ts"
|
||||||
|
]
|
||||||
|
}
|
6
projects/api-webex/tsconfig.lib.prod.json
Normal file
6
projects/api-webex/tsconfig.lib.prod.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.lib.json",
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"enableIvy": false
|
||||||
|
}
|
||||||
|
}
|
17
projects/api-webex/tsconfig.spec.json
Normal file
17
projects/api-webex/tsconfig.spec.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/spec",
|
||||||
|
"types": [
|
||||||
|
"jasmine",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/test.ts"
|
||||||
|
],
|
||||||
|
"include": [
|
||||||
|
"**/*.spec.ts",
|
||||||
|
"**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
17
projects/api-webex/tslint.json
Normal file
17
projects/api-webex/tslint.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tslint.json",
|
||||||
|
"rules": {
|
||||||
|
"directive-selector": [
|
||||||
|
true,
|
||||||
|
"attribute",
|
||||||
|
"lib",
|
||||||
|
"camelCase"
|
||||||
|
],
|
||||||
|
"component-selector": [
|
||||||
|
true,
|
||||||
|
"element",
|
||||||
|
"lib",
|
||||||
|
"kebab-case"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-core",
|
"name": "@ucap/ng-core",
|
||||||
"version": "0.0.7",
|
"version": "0.0.9",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,12 +5,43 @@ import { StringUtil as UcapStringUtil } from '@ucap/core';
|
||||||
export class StringUtil extends UcapStringUtil {
|
export class StringUtil extends UcapStringUtil {
|
||||||
public static checkSpecialCharacter(): ValidatorFn {
|
public static checkSpecialCharacter(): ValidatorFn {
|
||||||
const fn = (control: AbstractControl): { [key: string]: any } | null => {
|
const fn = (control: AbstractControl): { [key: string]: any } | null => {
|
||||||
const forbidden = /[\{\}\[\]\/?.;:|\)*~`!^+<>@\#$%&\\\=\(\'\"]/g.test(
|
// const forbidden = /[\{\}\[\]\/?.;:|\)*~`!^+<>@\#$%&\\\=\(\'\"]/g.test(
|
||||||
control.value
|
// control.value
|
||||||
);
|
// );
|
||||||
|
const forbidden = new RegExp(
|
||||||
|
'[\\{\\}\\[\\]\\/?.;:|\\)*~`!^+<>@\\#$%&\\\\\\=\\(\\\'\\"|\\u00a1-' +
|
||||||
|
'\\u00ac|\\u00ae-\\u00ff|\\u0100-\\u017f|\\u0180-\\u024f|\\' +
|
||||||
|
'u1e02-\\u1ef3|\\u0259-\\u0292|\\u02b0-\\u02ff|\\u0370-\\u' +
|
||||||
|
'03ff|\\u1f00-\\u1fff|\\u0400-\\u04ff|\\u2013-\\u204a|\\u2' +
|
||||||
|
'010-\\u206f|\\u2070-\\u209f|\\u20a0-\\u20bf|\\u2100-\\u21' +
|
||||||
|
'4f|\\u2150-\\u218f|\\u2190-\\u21ff|\\u2200-\\u22ff|\\u230' +
|
||||||
|
'0-\\u23ff|\\u2460-\\u24ff|\\u2500-\\u257f|\\u2580-\\u259f' +
|
||||||
|
'|\\u25a0-\\u25ff|\\u2600-\\u26ff|\\u3041-\\u309f|\\u30a0-' +
|
||||||
|
'\\u30ff|\\u3100-\\u312f|\\u2e80-\\u2eff|\\u31c0-\\u31ef|\\' +
|
||||||
|
'u3000-\\u303f|\\u3200-\\u32ff|\\uff00-\\uffef|\\u3190-\\u' +
|
||||||
|
'319f|\\u2f00-\\u2fdf|\\u31f0-\\u31ff|\\ua4d0-\\ua4ff|\\ua' +
|
||||||
|
'700-\\ua71f|\\ufe50-\\ufe6f|\\ufe10-\\ufe1f|\\ua000-\\ua4' +
|
||||||
|
'8c|\\ua490-\\ua4cf|\\u33c2-\\u33d8]',
|
||||||
|
'g'
|
||||||
|
).test(control.value);
|
||||||
return forbidden ? { groupName: { value: control.value } } : null;
|
return forbidden ? { groupName: { value: control.value } } : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static getProfileSubDir(info: string): string {
|
||||||
|
let imgUrl: string;
|
||||||
|
const tempImgInfo: string = info.toLowerCase();
|
||||||
|
const findIdx = tempImgInfo.indexOf('profileimage');
|
||||||
|
|
||||||
|
if (findIdx > -1) {
|
||||||
|
const startIdx = info.indexOf('/', findIdx);
|
||||||
|
imgUrl = info.substring(startIdx);
|
||||||
|
} else {
|
||||||
|
imgUrl = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
return imgUrl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"umdModuleIds": {
|
"umdModuleIds": {
|
||||||
"i18next": "i18next",
|
"i18next": "i18next",
|
||||||
"@ucap/core": "@ucap/core",
|
"@ucap/core": "@ucap/core",
|
||||||
|
"@ucap/i18n": "@ucap/i18n",
|
||||||
"@ucap/ng-logger": "@ucap/ng-logger"
|
"@ucap/ng-logger": "@ucap/ng-logger"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-i18n",
|
"name": "@ucap/ng-i18n",
|
||||||
"version": "0.0.6",
|
"version": "0.0.8",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^9.0.6",
|
"@angular/common": "^9.0.6",
|
||||||
"@angular/core": "^9.0.6",
|
"@angular/core": "^9.0.6",
|
||||||
|
"@ucap/i18n": "~0.0.1",
|
||||||
"i18next": "^19.3.2",
|
"i18next": "^19.3.2",
|
||||||
"tslib": "^1.10.0"
|
"tslib": "^1.10.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { NgModule, ModuleWithProviders } from '@angular/core';
|
import { NgModule, ModuleWithProviders } from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
|
||||||
import { ModuleConfig } from './config/module-config';
|
import { ModuleConfig } from '@ucap/i18n';
|
||||||
|
|
||||||
import { _MODULE_CONFIG } from './config/token';
|
import { _MODULE_CONFIG } from './config/token';
|
||||||
|
|
||||||
import { I18nPipe } from './pipes/i18n.pipe';
|
import { I18nPipe } from './pipes/i18n.pipe';
|
||||||
|
|
|
@ -1,254 +1,16 @@
|
||||||
import { BehaviorSubject, Subject, Observable } from 'rxjs';
|
import { Injectable, OnDestroy, Inject } from '@angular/core';
|
||||||
import { share } from 'rxjs/operators';
|
|
||||||
|
|
||||||
import { Injectable, OnDestroy } from '@angular/core';
|
import { ModuleConfig, I18nService as UCAPI18nService } from '@ucap/i18n';
|
||||||
|
|
||||||
import i18next, {
|
import { _MODULE_CONFIG } from '../config/token';
|
||||||
InitOptions,
|
|
||||||
Module,
|
|
||||||
Newable,
|
|
||||||
ThirdPartyModule,
|
|
||||||
TOptions,
|
|
||||||
StringMap
|
|
||||||
} from 'i18next';
|
|
||||||
|
|
||||||
import { LogService } from '@ucap/ng-logger';
|
|
||||||
|
|
||||||
import { I18nextEvents } from '../types/i18next.event';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class I18nService implements OnDestroy {
|
export class I18nService extends UCAPI18nService implements OnDestroy {
|
||||||
readonly initialized$: Observable<InitOptions>;
|
constructor(@Inject(_MODULE_CONFIG) moduleConfig: ModuleConfig) {
|
||||||
readonly loaded$: Observable<boolean>;
|
super(moduleConfig);
|
||||||
readonly failedLoading$: Observable<{
|
|
||||||
lng: string;
|
|
||||||
ns: string;
|
|
||||||
msg: string;
|
|
||||||
}>;
|
|
||||||
readonly missingKey$: Observable<{
|
|
||||||
lngs: string[];
|
|
||||||
ns: string;
|
|
||||||
key: string;
|
|
||||||
res: string;
|
|
||||||
}>;
|
|
||||||
readonly added$: Observable<{ lng: string; ns: string }>;
|
|
||||||
readonly removed$: Observable<{ lng: string; ns: string }>;
|
|
||||||
readonly languageChanged$: Observable<string>;
|
|
||||||
|
|
||||||
get options(): InitOptions {
|
|
||||||
return i18next.options;
|
|
||||||
}
|
|
||||||
|
|
||||||
get currentLng(): string {
|
|
||||||
return this._currentLng;
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly initializedSubject = new BehaviorSubject<InitOptions>(null);
|
|
||||||
private readonly loadedSubject = new BehaviorSubject<boolean>(false);
|
|
||||||
private readonly failedLoadingSubject = new Subject<{
|
|
||||||
lng: string;
|
|
||||||
ns: string;
|
|
||||||
msg: string;
|
|
||||||
}>();
|
|
||||||
private readonly missingKeySubject = new Subject<{
|
|
||||||
lngs: string[];
|
|
||||||
ns: string;
|
|
||||||
key: string;
|
|
||||||
res: string;
|
|
||||||
}>();
|
|
||||||
private readonly addedSubject = new Subject<{ lng: string; ns: string }>();
|
|
||||||
private readonly removedSubject = new Subject<{ lng: string; ns: string }>();
|
|
||||||
private readonly languageChangedSubject = new BehaviorSubject<string>(null);
|
|
||||||
|
|
||||||
// tslint:disable-next-line: variable-name
|
|
||||||
private _currentLng: string;
|
|
||||||
|
|
||||||
constructor(private logService: LogService) {
|
|
||||||
this.initialized$ = this.initializedSubject.asObservable().pipe(share());
|
|
||||||
this.loaded$ = this.loadedSubject.asObservable().pipe(share());
|
|
||||||
this.failedLoading$ = this.failedLoadingSubject
|
|
||||||
.asObservable()
|
|
||||||
.pipe(share());
|
|
||||||
this.missingKey$ = this.missingKeySubject.asObservable().pipe(share());
|
|
||||||
this.added$ = this.addedSubject.asObservable().pipe(share());
|
|
||||||
this.removed$ = this.removedSubject.asObservable().pipe(share());
|
|
||||||
this.languageChanged$ = this.languageChangedSubject
|
|
||||||
.asObservable()
|
|
||||||
.pipe(share());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
this.initializedSubject.next(null);
|
this.destroy();
|
||||||
this.initializedSubject.complete();
|
|
||||||
|
|
||||||
this.loadedSubject.next(null);
|
|
||||||
this.loadedSubject.complete();
|
|
||||||
|
|
||||||
this.failedLoadingSubject.next(null);
|
|
||||||
this.failedLoadingSubject.complete();
|
|
||||||
|
|
||||||
this.missingKeySubject.next(null);
|
|
||||||
this.missingKeySubject.complete();
|
|
||||||
|
|
||||||
this.addedSubject.next(null);
|
|
||||||
this.addedSubject.complete();
|
|
||||||
|
|
||||||
this.removedSubject.next(null);
|
|
||||||
this.removedSubject.complete();
|
|
||||||
|
|
||||||
this.languageChangedSubject.next(null);
|
|
||||||
this.languageChangedSubject.complete();
|
|
||||||
}
|
|
||||||
|
|
||||||
use<T extends Module>(
|
|
||||||
module: T | Newable<T> | ThirdPartyModule[] | Newable<ThirdPartyModule>[]
|
|
||||||
) {
|
|
||||||
i18next.use(module);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
init(options?: InitOptions) {
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
this.subscribeEvents();
|
|
||||||
|
|
||||||
return i18next.init(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
changeLanguage(lng: string) {
|
|
||||||
const self = this;
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
|
||||||
if (lng === self.currentLng) {
|
|
||||||
resolve();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
i18next
|
|
||||||
.changeLanguage(lng)
|
|
||||||
.then(v => {
|
|
||||||
self.logService.info('changeLanguage', lng);
|
|
||||||
resolve();
|
|
||||||
})
|
|
||||||
.catch(reason => {
|
|
||||||
reject(reason);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
loadNamespaces(ns: string | string[]) {
|
|
||||||
return i18next.loadNamespaces(ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
loadLanguages(lngs: string | string[]) {
|
|
||||||
return i18next.loadLanguages(lngs);
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadResources(lngs?: string | string[], ns?: string | string[]) {
|
|
||||||
return i18next.reloadResources(lngs, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
getResource(
|
|
||||||
lng: string,
|
|
||||||
ns: string,
|
|
||||||
key: string,
|
|
||||||
options?: { keySeparator?: string }
|
|
||||||
) {
|
|
||||||
return i18next.getResource(lng, ns, key, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
addResource(
|
|
||||||
lng: string,
|
|
||||||
ns: string,
|
|
||||||
key: string,
|
|
||||||
value: string,
|
|
||||||
options?: { keySeparator?: string }
|
|
||||||
) {
|
|
||||||
i18next.addResource(lng, ns, key, value, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
addResources(lng: string, ns: string, resources: any) {
|
|
||||||
i18next.addResources(lng, ns, resources);
|
|
||||||
}
|
|
||||||
|
|
||||||
addResourceBundle(
|
|
||||||
lng: string,
|
|
||||||
ns: string,
|
|
||||||
resources: any,
|
|
||||||
deep?: boolean,
|
|
||||||
overwrite?: boolean
|
|
||||||
) {
|
|
||||||
i18next.addResourceBundle(lng, ns, resources, deep, overwrite);
|
|
||||||
}
|
|
||||||
|
|
||||||
hasResourceBundle(lng: string, ns: string) {
|
|
||||||
return i18next.hasResourceBundle(lng, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
getResourceBundle(lng: string, ns: string) {
|
|
||||||
return i18next.getResourceBundle(lng, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
removeResourceBundle(lng: string, ns: string) {
|
|
||||||
i18next.removeResourceBundle(lng, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
t(
|
|
||||||
key: string | string[],
|
|
||||||
optionsOrDefault?: string | TOptions<StringMap>
|
|
||||||
): string;
|
|
||||||
t(
|
|
||||||
key: string | string[],
|
|
||||||
optionsOrDefaultValue?: string,
|
|
||||||
options?: string | TOptions<StringMap>
|
|
||||||
): string {
|
|
||||||
return i18next.t(key, optionsOrDefaultValue, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
format(value: any, format?: string, lng?: string) {
|
|
||||||
return i18next.format(value, format, lng);
|
|
||||||
}
|
|
||||||
|
|
||||||
exists(key: string | string[], options: TOptions<StringMap>) {
|
|
||||||
return i18next.exists(key, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
getFixedT(lng: string | string[], ns?: string | string[]) {
|
|
||||||
return i18next.getFixedT(lng, ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
setDefaultNamespace(ns: string) {
|
|
||||||
i18next.setDefaultNamespace(ns);
|
|
||||||
}
|
|
||||||
|
|
||||||
dir(lng?: string) {
|
|
||||||
return i18next.dir(lng);
|
|
||||||
}
|
|
||||||
|
|
||||||
private subscribeEvents() {
|
|
||||||
// tslint:disable-next-line: variable-name
|
|
||||||
const __this = this;
|
|
||||||
|
|
||||||
i18next.on(I18nextEvents.initialized, options => {
|
|
||||||
__this.initializedSubject.next(options);
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.loaded, loaded => {
|
|
||||||
__this.loadedSubject.next(loaded);
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.failedLoading, (lng, ns, msg) => {
|
|
||||||
__this.failedLoadingSubject.next({ lng, ns, msg });
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.languageChanged, lng => {
|
|
||||||
__this.languageChangedSubject.next(lng);
|
|
||||||
this._currentLng = lng;
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.missingKey, (lngs, ns, key, res) => {
|
|
||||||
__this.missingKeySubject.next({ lngs, ns, key, res });
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.added, (lng, ns) => {
|
|
||||||
__this.addedSubject.next({ lng, ns });
|
|
||||||
});
|
|
||||||
i18next.on(I18nextEvents.removed, (lng, ns) => {
|
|
||||||
__this.removedSubject.next({ lng, ns });
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
export enum I18nextEvents {
|
|
||||||
initialized = 'initialized',
|
|
||||||
loaded = 'loaded',
|
|
||||||
failedLoading = 'failedLoading',
|
|
||||||
languageChanged = 'languageChanged',
|
|
||||||
missingKey = 'missingKey',
|
|
||||||
added = 'added',
|
|
||||||
removed = 'removed'
|
|
||||||
}
|
|
|
@ -2,13 +2,12 @@
|
||||||
* Public API Surface of i18n
|
* Public API Surface of i18n
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export * from './lib/config/module-config';
|
export * from './lib/config/token';
|
||||||
|
|
||||||
export * from './lib/pipes/i18n.pipe';
|
export * from './lib/pipes/i18n.pipe';
|
||||||
|
|
||||||
export * from './lib/services/i18n.service';
|
export * from './lib/services/i18n.service';
|
||||||
|
|
||||||
export * from './lib/types/i18next.event';
|
|
||||||
export * from './lib/types/token';
|
export * from './lib/types/token';
|
||||||
|
|
||||||
export * from './lib/i18n.module';
|
export * from './lib/i18n.module';
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
"entryFile": "src/public-api.ts",
|
"entryFile": "src/public-api.ts",
|
||||||
"umdModuleIds": {
|
"umdModuleIds": {
|
||||||
"@ucap/core": "@ucap/core",
|
"@ucap/core": "@ucap/core",
|
||||||
|
"@ucap/domain-status": "@ucap/domain-status",
|
||||||
"@ucap/native": "@ucap/native",
|
"@ucap/native": "@ucap/native",
|
||||||
"@ucap/ng-core": "@ucap/ng-core"
|
"@ucap/ng-core": "@ucap/ng-core"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-native",
|
"name": "@ucap/ng-native",
|
||||||
"version": "0.0.5",
|
"version": "0.0.12",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
"@angular/common": "^9.0.2",
|
"@angular/common": "^9.0.2",
|
||||||
"@angular/core": "^9.0.2",
|
"@angular/core": "^9.0.2",
|
||||||
"@ucap/core": "~0.0.1",
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/domain-status": "~0.0.1",
|
||||||
"@ucap/native": "~0.0.1",
|
"@ucap/native": "~0.0.1",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"rxjs": "~6.5.4",
|
"rxjs": "~6.5.4",
|
||||||
|
|
|
@ -2,7 +2,9 @@ import { Subject, BehaviorSubject } from 'rxjs';
|
||||||
|
|
||||||
import { AxiosInstance } from 'axios';
|
import { AxiosInstance } from 'axios';
|
||||||
|
|
||||||
import { StatusCode, FileUtil } from '@ucap/core';
|
import { FileUtil } from '@ucap/core';
|
||||||
|
import { StatusCode } from '@ucap/domain-status';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
NativeService,
|
NativeService,
|
||||||
UpdateCheckConfig,
|
UpdateCheckConfig,
|
||||||
|
@ -11,7 +13,8 @@ import {
|
||||||
WindowState,
|
WindowState,
|
||||||
WindowIdle,
|
WindowIdle,
|
||||||
NotificationRequest,
|
NotificationRequest,
|
||||||
NotificationType
|
NotificationType,
|
||||||
|
AppInitInfo
|
||||||
} from '@ucap/native';
|
} from '@ucap/native';
|
||||||
|
|
||||||
import { NotificationService } from './notification.service';
|
import { NotificationService } from './notification.service';
|
||||||
|
@ -228,34 +231,46 @@ export class BrowserNativeService extends NativeService {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window_state(): Promise<WindowState> {
|
||||||
|
return new Promise<WindowState>((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
resolve(undefined);
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
window_onState$(): BehaviorSubject<WindowState> {
|
window_onState$(): BehaviorSubject<WindowState> {
|
||||||
return super.window_onState$();
|
return super.window_onState$();
|
||||||
}
|
}
|
||||||
|
window_focused(): Promise<boolean> {
|
||||||
|
return new Promise<boolean>((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
resolve(document.hasFocus());
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
window_onFocus$(): BehaviorSubject<boolean> {
|
window_onFocus$(): BehaviorSubject<boolean> {
|
||||||
if (!this._window_onFocusSubject) {
|
if (!this._window_onFocusSubject) {
|
||||||
// tslint:disable-next-line: variable-name
|
window.addEventListener(
|
||||||
const __this = this;
|
'focus',
|
||||||
const onFocus = (event: Event) => {
|
this._window_onFocus$CallBack.bind(this)
|
||||||
__this._window_onFocusSubject.next(true);
|
|
||||||
};
|
|
||||||
const onBlur = (event: Event) => {
|
|
||||||
__this._window_onFocusSubject.next(false);
|
|
||||||
};
|
|
||||||
window.addEventListener('focus', onFocus);
|
|
||||||
window.addEventListener('blur', onBlur);
|
|
||||||
|
|
||||||
super.window_onFocus$().subscribe(
|
|
||||||
(focus) => {},
|
|
||||||
(error) => {},
|
|
||||||
() => {
|
|
||||||
window.removeEventListener('focus', onFocus);
|
|
||||||
window.removeEventListener('blur', onBlur);
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
window.addEventListener('blur', this._window_onFocus$CallBack.bind(this));
|
||||||
|
this.window_focused().then((focused) => {
|
||||||
|
this._window_onFocusSubject.next(focused);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.window_onFocus$();
|
return super.window_onFocus$();
|
||||||
}
|
}
|
||||||
|
_window_onFocus$CallBack(event: Event) {
|
||||||
|
if (!!this._window_onFocusSubject) {
|
||||||
|
this._window_onFocusSubject.next(document.hasFocus());
|
||||||
|
}
|
||||||
|
}
|
||||||
window_close(): Promise<void> {
|
window_close(): Promise<void> {
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
|
@ -274,7 +289,7 @@ export class BrowserNativeService extends NativeService {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
window_maximize(): Promise<void> {
|
window_maximize(altKey: boolean = false): Promise<void> {
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
resolve();
|
resolve();
|
||||||
|
@ -293,28 +308,14 @@ export class BrowserNativeService extends NativeService {
|
||||||
|
|
||||||
this._idle_checker = new WindowIdleChecker({
|
this._idle_checker = new WindowIdleChecker({
|
||||||
limitTime,
|
limitTime,
|
||||||
onIdle: () => {
|
onChange: (idle: WindowIdle) => {
|
||||||
if (!!this._idle_onStateSubject) {
|
if (!!this._idle_onStateSubject) {
|
||||||
this._idle_onStateSubject.next(WindowIdle.Idle);
|
this._idle_onStateSubject.next(idle);
|
||||||
}
|
|
||||||
},
|
|
||||||
onActive: () => {
|
|
||||||
if (!!this._idle_onStateSubject) {
|
|
||||||
this._idle_onStateSubject.next(WindowIdle.Active);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onHide: () => {
|
|
||||||
if (!!this._idle_onStateSubject) {
|
|
||||||
this._idle_onStateSubject.next(WindowIdle.Idle);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onShow: () => {
|
|
||||||
if (!!this._idle_onStateSubject) {
|
|
||||||
this._idle_onStateSubject.next(WindowIdle.Active);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this._idle_checker.start();
|
this._idle_checker.start();
|
||||||
|
super.idle_onState$();
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -367,10 +368,10 @@ export class BrowserNativeService extends NativeService {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
app_postInit(): Promise<void> {
|
app_postInit(): Promise<AppInitInfo> {
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<AppInitInfo>((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
resolve();
|
resolve({});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error);
|
reject(error);
|
||||||
}
|
}
|
||||||
|
@ -510,12 +511,25 @@ export class BrowserNativeService extends NativeService {
|
||||||
app_onShowSetting$(): Subject<void> {
|
app_onShowSetting$(): Subject<void> {
|
||||||
return super.app_onShowSetting$();
|
return super.app_onShowSetting$();
|
||||||
}
|
}
|
||||||
|
app_onExit$(): Subject<void> {
|
||||||
|
return super.app_onExit$();
|
||||||
|
}
|
||||||
|
|
||||||
chat_onOpen$(): BehaviorSubject<string> {
|
chat_openRoom(openUrl: string): Promise<void> {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
window.open(openUrl);
|
||||||
|
resolve();
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
chat_onOpen$(): Subject<string> {
|
||||||
return super.chat_onOpen$();
|
return super.chat_onOpen$();
|
||||||
}
|
}
|
||||||
|
|
||||||
message_onOpen$(): BehaviorSubject<string> {
|
message_onOpen$(): Subject<string> {
|
||||||
return super.message_onOpen$();
|
return super.message_onOpen$();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -523,49 +537,72 @@ export class BrowserNativeService extends NativeService {
|
||||||
interface WindowIdleCheckerConfig {
|
interface WindowIdleCheckerConfig {
|
||||||
limitTime?: number;
|
limitTime?: number;
|
||||||
events?: string[];
|
events?: string[];
|
||||||
onIdle?: () => void;
|
onChange?: (idle: WindowIdle) => void;
|
||||||
onActive?: () => void;
|
|
||||||
visibilityEvents?: string[];
|
|
||||||
onHide?: () => void;
|
|
||||||
onShow?: () => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const defaultWindowIdleCheckerConfig: WindowIdleCheckerConfig = {
|
const defaultWindowIdleCheckerConfig: WindowIdleCheckerConfig = {
|
||||||
limitTime: 5 * 60 * 1000,
|
limitTime: 5 * 60 * 1000,
|
||||||
events: ['mousemove', 'keydown', 'mousedown', 'touchstart'],
|
events: ['mousemove', 'keydown', 'mousedown', 'touchstart'],
|
||||||
onIdle: () => {},
|
onChange: (idle: WindowIdle) => {}
|
||||||
onActive: () => {},
|
|
||||||
onHide: () => {},
|
|
||||||
onShow: () => {},
|
|
||||||
visibilityEvents: [
|
|
||||||
'visibilitychange',
|
|
||||||
'webkitvisibilitychange',
|
|
||||||
'mozvisibilitychange',
|
|
||||||
'msvisibilitychange'
|
|
||||||
]
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const WEBKIT_HIDDEN = 'webkitHidden';
|
abstract class WindowListener {
|
||||||
const MOZ_HIDDEN = 'mozHidden';
|
// tslint:disable-next-line: variable-name
|
||||||
const MS_HIDDEN = 'msHidden';
|
protected events: string[];
|
||||||
|
|
||||||
class WindowIdleChecker {
|
constructor() {}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
// tslint:disable-next-line: variable-name
|
||||||
|
const __this = this;
|
||||||
|
this._addEventListerner(this.events, this._onEvent.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
this._removeEventListerner(this.events, this._onEvent.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract onEvent(event: Event): void;
|
||||||
|
|
||||||
|
private _onEvent(event: Event) {
|
||||||
|
this.onEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _addEventListerner(
|
||||||
|
events: string[],
|
||||||
|
callback: (event: Event) => void
|
||||||
|
) {
|
||||||
|
events.forEach((e) => {
|
||||||
|
window.addEventListener(e, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private _removeEventListerner(
|
||||||
|
events: string[],
|
||||||
|
callback: (event: Event) => void
|
||||||
|
) {
|
||||||
|
events.forEach((e) => {
|
||||||
|
window.removeEventListener(e, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class WindowIdleChecker extends WindowListener {
|
||||||
// tslint:disable-next-line: variable-name
|
// tslint:disable-next-line: variable-name
|
||||||
private _timerId: any;
|
private _timerId: any;
|
||||||
// tslint:disable-next-line: variable-name
|
// tslint:disable-next-line: variable-name
|
||||||
private _status: WindowIdle;
|
private _status: WindowIdle;
|
||||||
// tslint:disable-next-line: variable-name
|
// tslint:disable-next-line: variable-name
|
||||||
private _visible: boolean;
|
|
||||||
// tslint:disable-next-line: variable-name
|
|
||||||
private _started: boolean;
|
private _started: boolean;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
// tslint:disable-next-line: variable-name
|
// tslint:disable-next-line: variable-name
|
||||||
private _config: WindowIdleCheckerConfig
|
private _config: WindowIdleCheckerConfig
|
||||||
) {
|
) {
|
||||||
|
super();
|
||||||
this._config = Object.assign({}, defaultWindowIdleCheckerConfig, _config);
|
this._config = Object.assign({}, defaultWindowIdleCheckerConfig, _config);
|
||||||
this._status = WindowIdle.Active;
|
this._status = WindowIdle.Active;
|
||||||
this._visible = true;
|
this.events = this._config.events;
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
|
@ -576,7 +613,7 @@ class WindowIdleChecker {
|
||||||
this._timerId = setInterval(() => {
|
this._timerId = setInterval(() => {
|
||||||
if (WindowIdle.Active === this._status) {
|
if (WindowIdle.Active === this._status) {
|
||||||
this._status = WindowIdle.Idle;
|
this._status = WindowIdle.Idle;
|
||||||
this._config.onIdle();
|
this._config.onChange(this._status);
|
||||||
}
|
}
|
||||||
}, this._config.limitTime);
|
}, this._config.limitTime);
|
||||||
|
|
||||||
|
@ -584,14 +621,7 @@ class WindowIdleChecker {
|
||||||
this._started = true;
|
this._started = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._addEventListerner(this._config.events, this._onActive);
|
super.start();
|
||||||
|
|
||||||
if (!!this._config.onShow || !!this._config.onHide) {
|
|
||||||
this._addEventListerner(
|
|
||||||
this._config.visibilityEvents,
|
|
||||||
this._onVisibility
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
|
@ -601,14 +631,7 @@ class WindowIdleChecker {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!!this._started) {
|
if (!!this._started) {
|
||||||
this._removeEventListerner(this._config.events, this._onActive);
|
super.stop();
|
||||||
|
|
||||||
if (!!this._config.onShow || !!this._config.onHide) {
|
|
||||||
this._removeEventListerner(
|
|
||||||
this._config.visibilityEvents,
|
|
||||||
this._onVisibility
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,47 +643,10 @@ class WindowIdleChecker {
|
||||||
this.start();
|
this.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private _onActive(event: Event) {
|
protected onEvent(event: Event): void {
|
||||||
if (WindowIdle.Idle === this._status) {
|
if (WindowIdle.Idle === this._status) {
|
||||||
this._status = WindowIdle.Active;
|
this._status = WindowIdle.Active;
|
||||||
this._config.onActive();
|
this._config.onChange(this._status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _onVisibility(event: Event) {
|
|
||||||
if (
|
|
||||||
!!document.hidden ||
|
|
||||||
!!document[WEBKIT_HIDDEN] ||
|
|
||||||
!!document[MOZ_HIDDEN] ||
|
|
||||||
!!document[MS_HIDDEN]
|
|
||||||
) {
|
|
||||||
if (this._visible) {
|
|
||||||
this._visible = false;
|
|
||||||
this._config.onHide();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!this._visible) {
|
|
||||||
this._visible = true;
|
|
||||||
this._config.onShow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private _addEventListerner(
|
|
||||||
events: string[],
|
|
||||||
callback: (event: Event) => void
|
|
||||||
) {
|
|
||||||
events.forEach((e) => {
|
|
||||||
window.addEventListener(e, callback.bind(this));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _removeEventListerner(
|
|
||||||
events: string[],
|
|
||||||
callback: (event: Event) => void
|
|
||||||
) {
|
|
||||||
events.forEach((e) => {
|
|
||||||
window.removeEventListener(e, callback.bind(this));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
"@ngrx/store": "@ngrx/store",
|
"@ngrx/store": "@ngrx/store",
|
||||||
"@ngrx/effects": "@ngrx/effects",
|
"@ngrx/effects": "@ngrx/effects",
|
||||||
"@ucap/core": "@ucap/core",
|
"@ucap/core": "@ucap/core",
|
||||||
|
"@ucap/domain-authentication": "@ucap/domain-authentication",
|
||||||
"@ucap/api-public": "@ucap/api-public",
|
"@ucap/api-public": "@ucap/api-public",
|
||||||
"@ucap/api-external": "@ucap/api-external",
|
"@ucap/api-external": "@ucap/api-external",
|
||||||
"@ucap/pi": "@ucap/pi",
|
"@ucap/pi": "@ucap/pi",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-store-authentication",
|
"name": "@ucap/ng-store-authentication",
|
||||||
"version": "0.0.14",
|
"version": "0.0.17",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
"@ngrx/entity": "^9.0.0",
|
"@ngrx/entity": "^9.0.0",
|
||||||
"@ngrx/store": "^9.0.0",
|
"@ngrx/store": "^9.0.0",
|
||||||
"@ucap/core": "~0.0.1",
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/domain-authentication": "~0.0.1",
|
||||||
"@ucap/api-public": "~0.0.1",
|
"@ucap/api-public": "~0.0.1",
|
||||||
"@ucap/api-external": "~0.0.1",
|
"@ucap/api-external": "~0.0.1",
|
||||||
"@ucap/pi": "~0.0.1",
|
"@ucap/pi": "~0.0.1",
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { AuthRequest, AuthResponse } from '@ucap/protocol-query';
|
import { UserPermission } from '@ucap/domain-authorization';
|
||||||
import { RegViewRequest, RegViewResponse } from '@ucap/protocol-option';
|
|
||||||
|
import { AuthRequest } from '@ucap/protocol-query';
|
||||||
|
import { RegViewRequest } from '@ucap/protocol-option';
|
||||||
|
import { Settings } from '@ucap/domain-authentication';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* retrieve authorization information
|
* retrieve authorization information
|
||||||
|
@ -15,7 +18,7 @@ export const auth = createAction(
|
||||||
*/
|
*/
|
||||||
export const authSuccess = createAction(
|
export const authSuccess = createAction(
|
||||||
'[ucap::authentication::authorization] auth Success',
|
'[ucap::authentication::authorization] auth Success',
|
||||||
props<{ res: AuthResponse }>()
|
props<{ userPermission: UserPermission }>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
* Failure of auth request
|
* Failure of auth request
|
||||||
|
@ -37,7 +40,7 @@ export const regView = createAction(
|
||||||
*/
|
*/
|
||||||
export const regViewSuccess = createAction(
|
export const regViewSuccess = createAction(
|
||||||
'[ucap::authentication::authorization] regView Success',
|
'[ucap::authentication::authorization] regView Success',
|
||||||
props<{ res: RegViewResponse }>()
|
props<{ settings: Settings }>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
* Failure of regView request
|
* Failure of regView request
|
||||||
|
|
|
@ -27,7 +27,7 @@ export class Effects {
|
||||||
sessionCreatedForAuth$ = createEffect(() => {
|
sessionCreatedForAuth$ = createEffect(() => {
|
||||||
return this.actions$.pipe(
|
return this.actions$.pipe(
|
||||||
ofType(LoginActions.sessionCreated),
|
ofType(LoginActions.sessionCreated),
|
||||||
map(action =>
|
map((action) =>
|
||||||
auth({ req: { deviceType: action.loginSession.deviceType } })
|
auth({ req: { deviceType: action.loginSession.deviceType } })
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -36,15 +36,15 @@ export class Effects {
|
||||||
auth$ = createEffect(() =>
|
auth$ = createEffect(() =>
|
||||||
this.actions$.pipe(
|
this.actions$.pipe(
|
||||||
ofType(auth),
|
ofType(auth),
|
||||||
map(action => action.req),
|
map((action) => action.req),
|
||||||
exhaustMap(req => {
|
exhaustMap((req) => {
|
||||||
return this.queryProtocolService.auth(req).pipe(
|
return this.queryProtocolService.auth(req).pipe(
|
||||||
map((res: AuthResponse) => {
|
map((res: AuthResponse) => {
|
||||||
return authSuccess({
|
return authSuccess({
|
||||||
res
|
userPermission: res.userPermission
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
catchError(error => of(authFailure({ error })))
|
catchError((error) => of(authFailure({ error })))
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -53,22 +53,22 @@ export class Effects {
|
||||||
sessionCreatedForRegView$ = createEffect(() => {
|
sessionCreatedForRegView$ = createEffect(() => {
|
||||||
return this.actions$.pipe(
|
return this.actions$.pipe(
|
||||||
ofType(LoginActions.sessionCreated),
|
ofType(LoginActions.sessionCreated),
|
||||||
map(action => regView({ req: {} }))
|
map((action) => regView({ req: {} }))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
regView$ = createEffect(() =>
|
regView$ = createEffect(() =>
|
||||||
this.actions$.pipe(
|
this.actions$.pipe(
|
||||||
ofType(regView),
|
ofType(regView),
|
||||||
map(action => action.req),
|
map((action) => action.req),
|
||||||
exhaustMap(req => {
|
exhaustMap((req) => {
|
||||||
return this.optionProtocolService.regView(req).pipe(
|
return this.optionProtocolService.regView(req).pipe(
|
||||||
map((res: RegViewResponse) => {
|
map((res: RegViewResponse) => {
|
||||||
return regViewSuccess({
|
return regViewSuccess({
|
||||||
res
|
settings: res.settings
|
||||||
});
|
});
|
||||||
}),
|
}),
|
||||||
catchError(error => of(regViewFailure({ error })))
|
catchError((error) => of(regViewFailure({ error })))
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,18 +8,18 @@ export const reducer = createReducer(
|
||||||
on(authSuccess, (state, action) => {
|
on(authSuccess, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
authResponse: {
|
userPermission: {
|
||||||
...state.authResponse,
|
...state.userPermission,
|
||||||
...action.res
|
...action.userPermission
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
on(regViewSuccess, (state, action) => {
|
on(regViewSuccess, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
regViewResponse: {
|
settings: {
|
||||||
...state.regViewResponse,
|
...state.settings,
|
||||||
...action.res
|
...action.settings
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,27 +1,24 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
|
|
||||||
import { AuthResponse } from '@ucap/protocol-query';
|
import { Settings } from '@ucap/domain-authentication';
|
||||||
import { RegViewResponse } from '@ucap/protocol-option';
|
import { UserPermission } from '@ucap/domain-authorization';
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
authResponse?: AuthResponse | null;
|
userPermission: UserPermission | null;
|
||||||
regViewResponse: RegViewResponse | null;
|
settings: Settings | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
authResponse: null,
|
userPermission: null,
|
||||||
regViewResponse: null
|
settings: null
|
||||||
};
|
};
|
||||||
|
|
||||||
export function selectors<S>(selector: Selector<any, State>) {
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
return {
|
return {
|
||||||
authResponse: createSelector(
|
userPermission: createSelector(
|
||||||
selector,
|
selector,
|
||||||
(state: State) => state.authResponse
|
(state: State) => state.userPermission
|
||||||
),
|
),
|
||||||
regViewResponse: createSelector(
|
settings: createSelector(selector, (state: State) => state.settings)
|
||||||
selector,
|
|
||||||
(state: State) => state.regViewResponse
|
|
||||||
)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { VersionInfo2Response, VersionInfo2Request } from '@ucap/api-public';
|
import { VersionInfo2Request } from '@ucap/api-public';
|
||||||
import { UrlInfoRequest, UrlInfoResponse } from '@ucap/api-external';
|
import { UrlInfoRequest } from '@ucap/api-external';
|
||||||
|
import { VersionInfo, UrlInfo } from '@ucap/domain-authentication';
|
||||||
|
|
||||||
export const versionInfo2 = createAction(
|
export const versionInfo2 = createAction(
|
||||||
'[ucap::authentication::configuration] versionInfo2',
|
'[ucap::authentication::configuration] versionInfo2',
|
||||||
|
@ -10,7 +11,7 @@ export const versionInfo2 = createAction(
|
||||||
|
|
||||||
export const versionInfo2Success = createAction(
|
export const versionInfo2Success = createAction(
|
||||||
'[ucap::authentication::configuration] versionInfo2 Success',
|
'[ucap::authentication::configuration] versionInfo2 Success',
|
||||||
props<{ res: VersionInfo2Response }>()
|
props<{ versionInfo: VersionInfo }>()
|
||||||
);
|
);
|
||||||
|
|
||||||
export const versionInfo2Failure = createAction(
|
export const versionInfo2Failure = createAction(
|
||||||
|
@ -25,7 +26,7 @@ export const urlInfo = createAction(
|
||||||
|
|
||||||
export const urlInfoSuccess = createAction(
|
export const urlInfoSuccess = createAction(
|
||||||
'[ucap::authentication::configuration] urlInfo Success',
|
'[ucap::authentication::configuration] urlInfo Success',
|
||||||
props<{ res: UrlInfoResponse }>()
|
props<{ urlInfo: UrlInfo }>()
|
||||||
);
|
);
|
||||||
|
|
||||||
export const urlInfoFailure = createAction(
|
export const urlInfoFailure = createAction(
|
||||||
|
|
|
@ -7,18 +7,18 @@ export const reducer = createReducer(
|
||||||
on(versionInfo2Success, (state, action) => {
|
on(versionInfo2Success, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
versionInfo2Response: {
|
versionInfo: {
|
||||||
...state.versionInfo2Response,
|
...state.versionInfo,
|
||||||
...action.res
|
...action.versionInfo
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
on(urlInfoSuccess, (state, action) => {
|
on(urlInfoSuccess, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
urlInfoResponse: {
|
urlInfo: {
|
||||||
...state.urlInfoResponse,
|
...state.urlInfo,
|
||||||
...action.res
|
...action.urlInfo
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,27 +1,20 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
|
|
||||||
import { VersionInfo2Response } from '@ucap/api-public';
|
import { VersionInfo, UrlInfo } from '@ucap/domain-authentication';
|
||||||
import { UrlInfoResponse } from '@ucap/api-external';
|
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
versionInfo2Response: VersionInfo2Response | null;
|
versionInfo: VersionInfo | null;
|
||||||
urlInfoResponse: UrlInfoResponse | null;
|
urlInfo: UrlInfo | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
versionInfo2Response: null,
|
versionInfo: null,
|
||||||
urlInfoResponse: null
|
urlInfo: null
|
||||||
};
|
};
|
||||||
|
|
||||||
export function selectors<S>(selector: Selector<any, State>) {
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
return {
|
return {
|
||||||
versionInfo2Response: createSelector(
|
versionInfo: createSelector(selector, (state: State) => state.versionInfo),
|
||||||
selector,
|
urlInfo: createSelector(selector, (state: State) => state.urlInfo)
|
||||||
(state: State) => state.versionInfo2Response
|
|
||||||
),
|
|
||||||
urlInfoResponse: createSelector(
|
|
||||||
selector,
|
|
||||||
(state: State) => state.urlInfoResponse
|
|
||||||
)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { LoginSession } from '@ucap/core';
|
import { LoginSession, LoginInfo } from '@ucap/domain-authentication';
|
||||||
|
|
||||||
import { Login2Response } from '@ucap/pi';
|
import { Login2Response } from '@ucap/pi';
|
||||||
import {
|
import { LoginRequest, LogoutResponse } from '@ucap/protocol-authentication';
|
||||||
LoginRequest,
|
|
||||||
LoginResponse,
|
|
||||||
LogoutResponse
|
|
||||||
} from '@ucap/protocol-authentication';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* request of web login
|
* request of web login
|
||||||
|
@ -58,7 +55,7 @@ export const login = createAction(
|
||||||
export const loginSuccess = createAction(
|
export const loginSuccess = createAction(
|
||||||
'[ucap::authentication::login] login Success',
|
'[ucap::authentication::login] login Success',
|
||||||
props<{
|
props<{
|
||||||
res: LoginResponse;
|
loginInfo: LoginInfo;
|
||||||
loginSession: LoginSession;
|
loginSession: LoginSession;
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
@ -95,7 +92,7 @@ export const logoutFailure = createAction(
|
||||||
export const sessionCreated = createAction(
|
export const sessionCreated = createAction(
|
||||||
'[ucap::authentication::login] session Created',
|
'[ucap::authentication::login] session Created',
|
||||||
props<{
|
props<{
|
||||||
res: LoginResponse;
|
loginInfo: LoginInfo;
|
||||||
loginSession: LoginSession;
|
loginSession: LoginSession;
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
|
|
@ -30,22 +30,22 @@ export class Effects {
|
||||||
() =>
|
() =>
|
||||||
this.actions$.pipe(
|
this.actions$.pipe(
|
||||||
ofType(loginSuccess),
|
ofType(loginSuccess),
|
||||||
map((params) => params.res),
|
map((result) => result.loginInfo),
|
||||||
tap((loginRes) => {
|
tap((loginInfo) => {
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
UserActions.init({
|
UserActions.init({
|
||||||
user: {
|
user: {
|
||||||
info: loginRes.userInfo,
|
info: loginInfo.userInfo,
|
||||||
companyCode: loginRes.companyCode,
|
companyCode: loginInfo.companyCode,
|
||||||
departmentCode: loginRes.departmentCode,
|
departmentCode: loginInfo.departmentCode,
|
||||||
statusMessage1: loginRes.statusMessage1,
|
statusMessage1: loginInfo.statusMessage1,
|
||||||
statusMessage2: loginRes.statusMessage2,
|
statusMessage2: loginInfo.statusMessage2,
|
||||||
statusMessage3: loginRes.statusMessage3,
|
statusMessage3: loginInfo.statusMessage3,
|
||||||
madn: loginRes.madn,
|
madn: loginInfo.madn,
|
||||||
hardPhoneSadn: loginRes.hardPhoneSadn,
|
hardPhoneSadn: loginInfo.hardPhoneSadn,
|
||||||
fmcSadn: loginRes.fmcSadn,
|
fmcSadn: loginInfo.fmcSadn,
|
||||||
pbxIndex: loginRes.pbxIndex,
|
pbxIndex: loginInfo.pbxIndex,
|
||||||
talkWithMeBotSeq: loginRes.talkWithMeBotSeq
|
talkWithMeBotSeq: loginInfo.talkWithMeBotSeq
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
|
@ -8,7 +8,7 @@ export const reducer = createReducer(
|
||||||
on(loginSuccess, (state, action) => {
|
on(loginSuccess, (state, action) => {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
loginRes: action.res
|
loginInfo: action.loginInfo
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
|
|
||||||
import { LoginResponse } from '@ucap/protocol-authentication';
|
import { LoginInfo } from '@ucap/domain-authentication';
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
loginRes: LoginResponse | null;
|
loginInfo: LoginInfo | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
loginRes: null
|
loginInfo: null
|
||||||
};
|
};
|
||||||
|
|
||||||
export function selectors<S>(selector: Selector<any, State>) {
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
return {
|
return {
|
||||||
loginRes: createSelector(selector, (state: State) => state.loginRes)
|
loginInfo: createSelector(selector, (state: State) => state.loginInfo)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
24
projects/store-call/README.md
Normal file
24
projects/store-call/README.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# StoreCall
|
||||||
|
|
||||||
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.11.
|
||||||
|
|
||||||
|
## Code scaffolding
|
||||||
|
|
||||||
|
Run `ng generate component component-name --project store-call` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project store-call`.
|
||||||
|
> Note: Don't forget to add `--project store-call` or else it will be added to the default project in your `angular.json` file.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Run `ng build store-call` to build the project. The build artifacts will be stored in the `dist/` directory.
|
||||||
|
|
||||||
|
## Publishing
|
||||||
|
|
||||||
|
After building your library with `ng build store-call`, go to the dist folder `cd dist/store-call` and run `npm publish`.
|
||||||
|
|
||||||
|
## Running unit tests
|
||||||
|
|
||||||
|
Run `ng test store-call` 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).
|
32
projects/store-call/karma.conf.js
Normal file
32
projects/store-call/karma.conf.js
Normal file
|
@ -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/store-call'),
|
||||||
|
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
|
||||||
|
});
|
||||||
|
};
|
17
projects/store-call/ng-package.json
Normal file
17
projects/store-call/ng-package.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||||
|
"dest": "../../dist/store-call",
|
||||||
|
"lib": {
|
||||||
|
"entryFile": "src/public-api.ts",
|
||||||
|
"umdModuleIds": {
|
||||||
|
"@ngrx/store": "@ngrx/store",
|
||||||
|
"@ngrx/entity": "@ngrx/entity",
|
||||||
|
"@ngrx/effects": "@ngrx/effects",
|
||||||
|
"moment": "moment",
|
||||||
|
"@ucap/core": "@ucap/core",
|
||||||
|
"@ucap/domain-call": "@ucap/domain-call",
|
||||||
|
"@ucap/api-contact": "@ucap/api-contact",
|
||||||
|
"@ucap/ng-api-contact": "@ucap/ng-api-contact"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
projects/store-call/package.json
Normal file
16
projects/store-call/package.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "@ucap/ng-store-call",
|
||||||
|
"version": "0.0.7",
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/common": "^9.0.2",
|
||||||
|
"@angular/core": "^9.0.2",
|
||||||
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/api-contact": "~0.0.1",
|
||||||
|
"@ucap/ng-api-contact": "~0.0.1",
|
||||||
|
"@ucap/domain-call": "~0.0.2",
|
||||||
|
"tslib": "^1.10.0"
|
||||||
|
}
|
||||||
|
}
|
31
projects/store-call/src/lib/call-store.module.ts
Normal file
31
projects/store-call/src/lib/call-store.module.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { NgModule, ModuleWithProviders } from '@angular/core';
|
||||||
|
|
||||||
|
import { StoreModule } from '@ngrx/store';
|
||||||
|
import { EffectsModule } from '@ngrx/effects';
|
||||||
|
|
||||||
|
import { ModuleConfig } from './config/module-config';
|
||||||
|
import { _MODULE_CONFIG } from './config/token';
|
||||||
|
|
||||||
|
import { KEY_FEATURE } from './store/state';
|
||||||
|
import { effects } from './store/effects';
|
||||||
|
import { reducers } from './store/reducers';
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
StoreModule.forFeature(KEY_FEATURE, reducers),
|
||||||
|
EffectsModule.forFeature([...effects])
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class CallStoreRootModule {}
|
||||||
|
|
||||||
|
@NgModule({})
|
||||||
|
export class CallStoreModule {
|
||||||
|
public static forRoot(
|
||||||
|
config: ModuleConfig
|
||||||
|
): ModuleWithProviders<CallStoreRootModule> {
|
||||||
|
return {
|
||||||
|
ngModule: CallStoreRootModule,
|
||||||
|
providers: [{ provide: _MODULE_CONFIG, useValue: config }]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
6
projects/store-call/src/lib/config/module-config.ts
Normal file
6
projects/store-call/src/lib/config/module-config.ts
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import { ModuleConfig as CoreModuleConfig } from '@ucap/core';
|
||||||
|
|
||||||
|
// tslint:disable-next-line: no-empty-interface
|
||||||
|
export interface ModuleConfig extends CoreModuleConfig {
|
||||||
|
historyRequestDefaultCount?: number;
|
||||||
|
}
|
5
projects/store-call/src/lib/config/token.ts
Normal file
5
projects/store-call/src/lib/config/token.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import { InjectionToken } from '@angular/core';
|
||||||
|
|
||||||
|
export const _MODULE_CONFIG = new InjectionToken(
|
||||||
|
'@ucap/ng-store-call config of module'
|
||||||
|
);
|
55
projects/store-call/src/lib/store/call/actions.ts
Normal file
55
projects/store-call/src/lib/store/call/actions.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
|
import {
|
||||||
|
CallHistoryInfoRequest,
|
||||||
|
CallHistoryInfoResponse,
|
||||||
|
CallHistoryDelRequest,
|
||||||
|
CallHistoryDelResponse
|
||||||
|
} from '@ucap/api-contact';
|
||||||
|
|
||||||
|
import { AuthRequest, AuthResponse } from '@ucap/protocol-query';
|
||||||
|
// import { RegViewRequest, RegViewResponse } from '@ucap/protocol-option';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* retrieve call history
|
||||||
|
*/
|
||||||
|
export const callHistory = createAction(
|
||||||
|
'[ucap::call::call] call history',
|
||||||
|
props<{ req: CallHistoryInfoRequest }>()
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Success of call history request
|
||||||
|
*/
|
||||||
|
export const callHistorySuccess = createAction(
|
||||||
|
'[ucap::call::call] call history Success',
|
||||||
|
props<{ res: CallHistoryInfoResponse; remainHistory: boolean }>()
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Failure of call history request
|
||||||
|
*/
|
||||||
|
export const callHistoryFailure = createAction(
|
||||||
|
'[ucap::call::call] call history Failure',
|
||||||
|
props<{ error: any }>()
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* retrieve delete call history
|
||||||
|
*/
|
||||||
|
export const del = createAction(
|
||||||
|
'[ucap::call::call] delete call history',
|
||||||
|
props<{ req: CallHistoryDelRequest }>()
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Success of delete call history request
|
||||||
|
*/
|
||||||
|
export const delSuccess = createAction(
|
||||||
|
'[ucap::call::call] delete call history Success',
|
||||||
|
props<{ callLogSeq: number }>()
|
||||||
|
);
|
||||||
|
/**
|
||||||
|
* Failure of delete call history request
|
||||||
|
*/
|
||||||
|
export const delFailure = createAction(
|
||||||
|
'[ucap::call::call] delete call history Failure',
|
||||||
|
props<{ error: any }>()
|
||||||
|
);
|
91
projects/store-call/src/lib/store/call/effects.ts
Normal file
91
projects/store-call/src/lib/store/call/effects.ts
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
import { Injectable, Inject } from '@angular/core';
|
||||||
|
|
||||||
|
import { of } from 'rxjs';
|
||||||
|
import { map, catchError, exhaustMap } from 'rxjs/operators';
|
||||||
|
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
||||||
|
|
||||||
|
import {
|
||||||
|
CallHistoryInfoResponse,
|
||||||
|
CallHistoryDelResponse
|
||||||
|
} from '@ucap/api-contact';
|
||||||
|
import { ContactApiService } from '@ucap/ng-api-contact';
|
||||||
|
import { StatusCode } from '@ucap/api';
|
||||||
|
|
||||||
|
import {
|
||||||
|
callHistory,
|
||||||
|
callHistorySuccess,
|
||||||
|
callHistoryFailure,
|
||||||
|
del,
|
||||||
|
delSuccess,
|
||||||
|
delFailure
|
||||||
|
} from './actions';
|
||||||
|
import { ModuleConfig } from '../../config/module-config';
|
||||||
|
import { _MODULE_CONFIG } from '../../config/token';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class Effects {
|
||||||
|
callHistory$ = createEffect(() =>
|
||||||
|
this.actions$.pipe(
|
||||||
|
ofType(callHistory),
|
||||||
|
map((action) => action.req),
|
||||||
|
exhaustMap((req) => {
|
||||||
|
return this.contactApiService.callHistoryList(req).pipe(
|
||||||
|
map((res: CallHistoryInfoResponse) => {
|
||||||
|
if (res.statusCode === StatusCode.Success) {
|
||||||
|
const remainHistory =
|
||||||
|
!!res.historyList &&
|
||||||
|
res.historyList.length >=
|
||||||
|
this.moduleConfig.historyRequestDefaultCount
|
||||||
|
? true
|
||||||
|
: false;
|
||||||
|
return callHistorySuccess({
|
||||||
|
res,
|
||||||
|
remainHistory
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return callHistoryFailure({ error: res.errorMessage });
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
catchError((error) => of(callHistoryFailure({ error })))
|
||||||
|
);
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
del$ = createEffect(() =>
|
||||||
|
this.actions$.pipe(
|
||||||
|
ofType(del),
|
||||||
|
map((action) => action.req),
|
||||||
|
exhaustMap((req) => {
|
||||||
|
const callLogSeq = !!req.targetReceiverCallLogSeq
|
||||||
|
? Number(req.targetReceiverCallLogSeq)
|
||||||
|
: !!req.targetSenderCallLogSeq
|
||||||
|
? Number(req.targetSenderCallLogSeq)
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
if (!!callLogSeq) {
|
||||||
|
return this.contactApiService.callHistoryDel(req).pipe(
|
||||||
|
map((res: CallHistoryDelResponse) => {
|
||||||
|
if (res.statusCode === StatusCode.Success) {
|
||||||
|
return delSuccess({
|
||||||
|
callLogSeq
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return delFailure({ error: 'error statusCode' });
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
catchError((error) => of(delFailure({ error })))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return of(delFailure({ error: 'not target calllogseq' }));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private actions$: Actions,
|
||||||
|
@Inject(_MODULE_CONFIG) private moduleConfig: ModuleConfig,
|
||||||
|
private contactApiService: ContactApiService
|
||||||
|
) {}
|
||||||
|
}
|
29
projects/store-call/src/lib/store/call/reducers.ts
Normal file
29
projects/store-call/src/lib/store/call/reducers.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { initialState, adapterCallHistory } from './state';
|
||||||
|
import { callHistorySuccess, delSuccess } from './actions';
|
||||||
|
|
||||||
|
export const reducer = createReducer(
|
||||||
|
initialState,
|
||||||
|
|
||||||
|
on(callHistorySuccess, (state, action) => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
searchDate: action.res.searchDate,
|
||||||
|
searchDirection: action.res.searchDirection,
|
||||||
|
historyList: adapterCallHistory.upsertMany(action.res.historyList, {
|
||||||
|
...state.historyList
|
||||||
|
}),
|
||||||
|
remainHistory: action.remainHistory
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
|
||||||
|
on(delSuccess, (state, action) => {
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
historyList: adapterCallHistory.removeOne(action.callLogSeq, {
|
||||||
|
...state.historyList
|
||||||
|
})
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
49
projects/store-call/src/lib/store/call/state.ts
Normal file
49
projects/store-call/src/lib/store/call/state.ts
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { SearchDirectionByDateType, CallHistory } from '@ucap/domain-call';
|
||||||
|
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||||
|
|
||||||
|
export interface CallHistoryState extends EntityState<CallHistory> {}
|
||||||
|
export const adapterCallHistory = createEntityAdapter<CallHistory>({
|
||||||
|
selectId: (callHistory) => callHistory.callLogSeq,
|
||||||
|
sortComparer: (a, b) => {
|
||||||
|
return b.callLogSeq - a.callLogSeq;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const callHistoryInitialState: CallHistoryState = adapterCallHistory.getInitialState();
|
||||||
|
const {
|
||||||
|
selectAll: selectAllForCallHistory,
|
||||||
|
selectEntities: selectEntitiesForCallHistory,
|
||||||
|
selectIds: selectIdsForCallHistory,
|
||||||
|
selectTotal: selectTotalForCallHistory
|
||||||
|
} = adapterCallHistory.getSelectors();
|
||||||
|
|
||||||
|
export interface State {
|
||||||
|
searchDate?: string | null;
|
||||||
|
searchDirection?: SearchDirectionByDateType | null;
|
||||||
|
remainHistory?: boolean | null;
|
||||||
|
historyList: CallHistoryState;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const initialState: State = {
|
||||||
|
searchDate: null,
|
||||||
|
searchDirection: null,
|
||||||
|
remainHistory: null,
|
||||||
|
historyList: callHistoryInitialState
|
||||||
|
};
|
||||||
|
|
||||||
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
|
const selectCallHistory = createSelector(
|
||||||
|
selector,
|
||||||
|
(state: State) => state.historyList
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
callHistory: createSelector(selectCallHistory, selectAllForCallHistory),
|
||||||
|
searchDate: createSelector(selector, (state: State) => state.searchDate),
|
||||||
|
searchDirection: createSelector(
|
||||||
|
selector,
|
||||||
|
(state: State) => state.searchDirection
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
3
projects/store-call/src/lib/store/common/actions.ts
Normal file
3
projects/store-call/src/lib/store/common/actions.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import { createAction } from '@ngrx/store';
|
||||||
|
|
||||||
|
export const init = createAction('[ucap::call::common] init');
|
8
projects/store-call/src/lib/store/common/effects.ts
Normal file
8
projects/store-call/src/lib/store/common/effects.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
|
||||||
|
import { Actions } from '@ngrx/effects';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class Effects {
|
||||||
|
constructor(private actions$: Actions) {}
|
||||||
|
}
|
5
projects/store-call/src/lib/store/common/reducers.ts
Normal file
5
projects/store-call/src/lib/store/common/reducers.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { initialState } from './state';
|
||||||
|
|
||||||
|
export const reducer = createReducer(initialState);
|
10
projects/store-call/src/lib/store/common/state.ts
Normal file
10
projects/store-call/src/lib/store/common/state.ts
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import { Selector } from '@ngrx/store';
|
||||||
|
|
||||||
|
// tslint:disable-next-line: no-empty-interface
|
||||||
|
export interface State {}
|
||||||
|
|
||||||
|
export const initialState: State = {};
|
||||||
|
|
||||||
|
export function selectors<S>(selector: Selector<any, State>) {
|
||||||
|
return {};
|
||||||
|
}
|
6
projects/store-call/src/lib/store/effects.ts
Normal file
6
projects/store-call/src/lib/store/effects.ts
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import { Type } from '@angular/core';
|
||||||
|
|
||||||
|
import { Effects as CommonEffects } from './common/effects';
|
||||||
|
import { Effects as CallEffects } from './call/effects';
|
||||||
|
|
||||||
|
export const effects: Type<any>[] = [CommonEffects, CallEffects];
|
11
projects/store-call/src/lib/store/reducers.ts
Normal file
11
projects/store-call/src/lib/store/reducers.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { combineReducers, Action } from '@ngrx/store';
|
||||||
|
|
||||||
|
import { reducer as CommonReducer } from './common/reducers';
|
||||||
|
import { reducer as CallReducer } from './call/reducers';
|
||||||
|
|
||||||
|
export function reducers(state: any | undefined, action: Action) {
|
||||||
|
return combineReducers({
|
||||||
|
common: CommonReducer,
|
||||||
|
call: CallReducer
|
||||||
|
})(state, action);
|
||||||
|
}
|
21
projects/store-call/src/lib/store/state.ts
Normal file
21
projects/store-call/src/lib/store/state.ts
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import { createFeatureSelector, createSelector } from '@ngrx/store';
|
||||||
|
|
||||||
|
import * as CommonState from './common/state';
|
||||||
|
import * as CallState from './call/state';
|
||||||
|
|
||||||
|
export const KEY_FEATURE = 'call';
|
||||||
|
|
||||||
|
export interface State {
|
||||||
|
common: CommonState.State;
|
||||||
|
call: CallState.State;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Selector = createFeatureSelector<State>(KEY_FEATURE);
|
||||||
|
|
||||||
|
export const CommonSelector = CommonState.selectors(
|
||||||
|
createSelector(Selector, (state: State) => state.common)
|
||||||
|
);
|
||||||
|
|
||||||
|
export const CallSelector = CallState.selectors(
|
||||||
|
createSelector(Selector, (state: State) => state.call)
|
||||||
|
);
|
14
projects/store-call/src/public-api.ts
Normal file
14
projects/store-call/src/public-api.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* Public API Surface of store-call
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as CommonActions from './lib/store/common/actions';
|
||||||
|
import * as CallActions from './lib/store/call/actions';
|
||||||
|
|
||||||
|
export * from './lib/config/module-config';
|
||||||
|
|
||||||
|
export { CommonActions, CallActions };
|
||||||
|
|
||||||
|
export * from './lib/store/state';
|
||||||
|
|
||||||
|
export * from './lib/call-store.module';
|
26
projects/store-call/src/test.ts
Normal file
26
projects/store-call/src/test.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// 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: {
|
||||||
|
context(path: string, deep?: boolean, filter?: RegExp): {
|
||||||
|
keys(): string[];
|
||||||
|
<T>(id: string): T;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// 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);
|
23
projects/store-call/tsconfig.lib.json
Normal file
23
projects/store-call/tsconfig.lib.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/lib",
|
||||||
|
"target": "es2015",
|
||||||
|
"declaration": true,
|
||||||
|
"inlineSources": true,
|
||||||
|
"types": [],
|
||||||
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"es2018"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"skipTemplateCodegen": true,
|
||||||
|
"strictMetadataEmit": true,
|
||||||
|
"enableResourceInlining": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"src/test.ts",
|
||||||
|
"**/*.spec.ts"
|
||||||
|
]
|
||||||
|
}
|
6
projects/store-call/tsconfig.lib.prod.json
Normal file
6
projects/store-call/tsconfig.lib.prod.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.lib.json",
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"enableIvy": false
|
||||||
|
}
|
||||||
|
}
|
17
projects/store-call/tsconfig.spec.json
Normal file
17
projects/store-call/tsconfig.spec.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../out-tsc/spec",
|
||||||
|
"types": [
|
||||||
|
"jasmine",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/test.ts"
|
||||||
|
],
|
||||||
|
"include": [
|
||||||
|
"**/*.spec.ts",
|
||||||
|
"**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
17
projects/store-call/tslint.json
Normal file
17
projects/store-call/tslint.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tslint.json",
|
||||||
|
"rules": {
|
||||||
|
"directive-selector": [
|
||||||
|
true,
|
||||||
|
"attribute",
|
||||||
|
"lib",
|
||||||
|
"camelCase"
|
||||||
|
],
|
||||||
|
"component-selector": [
|
||||||
|
true,
|
||||||
|
"element",
|
||||||
|
"lib",
|
||||||
|
"kebab-case"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,9 @@
|
||||||
"@ngrx/store": "@ngrx/store",
|
"@ngrx/store": "@ngrx/store",
|
||||||
"@ngrx/entity": "@ngrx/entity",
|
"@ngrx/entity": "@ngrx/entity",
|
||||||
"@ngrx/effects": "@ngrx/effects",
|
"@ngrx/effects": "@ngrx/effects",
|
||||||
|
"@ucap/domain-common": "@ucap/domain-common",
|
||||||
|
"@ucap/domain-organization": "@ucap/domain-organization",
|
||||||
|
"@ucap/domain-chat": "@ucap/domain-chat",
|
||||||
"@ucap/api": "@ucap/api",
|
"@ucap/api": "@ucap/api",
|
||||||
"@ucap/pi": "@ucap/pi",
|
"@ucap/pi": "@ucap/pi",
|
||||||
"@ucap/protocol-event": "@ucap/protocol-event",
|
"@ucap/protocol-event": "@ucap/protocol-event",
|
||||||
|
@ -16,6 +19,7 @@
|
||||||
"@ucap/protocol-room": "@ucap/protocol-room",
|
"@ucap/protocol-room": "@ucap/protocol-room",
|
||||||
"@ucap/protocol-sync": "@ucap/protocol-sync",
|
"@ucap/protocol-sync": "@ucap/protocol-sync",
|
||||||
"@ucap/ng-i18n": "@ucap/ng-i18n",
|
"@ucap/ng-i18n": "@ucap/ng-i18n",
|
||||||
|
"@ucap/ng-core": "@ucap/ng-core",
|
||||||
"@ucap/ng-api-common": "@ucap/ng-api-common",
|
"@ucap/ng-api-common": "@ucap/ng-api-common",
|
||||||
"@ucap/ng-protocol-room": "@ucap/ng-protocol-room",
|
"@ucap/ng-protocol-room": "@ucap/ng-protocol-room",
|
||||||
"@ucap/ng-protocol-event": "@ucap/ng-protocol-event",
|
"@ucap/ng-protocol-event": "@ucap/ng-protocol-event",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-store-chat",
|
"name": "@ucap/ng-store-chat",
|
||||||
"version": "0.0.66",
|
"version": "0.0.74",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
|
@ -8,12 +8,23 @@
|
||||||
"@angular/common": "^9.0.2",
|
"@angular/common": "^9.0.2",
|
||||||
"@angular/core": "^9.0.2",
|
"@angular/core": "^9.0.2",
|
||||||
"@ucap/core": "~0.0.1",
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/domain-common": "~0.0.1",
|
||||||
|
"@ucap/domain-organization": "~0.0.1",
|
||||||
|
"@ucap/domain-chat": "~0.0.1",
|
||||||
|
"@ucap/api": "~0.0.1",
|
||||||
|
"@ucap/api-common": "~0.0.1",
|
||||||
"@ucap/protocol-event": "~0.0.1",
|
"@ucap/protocol-event": "~0.0.1",
|
||||||
"@ucap/protocol-file": "~0.0.1",
|
"@ucap/protocol-file": "~0.0.1",
|
||||||
"@ucap/protocol-room": "~0.0.1",
|
"@ucap/protocol-room": "~0.0.1",
|
||||||
"@ucap/protocol-sync": "~0.0.1",
|
"@ucap/protocol-sync": "~0.0.1",
|
||||||
|
"@ucap/ng-i18n": "~0.0.1",
|
||||||
|
"@ucap/ng-core": "~0.0.1",
|
||||||
|
"@ucap/ng-api-common": "~0.0.1",
|
||||||
|
"@ucap/ng-protocol-event": "~0.0.1",
|
||||||
"@ucap/ng-protocol-room": "~0.0.1",
|
"@ucap/ng-protocol-room": "~0.0.1",
|
||||||
|
"@ucap/ng-protocol-file": "~0.0.1",
|
||||||
"@ucap/ng-protocol-sync": "~0.0.1",
|
"@ucap/ng-protocol-sync": "~0.0.1",
|
||||||
|
"@ucap/ng-store-organization": "~0.0.1",
|
||||||
"@ucap/ng-store-authentication": "~0.0.1",
|
"@ucap/ng-store-authentication": "~0.0.1",
|
||||||
"tslib": "^1.10.0"
|
"tslib": "^1.10.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { DeviceType } from '@ucap/core';
|
import { DeviceType } from '@ucap/domain-common';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Info,
|
Info,
|
||||||
|
FileDownloadInfo,
|
||||||
|
FileInfo,
|
||||||
|
EventJson,
|
||||||
|
RoomEventInfo
|
||||||
|
} from '@ucap/domain-chat';
|
||||||
|
|
||||||
|
import {
|
||||||
InfoRequest as EventInfoRequest,
|
InfoRequest as EventInfoRequest,
|
||||||
InfoResponse as EventInfoResponse,
|
|
||||||
SendRequest as SendEventRequest,
|
SendRequest as SendEventRequest,
|
||||||
SendResponse as SendEventResponse,
|
SendResponse as SendEventResponse,
|
||||||
ReadRequest,
|
ReadRequest,
|
||||||
|
@ -17,7 +22,6 @@ import {
|
||||||
ReadNotification,
|
ReadNotification,
|
||||||
CancelNotification,
|
CancelNotification,
|
||||||
DelNotification,
|
DelNotification,
|
||||||
EventJson,
|
|
||||||
ReadResponse,
|
ReadResponse,
|
||||||
SendRequest
|
SendRequest
|
||||||
} from '@ucap/protocol-event';
|
} from '@ucap/protocol-event';
|
||||||
|
@ -25,8 +29,6 @@ import {
|
||||||
import {
|
import {
|
||||||
InfoRequest as FileInfoRequest,
|
InfoRequest as FileInfoRequest,
|
||||||
InfoResponse as FileInfoResponse,
|
InfoResponse as FileInfoResponse,
|
||||||
FileDownloadInfo,
|
|
||||||
FileInfo,
|
|
||||||
DownCheckRequest,
|
DownCheckRequest,
|
||||||
DownCheckResponse
|
DownCheckResponse
|
||||||
} from '@ucap/protocol-file';
|
} from '@ucap/protocol-file';
|
||||||
|
@ -45,7 +47,7 @@ export const eventsSuccess = createAction(
|
||||||
'[ucap::chat::chatting] events Success',
|
'[ucap::chat::chatting] events Success',
|
||||||
props<{
|
props<{
|
||||||
eventInfoList: Info<EventJson>[];
|
eventInfoList: Info<EventJson>[];
|
||||||
res: EventInfoResponse;
|
roomEventInfo: RoomEventInfo;
|
||||||
remainEvent: boolean;
|
remainEvent: boolean;
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,7 +7,6 @@ import {
|
||||||
exhaustMap,
|
exhaustMap,
|
||||||
concatMap,
|
concatMap,
|
||||||
withLatestFrom,
|
withLatestFrom,
|
||||||
debounceTime,
|
|
||||||
mergeMap,
|
mergeMap,
|
||||||
take
|
take
|
||||||
} from 'rxjs/operators';
|
} from 'rxjs/operators';
|
||||||
|
@ -18,8 +17,22 @@ import { Store, select } from '@ngrx/store';
|
||||||
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
||||||
import { Dictionary } from '@ngrx/entity';
|
import { Dictionary } from '@ngrx/entity';
|
||||||
|
|
||||||
|
import moment from 'moment';
|
||||||
|
|
||||||
|
import { LocaleCode } from '@ucap/domain-common';
|
||||||
import {
|
import {
|
||||||
|
Info,
|
||||||
RoomType,
|
RoomType,
|
||||||
|
FileType,
|
||||||
|
EventType,
|
||||||
|
FileEventJson,
|
||||||
|
EventJson
|
||||||
|
} from '@ucap/domain-chat';
|
||||||
|
|
||||||
|
import { StatusCode } from '@ucap/api';
|
||||||
|
import { FileTalkShareRequest, FileTalkShareResponse } from '@ucap/api-common';
|
||||||
|
|
||||||
|
import {
|
||||||
OpenResponse as CreateResponse,
|
OpenResponse as CreateResponse,
|
||||||
Open3Response as CreateTimerResponse,
|
Open3Response as CreateTimerResponse,
|
||||||
ExitResponse as DeleteResponse,
|
ExitResponse as DeleteResponse,
|
||||||
|
@ -28,23 +41,12 @@ import {
|
||||||
import {
|
import {
|
||||||
InfoRequest,
|
InfoRequest,
|
||||||
ReadResponse,
|
ReadResponse,
|
||||||
FileType,
|
|
||||||
EventType,
|
|
||||||
DelResponse,
|
DelResponse,
|
||||||
SendResponse,
|
SendResponse,
|
||||||
CancelResponse,
|
CancelResponse,
|
||||||
FileEventJson,
|
decodeFileEventJson
|
||||||
decodeFileEventJson,
|
|
||||||
Info,
|
|
||||||
EventJson
|
|
||||||
} from '@ucap/protocol-event';
|
} from '@ucap/protocol-event';
|
||||||
|
|
||||||
import moment from 'moment';
|
|
||||||
|
|
||||||
import { LocaleCode } from '@ucap/core';
|
|
||||||
import { StatusCode } from '@ucap/api';
|
|
||||||
import { FileTalkShareRequest, FileTalkShareResponse } from '@ucap/api-common';
|
|
||||||
|
|
||||||
import { I18nService } from '@ucap/ng-i18n';
|
import { I18nService } from '@ucap/ng-i18n';
|
||||||
import { CommonApiService } from '@ucap/ng-api-common';
|
import { CommonApiService } from '@ucap/ng-api-common';
|
||||||
import { EventProtocolService } from '@ucap/ng-protocol-event';
|
import { EventProtocolService } from '@ucap/ng-protocol-event';
|
||||||
|
@ -103,14 +105,14 @@ export class Effects {
|
||||||
map((action) => action.req),
|
map((action) => action.req),
|
||||||
switchMap((req) => {
|
switchMap((req) => {
|
||||||
return this.eventProtocolService.info(req).pipe(
|
return this.eventProtocolService.info(req).pipe(
|
||||||
map((res) => {
|
map((result) => {
|
||||||
if (!!res && !!res.res) {
|
if (!!result && !!result.res) {
|
||||||
const infoList = res.infoList;
|
const infoList = result.infoList;
|
||||||
|
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
eventsSuccess({
|
eventsSuccess({
|
||||||
eventInfoList: infoList,
|
eventInfoList: infoList,
|
||||||
res: res.res,
|
roomEventInfo: result.res.roomEventInfo,
|
||||||
remainEvent:
|
remainEvent:
|
||||||
infoList.length === req.requestCount ? true : false
|
infoList.length === req.requestCount ? true : false
|
||||||
})
|
})
|
||||||
|
@ -135,7 +137,7 @@ export class Effects {
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
fileInfos({
|
fileInfos({
|
||||||
req: {
|
req: {
|
||||||
roomId: res.res.roomId,
|
roomId: result.res.roomEventInfo.roomId,
|
||||||
// { 파일타입 } cf) I : 이미지 V: 동영상 F: 파일 "" 빈값이면 모든 타입을 내려줌
|
// { 파일타입 } cf) I : 이미지 V: 동영상 F: 파일 "" 빈값이면 모든 타입을 내려줌
|
||||||
type: FileType.All
|
type: FileType.All
|
||||||
}
|
}
|
||||||
|
@ -488,9 +490,9 @@ export class Effects {
|
||||||
ofType(forwarForFileEvent),
|
ofType(forwarForFileEvent),
|
||||||
withLatestFrom(
|
withLatestFrom(
|
||||||
this.store.pipe(select(UserSelector.user)),
|
this.store.pipe(select(UserSelector.user)),
|
||||||
this.store.pipe(select(LoginSelector.loginRes))
|
this.store.pipe(select(LoginSelector.loginInfo))
|
||||||
),
|
),
|
||||||
tap(([actionReq, user, loginRes]) => {
|
tap(([actionReq, user, loginInfo]) => {
|
||||||
const fileEventJson: FileEventJson = decodeFileEventJson(
|
const fileEventJson: FileEventJson = decodeFileEventJson(
|
||||||
actionReq.sendReq.sentMessage
|
actionReq.sendReq.sentMessage
|
||||||
);
|
);
|
||||||
|
@ -498,7 +500,7 @@ export class Effects {
|
||||||
const req: FileTalkShareRequest = {
|
const req: FileTalkShareRequest = {
|
||||||
userSeq: String(user.info.seq),
|
userSeq: String(user.info.seq),
|
||||||
deviceType: actionReq.deviceType,
|
deviceType: actionReq.deviceType,
|
||||||
token: loginRes.tokenString,
|
token: loginInfo.tokenString,
|
||||||
attachmentsSeq: fileEventJson.attachmentSeq.toString(),
|
attachmentsSeq: fileEventJson.attachmentSeq.toString(),
|
||||||
roomId: actionReq.trgtRoomId,
|
roomId: actionReq.trgtRoomId,
|
||||||
synapKey: ''
|
synapKey: ''
|
||||||
|
@ -690,7 +692,6 @@ export class Effects {
|
||||||
() => {
|
() => {
|
||||||
return this.actions$.pipe(
|
return this.actions$.pipe(
|
||||||
ofType(RoomActions.selectedRoomSuccess),
|
ofType(RoomActions.selectedRoomSuccess),
|
||||||
debounceTime(300),
|
|
||||||
tap((action) => {
|
tap((action) => {
|
||||||
const requestCount = this.moduleConfig?.eventRequestInitCount || 50;
|
const requestCount = this.moduleConfig?.eventRequestInitCount || 50;
|
||||||
const req: InfoRequest = {
|
const req: InfoRequest = {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { createReducer, on } from '@ngrx/store';
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
import { FileInfo } from '@ucap/protocol-file';
|
import { Info, FileInfo, EventType, EventJson } from '@ucap/domain-chat';
|
||||||
import { Info, EventJson, EventType } from '@ucap/protocol-event';
|
|
||||||
|
|
||||||
import * as RoomActions from '../room/actions';
|
import * as RoomActions from '../room/actions';
|
||||||
|
|
||||||
|
@ -29,7 +28,7 @@ export const reducer = createReducer(
|
||||||
initialState,
|
initialState,
|
||||||
|
|
||||||
on(eventsSuccess, (state, action) => {
|
on(eventsSuccess, (state, action) => {
|
||||||
const roomId = action.res.roomId;
|
const roomId = action.roomEventInfo.roomId;
|
||||||
|
|
||||||
const chatting = state.chattings.entities[roomId] || {};
|
const chatting = state.chattings.entities[roomId] || {};
|
||||||
let trgtChatting: Chatting = {
|
let trgtChatting: Chatting = {
|
||||||
|
@ -82,7 +81,7 @@ export const reducer = createReducer(
|
||||||
eventList: adapterEventList.upsertMany(trgtEventInfoList, {
|
eventList: adapterEventList.upsertMany(trgtEventInfoList, {
|
||||||
...trgtChatting.eventList
|
...trgtChatting.eventList
|
||||||
}),
|
}),
|
||||||
eventStatus: action.res,
|
eventStatus: action.roomEventInfo,
|
||||||
remainEvent:
|
remainEvent:
|
||||||
trgtChatting.remainEvent === false ? false : action.remainEvent, // 재조회를 위한 처리.
|
trgtChatting.remainEvent === false ? false : action.remainEvent, // 재조회를 위한 처리.
|
||||||
eventListProcessing: false
|
eventListProcessing: false
|
||||||
|
@ -278,12 +277,13 @@ export const reducer = createReducer(
|
||||||
};
|
};
|
||||||
|
|
||||||
// 파일이 회수되었을 경우 fileInfoList 에서도 삭제 한다.
|
// 파일이 회수되었을 경우 fileInfoList 에서도 삭제 한다.
|
||||||
if (chatting.eventList.entities[eventSeq].type === EventType.File) {
|
const currentEvent = chatting.eventList.entities[eventSeq];
|
||||||
|
if (!!currentEvent && currentEvent.type === EventType.File) {
|
||||||
const fileInfoList = chatting.fileInfoList;
|
const fileInfoList = chatting.fileInfoList;
|
||||||
if (!!chatting && !!fileInfoList) {
|
if (!!chatting && !!fileInfoList) {
|
||||||
fileInfoList.ids.forEach((id) => {
|
fileInfoList.ids.forEach((id) => {
|
||||||
const fileInfo: FileInfo = fileInfoList.entities[id];
|
const fileInfo: FileInfo = fileInfoList.entities[id];
|
||||||
if (action.eventSeq === fileInfo.eventSeq) {
|
if (!!fileInfo && action.eventSeq === fileInfo.eventSeq) {
|
||||||
fileInfoSeq = id;
|
fileInfoSeq = id;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,13 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
import { EntityState, createEntityAdapter, Dictionary } from '@ngrx/entity';
|
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||||
|
|
||||||
import { InfoResponse, Info, EventJson } from '@ucap/protocol-event';
|
import {
|
||||||
import { FileInfo, FileDownloadInfo } from '@ucap/protocol-file';
|
Info,
|
||||||
|
FileInfo,
|
||||||
|
FileDownloadInfo,
|
||||||
|
EventJson,
|
||||||
|
RoomEventInfo
|
||||||
|
} from '@ucap/domain-chat';
|
||||||
|
|
||||||
export interface EventListState extends EntityState<Info<EventJson>> {}
|
export interface EventListState extends EntityState<Info<EventJson>> {}
|
||||||
export interface FileInfoListState extends EntityState<FileInfo> {}
|
export interface FileInfoListState extends EntityState<FileInfo> {}
|
||||||
|
@ -63,7 +68,7 @@ export interface Chatting {
|
||||||
|
|
||||||
eventListProcessing?: boolean;
|
eventListProcessing?: boolean;
|
||||||
eventList?: EventListState;
|
eventList?: EventListState;
|
||||||
eventStatus?: InfoResponse | null;
|
eventStatus?: RoomEventInfo | null;
|
||||||
remainEvent?: boolean | null;
|
remainEvent?: boolean | null;
|
||||||
|
|
||||||
fileInfoListProcessing?: boolean;
|
fileInfoListProcessing?: boolean;
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { LocaleCode } from '@ucap/core';
|
import { LocaleCode } from '@ucap/domain-common';
|
||||||
|
import { RoomInfo, UserInfo, UserInfoShort } from '@ucap/domain-chat';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
RoomInfo,
|
|
||||||
UserInfo as RoomUserInfo,
|
|
||||||
InfoRequest as RoomRequest,
|
InfoRequest as RoomRequest,
|
||||||
InviteNotification,
|
InviteNotification,
|
||||||
OpenRequest as CreateRequest,
|
OpenRequest as CreateRequest,
|
||||||
|
@ -23,8 +22,6 @@ import {
|
||||||
ExitForcingResponse,
|
ExitForcingResponse,
|
||||||
UpdateTimerSetRequest,
|
UpdateTimerSetRequest,
|
||||||
UpdateTimerSetResponse,
|
UpdateTimerSetResponse,
|
||||||
UserInfo,
|
|
||||||
UserInfoShort,
|
|
||||||
InfoResponse
|
InfoResponse
|
||||||
} from '@ucap/protocol-room';
|
} from '@ucap/protocol-room';
|
||||||
|
|
||||||
|
@ -76,7 +73,7 @@ export const roomsSuccess = createAction(
|
||||||
props<{
|
props<{
|
||||||
roomList: RoomInfo[];
|
roomList: RoomInfo[];
|
||||||
roomUserInfoMap: {
|
roomUserInfoMap: {
|
||||||
[param: string]: RoomUserInfo[];
|
[param: string]: UserInfo[];
|
||||||
};
|
};
|
||||||
syncDate: string;
|
syncDate: string;
|
||||||
}>()
|
}>()
|
||||||
|
@ -100,7 +97,7 @@ export const rooms2Success = createAction(
|
||||||
roomUserInfoMap: {
|
roomUserInfoMap: {
|
||||||
[param: string]: {
|
[param: string]: {
|
||||||
userInfoShortList: UserInfoShort[];
|
userInfoShortList: UserInfoShort[];
|
||||||
userInfoList: RoomUserInfo[];
|
userInfoList: UserInfo[];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
syncDate: string;
|
syncDate: string;
|
||||||
|
@ -128,7 +125,7 @@ export const roomSuccess = createAction(
|
||||||
'[ucap::chat::room] room Success',
|
'[ucap::chat::room] room Success',
|
||||||
props<{
|
props<{
|
||||||
roomInfo: RoomInfo;
|
roomInfo: RoomInfo;
|
||||||
userInfoList: RoomUserInfo[];
|
userInfoList: UserInfo[];
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
|
@ -148,7 +145,7 @@ export const room2Success = createAction(
|
||||||
roomInfo: RoomInfo;
|
roomInfo: RoomInfo;
|
||||||
roomUserInfo: {
|
roomUserInfo: {
|
||||||
userInfoShortList: UserInfoShort[];
|
userInfoShortList: UserInfoShort[];
|
||||||
userInfoList: RoomUserInfo[];
|
userInfoList: UserInfo[];
|
||||||
};
|
};
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
|
|
@ -14,7 +14,10 @@ import { Injectable } from '@angular/core';
|
||||||
import { Store, select } from '@ngrx/store';
|
import { Store, select } from '@ngrx/store';
|
||||||
import { Actions, ofType, createEffect } from '@ngrx/effects';
|
import { Actions, ofType, createEffect } from '@ngrx/effects';
|
||||||
|
|
||||||
import { LocaleCode } from '@ucap/core';
|
import { LocaleCode } from '@ucap/domain-common';
|
||||||
|
import { UserInfoUpdateType } from '@ucap/domain-organization';
|
||||||
|
import { UserInfoShort, UserInfo, RoomInfo } from '@ucap/domain-chat';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
OpenResponse as CreateResponse,
|
OpenResponse as CreateResponse,
|
||||||
Open3Response as CreateTimerResponse,
|
Open3Response as CreateTimerResponse,
|
||||||
|
@ -24,13 +27,11 @@ import {
|
||||||
InviteResponse,
|
InviteResponse,
|
||||||
ExitForcingResponse,
|
ExitForcingResponse,
|
||||||
UpdateTimerSetResponse,
|
UpdateTimerSetResponse,
|
||||||
InfoRequest,
|
InfoRequest
|
||||||
UserInfoShort,
|
|
||||||
UserInfo,
|
|
||||||
RoomInfo
|
|
||||||
} from '@ucap/protocol-room';
|
} from '@ucap/protocol-room';
|
||||||
import { UserNotification, UserInfoUpdateType } from '@ucap/protocol-info';
|
import { UserNotification } from '@ucap/protocol-info';
|
||||||
|
|
||||||
|
import { StringUtil } from '@ucap/ng-core';
|
||||||
import { I18nService } from '@ucap/ng-i18n';
|
import { I18nService } from '@ucap/ng-i18n';
|
||||||
import { RoomProtocolService } from '@ucap/ng-protocol-room';
|
import { RoomProtocolService } from '@ucap/ng-protocol-room';
|
||||||
import { SyncProtocolService } from '@ucap/ng-protocol-sync';
|
import { SyncProtocolService } from '@ucap/ng-protocol-sync';
|
||||||
|
@ -606,13 +607,7 @@ export class Effects {
|
||||||
userInfoS?: UserInfoShort[];
|
userInfoS?: UserInfoShort[];
|
||||||
}[] = [];
|
}[] = [];
|
||||||
|
|
||||||
const findIdx = noti.info.indexOf('ProfileImage');
|
const imgInfo = StringUtil.getProfileSubDir(noti.info);
|
||||||
let imgInfo: string = noti.info;
|
|
||||||
|
|
||||||
if (findIdx > -1) {
|
|
||||||
const startIdx = noti.info.indexOf('/', findIdx);
|
|
||||||
imgInfo = noti.info.substring(startIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const ru of roomUsers) {
|
for (const ru of roomUsers) {
|
||||||
ru.userInfos.every((u) => {
|
ru.userInfos.every((u) => {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { createReducer, on } from '@ngrx/store';
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
import { RoomInfo } from '@ucap/protocol-room';
|
import { Info, RoomInfo, EventJson } from '@ucap/domain-chat';
|
||||||
import { Info, EventJson } from '@ucap/protocol-event';
|
|
||||||
|
|
||||||
import * as ChattingActions from '../chatting/actions';
|
import * as ChattingActions from '../chatting/actions';
|
||||||
import { ChatUtil } from '../../utils/chat.util';
|
import { ChatUtil } from '../../utils/chat.util';
|
||||||
|
@ -49,12 +48,42 @@ export const reducer = createReducer(
|
||||||
// tslint:disable-next-line: forin
|
// tslint:disable-next-line: forin
|
||||||
for (const key in state.rooms.entities) {
|
for (const key in state.rooms.entities) {
|
||||||
const value = state.rooms.entities[key];
|
const value = state.rooms.entities[key];
|
||||||
|
const matchedInfo = action.roomList.find(
|
||||||
|
(item) => item.roomId === value.roomId
|
||||||
|
);
|
||||||
|
if (!!matchedInfo) {
|
||||||
|
unreadTotal += isNaN(matchedInfo.noReadCnt) ? 0 : matchedInfo.noReadCnt;
|
||||||
|
} else {
|
||||||
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correcting expiredFileStdSeq.
|
||||||
|
* 대화방이 열린 상태에서 새로고침 할 때 'RoomInfo' 보다 'SyncRoomInfo'가 나중에 유입되어 expiredFileStdSeq 값을 0으로 덮어쓰는 문제로 보정코드 삽입.
|
||||||
|
* 'SyncRoomInfo' 에서는 expiredFileStdSeq 값이 0으로 고정되어 내려온다.(DB 부하 문제)
|
||||||
|
*/
|
||||||
|
const trgtRoomList = action.roomList.map((roomInfo) => {
|
||||||
|
let rtnValue: RoomInfo = roomInfo;
|
||||||
|
|
||||||
|
// tslint:disable-next-line: forin
|
||||||
|
for (const key in state.rooms.entities) {
|
||||||
|
const value = state.rooms.entities[key];
|
||||||
|
if (value.roomId === roomInfo.roomId && value.expiredFileStdSeq > 0) {
|
||||||
|
rtnValue = {
|
||||||
|
...rtnValue,
|
||||||
|
expiredFileStdSeq: value.expiredFileStdSeq
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtnValue;
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
rooms: adapterRoom.upsertMany(action.roomList, {
|
rooms: adapterRoom.upsertMany(trgtRoomList, {
|
||||||
...state.rooms,
|
...state.rooms,
|
||||||
syncDate: action.syncDate
|
syncDate: action.syncDate
|
||||||
}),
|
}),
|
||||||
|
@ -92,13 +121,42 @@ export const reducer = createReducer(
|
||||||
// tslint:disable-next-line: forin
|
// tslint:disable-next-line: forin
|
||||||
for (const key in state.rooms.entities) {
|
for (const key in state.rooms.entities) {
|
||||||
const value = state.rooms.entities[key];
|
const value = state.rooms.entities[key];
|
||||||
|
const matchedInfo = action.roomList.find(
|
||||||
|
(item) => item.roomId === value.roomId
|
||||||
|
);
|
||||||
|
if (!!matchedInfo) {
|
||||||
|
unreadTotal += isNaN(matchedInfo.noReadCnt) ? 0 : matchedInfo.noReadCnt;
|
||||||
|
} else {
|
||||||
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
unreadTotal += isNaN(value.noReadCnt) ? 0 : value.noReadCnt;
|
||||||
}
|
}
|
||||||
action.roomList.map((item) => (unreadTotal += item.noReadCnt));
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correcting expiredFileStdSeq.
|
||||||
|
* 대화방이 열린 상태에서 새로고침 할 때 'RoomInfo' 보다 'SyncRoomInfo'가 나중에 유입되어 expiredFileStdSeq 값을 0으로 덮어쓰는 문제로 보정코드 삽입.
|
||||||
|
* 'SyncRoomInfo' 에서는 expiredFileStdSeq 값이 0으로 고정되어 내려온다.(DB 부하 문제)
|
||||||
|
*/
|
||||||
|
const trgtRoomList = action.roomList.map((roomInfo) => {
|
||||||
|
let rtnValue: RoomInfo = roomInfo;
|
||||||
|
|
||||||
|
// tslint:disable-next-line: forin
|
||||||
|
for (const key in state.rooms.entities) {
|
||||||
|
const value = state.rooms.entities[key];
|
||||||
|
if (value.roomId === roomInfo.roomId && value.expiredFileStdSeq > 0) {
|
||||||
|
rtnValue = {
|
||||||
|
...rtnValue,
|
||||||
|
expiredFileStdSeq: value.expiredFileStdSeq
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtnValue;
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
rooms: adapterRoom.upsertMany(action.roomList, {
|
rooms: adapterRoom.upsertMany(trgtRoomList, {
|
||||||
...state.rooms,
|
...state.rooms,
|
||||||
syncDate: action.syncDate
|
syncDate: action.syncDate
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -7,7 +7,7 @@ import {
|
||||||
RoomInfo,
|
RoomInfo,
|
||||||
UserInfo as RoomUserInfo,
|
UserInfo as RoomUserInfo,
|
||||||
UserInfoShort as RoomUserInfoShort
|
UserInfoShort as RoomUserInfoShort
|
||||||
} from '@ucap/protocol-room';
|
} from '@ucap/domain-chat';
|
||||||
|
|
||||||
export interface RoomState extends EntityState<RoomInfo> {
|
export interface RoomState extends EntityState<RoomInfo> {
|
||||||
syncDate: string;
|
syncDate: string;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import {
|
import {
|
||||||
EventJson,
|
|
||||||
EventType,
|
EventType,
|
||||||
FileEventJson,
|
FileEventJson,
|
||||||
FileType,
|
FileType,
|
||||||
|
@ -9,8 +8,9 @@ import {
|
||||||
TranslationEventJson,
|
TranslationEventJson,
|
||||||
MassTranslationEventJson,
|
MassTranslationEventJson,
|
||||||
PlanEventJson,
|
PlanEventJson,
|
||||||
PlanContentType
|
PlanContentType,
|
||||||
} from '@ucap/protocol-event';
|
EventJson
|
||||||
|
} from '@ucap/domain-chat';
|
||||||
|
|
||||||
export class ChatUtil {
|
export class ChatUtil {
|
||||||
public static convertFinalEventMessage(
|
public static convertFinalEventMessage(
|
||||||
|
|
|
@ -9,12 +9,14 @@
|
||||||
"@ngrx/effects": "@ngrx/effects",
|
"@ngrx/effects": "@ngrx/effects",
|
||||||
"moment": "moment",
|
"moment": "moment",
|
||||||
"@ucap/core": "@ucap/core",
|
"@ucap/core": "@ucap/core",
|
||||||
|
"@ucap/domain-organization": "@ucap/domain-organization",
|
||||||
"@ucap/pi": "@ucap/pi",
|
"@ucap/pi": "@ucap/pi",
|
||||||
"@ucap/protocol-sync": "@ucap/protocol-sync",
|
"@ucap/protocol-sync": "@ucap/protocol-sync",
|
||||||
"@ucap/protocol-group": "@ucap/protocol-group",
|
"@ucap/protocol-group": "@ucap/protocol-group",
|
||||||
"@ucap/protocol-buddy": "@ucap/protocol-buddy",
|
"@ucap/protocol-buddy": "@ucap/protocol-buddy",
|
||||||
"@ucap/protocol-query": "@ucap/protocol-query",
|
"@ucap/protocol-query": "@ucap/protocol-query",
|
||||||
"@ucap/protocol-info": "@ucap/protocol-info",
|
"@ucap/protocol-info": "@ucap/protocol-info",
|
||||||
|
"@ucap/ng-core": "@ucap/ng-core",
|
||||||
"@ucap/ng-protocol-buddy": "@ucap/ng-protocol-buddy",
|
"@ucap/ng-protocol-buddy": "@ucap/ng-protocol-buddy",
|
||||||
"@ucap/ng-protocol-group": "@ucap/ng-protocol-group",
|
"@ucap/ng-protocol-group": "@ucap/ng-protocol-group",
|
||||||
"@ucap/ng-protocol-sync": "@ucap/ng-protocol-sync",
|
"@ucap/ng-protocol-sync": "@ucap/ng-protocol-sync",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-store-group",
|
"name": "@ucap/ng-store-group",
|
||||||
"version": "0.0.22",
|
"version": "0.0.25",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
"@angular/common": "^9.0.2",
|
"@angular/common": "^9.0.2",
|
||||||
"@angular/core": "^9.0.2",
|
"@angular/core": "^9.0.2",
|
||||||
"@ucap/core": "~0.0.1",
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/domain-organization": "~0.0.1",
|
||||||
"@ucap/protocol-buddy": "~0.0.1",
|
"@ucap/protocol-buddy": "~0.0.1",
|
||||||
"@ucap/protocol-group": "~0.0.1",
|
"@ucap/protocol-group": "~0.0.1",
|
||||||
"@ucap/protocol-query": "~0.0.1",
|
"@ucap/protocol-query": "~0.0.1",
|
||||||
|
@ -16,9 +17,9 @@
|
||||||
"@ucap/ng-protocol-buddy": "~0.0.1",
|
"@ucap/ng-protocol-buddy": "~0.0.1",
|
||||||
"@ucap/ng-protocol-group": "~0.0.1",
|
"@ucap/ng-protocol-group": "~0.0.1",
|
||||||
"@ucap/ng-protocol-sync": "~0.0.1",
|
"@ucap/ng-protocol-sync": "~0.0.1",
|
||||||
|
"@ucap/ng-protocol-info": "~0.0.1",
|
||||||
"@ucap/ng-store-organization": "~0.0.1",
|
"@ucap/ng-store-organization": "~0.0.1",
|
||||||
"@ucap/ng-store-authentication": "~0.0.1",
|
"@ucap/ng-store-authentication": "~0.0.1",
|
||||||
"@ucap/ng-protocol-info": "~0.0.1",
|
|
||||||
"tslib": "^1.10.0"
|
"tslib": "^1.10.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
|
|
||||||
import { UserInfo } from '@ucap/protocol-sync';
|
import { UserInfoF } from '@ucap/domain-organization';
|
||||||
import {
|
import {
|
||||||
AddRequest as BuddyAddRequest,
|
AddRequest as BuddyAddRequest,
|
||||||
AddResponse as BuddyAddResponse,
|
AddResponse as BuddyAddResponse,
|
||||||
|
@ -24,7 +24,7 @@ export const buddy2 = createAction('[ucap::group::buddy] buddy2');
|
||||||
*/
|
*/
|
||||||
export const buddy2Success = createAction(
|
export const buddy2Success = createAction(
|
||||||
'[ucap::group::buddy] buddy2 Success',
|
'[ucap::group::buddy] buddy2 Success',
|
||||||
props<{ buddyList: UserInfo[]; syncDate: string }>()
|
props<{ buddyList: UserInfoF[]; syncDate: string }>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
* Failure of buddy2 request
|
* Failure of buddy2 request
|
||||||
|
|
|
@ -25,7 +25,7 @@ import {
|
||||||
} from '@ucap/protocol-info';
|
} from '@ucap/protocol-info';
|
||||||
|
|
||||||
import { SyncProtocolService } from '@ucap/ng-protocol-sync';
|
import { SyncProtocolService } from '@ucap/ng-protocol-sync';
|
||||||
|
import { InfoProtocolService } from '@ucap/ng-protocol-info';
|
||||||
import { BuddyProtocolService } from '@ucap/ng-protocol-buddy';
|
import { BuddyProtocolService } from '@ucap/ng-protocol-buddy';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
@ -62,7 +62,6 @@ import { BuddySelector, GroupSelector } from '../state';
|
||||||
|
|
||||||
import { ModuleConfig } from '../../config/module-config';
|
import { ModuleConfig } from '../../config/module-config';
|
||||||
import { _MODULE_CONFIG } from '../../config/token';
|
import { _MODULE_CONFIG } from '../../config/token';
|
||||||
import { InfoProtocolService } from '@ucap/ng-protocol-info';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class Effects {
|
export class Effects {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { createReducer, on } from '@ngrx/store';
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
import { UserInfoUpdateType } from '@ucap/protocol-info';
|
import { UserInfoUpdateType, UserInfoF } from '@ucap/domain-organization';
|
||||||
import { UserInfo } from '@ucap/protocol-sync';
|
|
||||||
|
import { StringUtil } from '@ucap/ng-core';
|
||||||
|
|
||||||
import { initialState, adapterBuddy } from './state';
|
import { initialState, adapterBuddy } from './state';
|
||||||
import {
|
import {
|
||||||
|
@ -36,7 +37,7 @@ export const reducer = createReducer(
|
||||||
|
|
||||||
on(updateSuccess, (state, action) => {
|
on(updateSuccess, (state, action) => {
|
||||||
const res = action.res;
|
const res = action.res;
|
||||||
const userInfo: UserInfo = {
|
const userInfo: UserInfoF = {
|
||||||
...state.buddies.entities[res.seq],
|
...state.buddies.entities[res.seq],
|
||||||
isFavorit: res.isFavorit
|
isFavorit: res.isFavorit
|
||||||
};
|
};
|
||||||
|
@ -49,7 +50,7 @@ export const reducer = createReducer(
|
||||||
|
|
||||||
on(nicknameSuccess, (state, action) => {
|
on(nicknameSuccess, (state, action) => {
|
||||||
const res = action.res;
|
const res = action.res;
|
||||||
const userInfo: UserInfo = {
|
const userInfo: UserInfoF = {
|
||||||
...state.buddies.entities[res.userSeq],
|
...state.buddies.entities[res.userSeq],
|
||||||
nickName: res.nickname
|
nickName: res.nickname
|
||||||
};
|
};
|
||||||
|
@ -62,18 +63,12 @@ export const reducer = createReducer(
|
||||||
|
|
||||||
on(buddyInfoUpdate, (state, action) => {
|
on(buddyInfoUpdate, (state, action) => {
|
||||||
const noti = action.noti;
|
const noti = action.noti;
|
||||||
let buddyInfo: UserInfo;
|
let buddyInfo: UserInfoF;
|
||||||
|
|
||||||
switch (noti.type) {
|
switch (noti.type) {
|
||||||
case UserInfoUpdateType.Image:
|
case UserInfoUpdateType.Image:
|
||||||
{
|
{
|
||||||
const findIdx = noti.info.indexOf('ProfileImage');
|
const imgInfo = StringUtil.getProfileSubDir(noti.info);
|
||||||
let imgInfo: string = noti.info;
|
|
||||||
|
|
||||||
if (findIdx > -1) {
|
|
||||||
const startIdx = noti.info.indexOf('/', findIdx);
|
|
||||||
imgInfo = noti.info.substring(startIdx);
|
|
||||||
}
|
|
||||||
|
|
||||||
buddyInfo = {
|
buddyInfo = {
|
||||||
...state.buddies.entities[noti.SENDER_SEQ],
|
...state.buddies.entities[noti.SENDER_SEQ],
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||||
|
|
||||||
import { UserInfo } from '@ucap/protocol-sync';
|
import { UserInfoF } from '@ucap/domain-organization';
|
||||||
|
|
||||||
export interface BuddyState extends EntityState<UserInfo> {
|
export interface BuddyState extends EntityState<UserInfoF> {
|
||||||
syncDate: string;
|
syncDate: string;
|
||||||
}
|
}
|
||||||
export const adapterBuddy = createEntityAdapter<UserInfo>({
|
export const adapterBuddy = createEntityAdapter<UserInfoF>({
|
||||||
selectId: (userInfo) => userInfo.seq
|
selectId: (userInfo) => userInfo.seq
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { createAction, props } from '@ngrx/store';
|
import { createAction, props } from '@ngrx/store';
|
||||||
import { GroupRequest, GroupDetailData } from '@ucap/protocol-sync';
|
import { GroupInfoDetail } from '@ucap/domain-group';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AddResponse as GroupAddResponse,
|
AddResponse as GroupAddResponse,
|
||||||
UpdateRequest as GroupUpdateRequest,
|
UpdateRequest as GroupUpdateRequest,
|
||||||
|
@ -17,7 +18,7 @@ export const groups = createAction('[ucap::group::group] groups');
|
||||||
*/
|
*/
|
||||||
export const groupsSuccess = createAction(
|
export const groupsSuccess = createAction(
|
||||||
'[ucap::group::group] groups Success',
|
'[ucap::group::group] groups Success',
|
||||||
props<{ groupList: GroupDetailData[]; syncDate: string }>()
|
props<{ groupList: GroupInfoDetail[]; syncDate: string }>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
* Failure of groups request
|
* Failure of groups request
|
||||||
|
@ -33,7 +34,7 @@ export const groupsFailure = createAction(
|
||||||
export const updateMember = createAction(
|
export const updateMember = createAction(
|
||||||
'[ucap::group::group] updateMember',
|
'[ucap::group::group] updateMember',
|
||||||
props<{
|
props<{
|
||||||
targetGroup: GroupDetailData;
|
targetGroup: GroupInfoDetail;
|
||||||
targetUserSeqs: string[];
|
targetUserSeqs: string[];
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
@ -43,7 +44,7 @@ export const updateMember = createAction(
|
||||||
export const updateMemberSuccess = createAction(
|
export const updateMemberSuccess = createAction(
|
||||||
'[ucap::group::group] updateMember Success',
|
'[ucap::group::group] updateMember Success',
|
||||||
props<{
|
props<{
|
||||||
targetGroup: GroupDetailData;
|
targetGroup: GroupInfoDetail;
|
||||||
targetUserSeqs: string[];
|
targetUserSeqs: string[];
|
||||||
userSeqsForDelete?: string[];
|
userSeqsForDelete?: string[];
|
||||||
}>()
|
}>()
|
||||||
|
@ -62,8 +63,8 @@ export const updateMemberFailure = createAction(
|
||||||
export const moveMember = createAction(
|
export const moveMember = createAction(
|
||||||
'[ucap::group::group] moveMember',
|
'[ucap::group::group] moveMember',
|
||||||
props<{
|
props<{
|
||||||
fromGroup: GroupDetailData;
|
fromGroup: GroupInfoDetail;
|
||||||
toGroup: GroupDetailData;
|
toGroup: GroupInfoDetail;
|
||||||
targetUserSeq: string[];
|
targetUserSeq: string[];
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
|
@ -133,7 +134,7 @@ export const updateFailure = createAction(
|
||||||
export const del = createAction(
|
export const del = createAction(
|
||||||
'[ucap::group::group] del',
|
'[ucap::group::group] del',
|
||||||
props<{
|
props<{
|
||||||
group: GroupDetailData;
|
group: GroupInfoDetail;
|
||||||
}>()
|
}>()
|
||||||
);
|
);
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { createReducer, on } from '@ngrx/store';
|
import { createReducer, on } from '@ngrx/store';
|
||||||
|
|
||||||
import { GroupDetailData } from '@ucap/protocol-sync';
|
import { GroupInfoDetail } from '@ucap/domain-group';
|
||||||
|
|
||||||
import { initialState, adapterGroup } from './state';
|
import { initialState, adapterGroup } from './state';
|
||||||
import { groupsSuccess, createSuccess, delSuccess } from './actions';
|
import { groupsSuccess, createSuccess, delSuccess } from './actions';
|
||||||
|
@ -21,7 +21,7 @@ export const reducer = createReducer(
|
||||||
/** 새 그룹 추가. */
|
/** 새 그룹 추가. */
|
||||||
on(createSuccess, (state, action) => {
|
on(createSuccess, (state, action) => {
|
||||||
const res = action.res;
|
const res = action.res;
|
||||||
const groupInfo: GroupDetailData = {
|
const groupInfo: GroupInfoDetail = {
|
||||||
seq: res.groupSeq,
|
seq: res.groupSeq,
|
||||||
name: res.groupName,
|
name: res.groupName,
|
||||||
isActive: true,
|
isActive: true,
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { Selector, createSelector } from '@ngrx/store';
|
import { Selector, createSelector } from '@ngrx/store';
|
||||||
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
import { EntityState, createEntityAdapter } from '@ngrx/entity';
|
||||||
import { GroupDetailData } from '@ucap/protocol-sync';
|
import { GroupInfoDetail } from '@ucap/domain-group';
|
||||||
|
|
||||||
export interface GroupState extends EntityState<GroupDetailData> {
|
export interface GroupState extends EntityState<GroupInfoDetail> {
|
||||||
syncDate: string;
|
syncDate: string;
|
||||||
}
|
}
|
||||||
export const adapterGroup = createEntityAdapter<GroupDetailData>({
|
export const adapterGroup = createEntityAdapter<GroupInfoDetail>({
|
||||||
selectId: groupDetailData => groupDetailData.seq
|
selectId: (groupDetailData) => groupDetailData.seq
|
||||||
});
|
});
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
|
@ -35,7 +35,7 @@ export function selectors<S>(selector: Selector<any, State>) {
|
||||||
groups: createSelector(selectGroups, selectAllForGroup),
|
groups: createSelector(selectGroups, selectAllForGroup),
|
||||||
groupSyncDate: createSelector(
|
groupSyncDate: createSelector(
|
||||||
selectGroups,
|
selectGroups,
|
||||||
groupState => groupState.syncDate
|
(groupState) => groupState.syncDate
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,8 +8,11 @@
|
||||||
"@ngrx/effects": "@ngrx/effects",
|
"@ngrx/effects": "@ngrx/effects",
|
||||||
"@ngrx/entity": "@ngrx/entity",
|
"@ngrx/entity": "@ngrx/entity",
|
||||||
|
|
||||||
|
"@ucap/domain-organization": "@ucap/domain-organization",
|
||||||
|
"@ucap/domain-status": "@ucap/domain-status",
|
||||||
"@ucap/protocol-query": "@ucap/protocol-query",
|
"@ucap/protocol-query": "@ucap/protocol-query",
|
||||||
"@ucap/protocol-status": "@ucap/protocol-status",
|
"@ucap/protocol-status": "@ucap/protocol-status",
|
||||||
|
"@ucap/ng-core": "@ucap/ng-core",
|
||||||
"@ucap/ng-api-external": "@ucap/ng-api-external",
|
"@ucap/ng-api-external": "@ucap/ng-api-external",
|
||||||
"@ucap/ng-protocol-info": "@ucap/ng-protocol-info",
|
"@ucap/ng-protocol-info": "@ucap/ng-protocol-info",
|
||||||
"@ucap/ng-protocol-query": "@ucap/ng-protocol-query",
|
"@ucap/ng-protocol-query": "@ucap/ng-protocol-query",
|
||||||
|
|
|
@ -1,17 +1,26 @@
|
||||||
{
|
{
|
||||||
"name": "@ucap/ng-store-organization",
|
"name": "@ucap/ng-store-organization",
|
||||||
"version": "0.0.20",
|
"version": "0.0.23",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
"registry": "https://nexus.loafle.net/repository/npm-ucap/"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@angular/common": "^9.0.0",
|
"@angular/common": "^9.0.0",
|
||||||
"@angular/core": "^9.0.0",
|
"@angular/core": "^9.0.0",
|
||||||
|
"@ngrx/store": "^9.2.0",
|
||||||
|
"@ngrx/effects": "^9.2.0",
|
||||||
"@ucap/core": "~0.0.1",
|
"@ucap/core": "~0.0.1",
|
||||||
|
"@ucap/domain-organization": "~0.0.1",
|
||||||
|
"@ucap/domain-status": "~0.0.1",
|
||||||
|
"@ucap/api-external": "~0.0.1",
|
||||||
|
"@ucap/protocol-info": "~0.0.1",
|
||||||
"@ucap/protocol-query": "~0.0.1",
|
"@ucap/protocol-query": "~0.0.1",
|
||||||
|
"@ucap/protocol-status": "~0.0.1",
|
||||||
"@ucap/ng-api-external": "~0.0.1",
|
"@ucap/ng-api-external": "~0.0.1",
|
||||||
"@ucap/ng-protocol-info": "~0.0.1",
|
"@ucap/ng-protocol-info": "~0.0.1",
|
||||||
"@ucap/ng-protocol-query": "~0.0.1",
|
"@ucap/ng-protocol-query": "~0.0.1",
|
||||||
|
"@ucap/ng-protocol-status": "~0.0.1",
|
||||||
|
"rxjs": "~6.5.4",
|
||||||
"tslib": "^1.10.0"
|
"tslib": "^1.10.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user