@testgorilla/tgo-ai-interview-test 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/fesm2022/testgorilla-tgo-ai-interview-test.mjs +478 -0
  2. package/fesm2022/testgorilla-tgo-ai-interview-test.mjs.map +1 -0
  3. package/lib/components/ai-interview-test/ai-interview-test.component.d.ts +44 -0
  4. package/lib/components/interview-stream/interview-stream.component.d.ts +46 -0
  5. package/lib/components/interview-video/interview-video.component.d.ts +16 -0
  6. package/lib/models/index.d.ts +3 -0
  7. package/lib/models/question-component.d.ts +5 -0
  8. package/lib/models/translations.d.ts +1 -0
  9. package/package.json +29 -12
  10. package/.eslintrc.json +0 -46
  11. package/jest.config.ts +0 -29
  12. package/ng-package.json +0 -16
  13. package/project.json +0 -48
  14. package/src/lib/components/ai-interview-test/ai-interview-test.component.html +0 -42
  15. package/src/lib/components/ai-interview-test/ai-interview-test.component.scss +0 -167
  16. package/src/lib/components/ai-interview-test/ai-interview-test.component.spec.ts +0 -212
  17. package/src/lib/components/ai-interview-test/ai-interview-test.component.ts +0 -192
  18. package/src/lib/components/interview-stream/interview-stream.component.html +0 -9
  19. package/src/lib/components/interview-stream/interview-stream.component.scss +0 -5
  20. package/src/lib/components/interview-stream/interview-stream.component.spec.ts +0 -259
  21. package/src/lib/components/interview-stream/interview-stream.component.ts +0 -320
  22. package/src/lib/components/interview-video/interview-video.component.html +0 -8
  23. package/src/lib/components/interview-video/interview-video.component.scss +0 -7
  24. package/src/lib/components/interview-video/interview-video.component.spec.ts +0 -140
  25. package/src/lib/components/interview-video/interview-video.component.ts +0 -67
  26. package/src/lib/models/index.ts +0 -13
  27. package/src/lib/models/question-component.ts +0 -13
  28. package/src/lib/models/translations.ts +0 -3
  29. package/src/test-setup.ts +0 -76
  30. package/tsconfig.json +0 -20
  31. package/tsconfig.lib.json +0 -20
  32. package/tsconfig.lib.prod.json +0 -11
  33. package/tsconfig.spec.json +0 -17
  34. /package/{src/assets → assets}/i18n/en.json +0 -0
  35. /package/{src/index.ts → index.d.ts} +0 -0
  36. /package/{src/lib/components/index.ts → lib/components/index.d.ts} +0 -0
@@ -0,0 +1,46 @@
1
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import { DailyCall, DailyParticipant } from '@daily-co/daily-js';
3
+ import { SelectedMediaDevices } from '@testgorilla/tgo-shared-lib';
4
+ import * as i0 from "@angular/core";
5
+ export type Participant = {
6
+ videoTrack?: MediaStreamTrack | undefined;
7
+ audioTrack?: MediaStreamTrack | undefined;
8
+ videoReady: boolean;
9
+ audioReady: boolean;
10
+ userName: string;
11
+ local: boolean;
12
+ sessionId: string;
13
+ };
14
+ export declare class InterviewStreamComponent implements OnInit, OnDestroy {
15
+ conversationUrl: string | undefined;
16
+ selectedMediaDevices: SelectedMediaDevices | undefined;
17
+ translations: {
18
+ [key: string]: string;
19
+ };
20
+ streamStart: EventEmitter<null>;
21
+ streamEnd: EventEmitter<null>;
22
+ checkMediaPermissions: EventEmitter<null>;
23
+ callObject: DailyCall | undefined;
24
+ avatarParticipant: Participant | undefined;
25
+ candidateJoined: import("@angular/core").WritableSignal<boolean>;
26
+ private cdr;
27
+ ngOnInit(): void;
28
+ ngOnDestroy(): void;
29
+ private setupCall;
30
+ formatParticipantObj(participant: DailyParticipant): Participant;
31
+ updateTrack(participant: DailyParticipant, newTrackType: string): void;
32
+ private candidateJoinMeeting;
33
+ private participantJoined;
34
+ private handleTrackStartedStopped;
35
+ private handleParticipantLeft;
36
+ private handleError;
37
+ private handleLeftMeeting;
38
+ private leaveCall;
39
+ private handleNewMessage;
40
+ private getConversationId;
41
+ private handleToolCall;
42
+ private sendMessage;
43
+ private getToolCallTranslation;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<InterviewStreamComponent, never>;
45
+ static ɵcmp: i0.ɵɵComponentDeclaration<InterviewStreamComponent, "tgo-interview-stream", never, { "conversationUrl": { "alias": "conversationUrl"; "required": false; }; "selectedMediaDevices": { "alias": "selectedMediaDevices"; "required": false; }; "translations": { "alias": "translations"; "required": false; }; }, { "streamStart": "streamStart"; "streamEnd": "streamEnd"; "checkMediaPermissions": "checkMediaPermissions"; }, never, never, true, never>;
46
+ }
@@ -0,0 +1,16 @@
1
+ import { OnInit, SimpleChanges, OnChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class InterviewVideoComponent implements OnInit, OnChanges {
4
+ videoTrack: MediaStreamTrack | undefined;
5
+ audioTrack: MediaStreamTrack | undefined;
6
+ videoStream: MediaStream | undefined;
7
+ audioStream: MediaStream | undefined;
8
+ ngOnInit(): void;
9
+ ngOnChanges(changes: SimpleChanges): void;
10
+ addVideoStream(track: MediaStreamTrack): void;
11
+ addAudioStream(track: MediaStreamTrack): void;
12
+ updateVideoTrack(oldTrack: MediaStreamTrack, track: MediaStreamTrack): void;
13
+ updateAudioTrack(oldTrack: MediaStreamTrack, track: MediaStreamTrack): void;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<InterviewVideoComponent, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<InterviewVideoComponent, "tgo-interview-video", never, { "videoTrack": { "alias": "videoTrack"; "required": false; }; "audioTrack": { "alias": "audioTrack"; "required": false; }; }, {}, never, never, true, never>;
16
+ }
@@ -0,0 +1,3 @@
1
+ export { Question, TestResultRead, SelectedMediaDevices, ISubmissionState, ROOT_TRANSLATIONS_SCOPE, } from '@testgorilla/tgo-shared-lib';
2
+ export * from './question-component';
3
+ export * from './translations';
@@ -0,0 +1,5 @@
1
+ import { IQuestionDataContract as BaseIQuestionDataContract } from '@testgorilla/tgo-shared-lib';
2
+ export interface IQuestionDataContract extends BaseIQuestionDataContract {
3
+ conversationUrl?: string;
4
+ }
5
+ export { SelectedMediaDevices, ISubmissionState, } from '@testgorilla/tgo-shared-lib';
@@ -0,0 +1 @@
1
+ export { ROOT_TRANSLATIONS_SCOPE } from '@testgorilla/tgo-shared-lib';
package/package.json CHANGED
@@ -1,19 +1,36 @@
1
1
  {
2
2
  "name": "@testgorilla/tgo-ai-interview-test",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "peerDependencies": {
5
- "@angular/common": "~19.2.17",
6
- "@angular/core": "~19.2.17",
7
- "@angular/animations": "~19.2.17",
8
- "@ngneat/transloco": "~4.3.0",
9
- "@testgorilla/tgo-ui": "~4.0.0",
10
- "@daily-co/daily-js": "^0.79.0",
11
- "jest-preset-angular": "14.4.2",
12
- "rxjs": "~7.8.1"
5
+ "@angular/common": ">= 19.0.0 < 20.0.0",
6
+ "@angular/core": ">= 19.0.0 < 20.0.0",
7
+ "@angular/animations": ">= 19.0.0 < 20.0.0",
8
+ "@ngneat/transloco": ">= 4.0.0 < 5.0.0",
9
+ "@testgorilla/tgo-ui": ">= 4.0.0 < 5.0.0",
10
+ "@daily-co/daily-js": ">= 0.79.0 < 1.0.0",
11
+ "rxjs": ">= 7.0.0 < 8.0.0"
13
12
  },
14
- "typings": "src/lib/types",
13
+ "dependencies": {
14
+ "@testgorilla/tgo-shared-lib": ">= 2.0.0 < 3.0.0",
15
+ "tslib": "^2.3.0"
16
+ },
17
+ "typings": "index.d.ts",
15
18
  "sideEffects": false,
16
19
  "license": "PROPRIETARY",
20
+ "publishConfig": {
21
+ "access": "public",
22
+ "registry": "https://registry.npmjs.org/"
23
+ },
17
24
  "displayName": "AI Interview",
18
- "description": "AI Interview component"
19
- }
25
+ "description": "AI Interview component",
26
+ "module": "fesm2022/testgorilla-tgo-ai-interview-test.mjs",
27
+ "exports": {
28
+ "./package.json": {
29
+ "default": "./package.json"
30
+ },
31
+ ".": {
32
+ "types": "./index.d.ts",
33
+ "default": "./fesm2022/testgorilla-tgo-ai-interview-test.mjs"
34
+ }
35
+ }
36
+ }
package/.eslintrc.json DELETED
@@ -1,46 +0,0 @@
1
- {
2
- "extends": ["../../.eslintrc.json"],
3
- "ignorePatterns": ["!**/*"],
4
- "overrides": [
5
- {
6
- "files": ["*.ts"],
7
- "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
8
- "rules": {
9
- "@angular-eslint/directive-selector": [
10
- "error",
11
- {
12
- "type": "attribute",
13
- "prefix": "tgo",
14
- "style": "camelCase"
15
- }
16
- ],
17
- "@angular-eslint/component-selector": [
18
- "error",
19
- {
20
- "type": "element",
21
- "prefix": "tgo",
22
- "style": "kebab-case"
23
- }
24
- ],
25
- "@angular-eslint/prefer-standalone": "off"
26
- }
27
- },
28
- {
29
- "files": ["*.html"],
30
- "extends": ["plugin:@nx/angular-template"],
31
- "rules": {}
32
- },
33
- {
34
- "files": ["*.json"],
35
- "parser": "jsonc-eslint-parser",
36
- "rules": {
37
- "@nx/dependency-checks": [
38
- "error",
39
- {
40
- "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"]
41
- }
42
- ]
43
- }
44
- }
45
- ]
46
- }
package/jest.config.ts DELETED
@@ -1,29 +0,0 @@
1
- export default {
2
- displayName: 'tgo-ai-interview-test',
3
- preset: '../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
- coverageDirectory: '../../coverage/packages/tgo-ai-interview-test',
6
- testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/*.spec.[jt]s?(x)'],
7
- testPathIgnorePatterns: ['/node_modules/', '/src/lib/models/'],
8
- moduleNameMapper: {
9
- '^@testgorilla/tgo-ui$': '<rootDir>/../shared/src/test-mocks/tgo-ui.mock.ts',
10
- '^@testgorilla/tgo-test-shared$': '<rootDir>/src/shared/index.ts',
11
- },
12
- transform: {
13
- '^.+\\.(ts|mjs|js|html)$': [
14
- 'jest-preset-angular',
15
- {
16
- tsconfig: '<rootDir>/tsconfig.spec.json',
17
- stringifyContentPathRegex: '\\.(html|svg)$',
18
- },
19
- ],
20
- },
21
- transformIgnorePatterns: [
22
- 'node_modules/(?!.*\\.mjs$|lodash-es|@testgorilla|ng2-charts|chart\\.js|chartjs-plugin-datalabels|@daily-co)',
23
- ],
24
- snapshotSerializers: [
25
- 'jest-preset-angular/build/serializers/no-ng-attributes',
26
- 'jest-preset-angular/build/serializers/ng-snapshot',
27
- 'jest-preset-angular/build/serializers/html-comment',
28
- ],
29
- };
package/ng-package.json DELETED
@@ -1,16 +0,0 @@
1
- {
2
- "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
- "dest": "../../dist/packages/tgo-ai-interview-test",
4
- "assets": [
5
- {
6
- "glob": "**/*",
7
- "input": "./src/assets",
8
- "output": "./assets"
9
- }
10
- ],
11
- "lib": {
12
- "entryFile": "./src/index.ts"
13
- },
14
- "allowedNonPeerDependencies": []
15
- }
16
-
package/project.json DELETED
@@ -1,48 +0,0 @@
1
- {
2
- "name": "tgo-ai-interview-test",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "sourceRoot": "packages/tgo-ai-interview-test/src",
5
- "prefix": "tgo",
6
- "projectType": "library",
7
- "tags": [],
8
- "targets": {
9
- "build": {
10
- "executor": "nx:run-commands",
11
- "outputs": ["{workspaceRoot}/dist/packages/tgo-ai-interview-test"],
12
- "options": {
13
- "commands": [
14
- "nx run tgo-ai-interview-test:package",
15
- "node scripts/replace-shared-alias.js dist/packages/tgo-ai-interview-test @testgorilla/tgo-test-shared"
16
- ],
17
- "parallel": false,
18
- "forwardAllArgs": false
19
- }
20
- },
21
- "package": {
22
- "executor": "@nx/angular:package",
23
- "outputs": ["{workspaceRoot}/dist/{projectRoot}"],
24
- "options": {
25
- "project": "packages/tgo-ai-interview-test/ng-package.json"
26
- },
27
- "configurations": {
28
- "production": {
29
- "tsConfig": "packages/tgo-ai-interview-test/tsconfig.lib.prod.json"
30
- },
31
- "development": {
32
- "tsConfig": "packages/tgo-ai-interview-test/tsconfig.lib.json"
33
- }
34
- },
35
- "defaultConfiguration": "production"
36
- },
37
- "test": {
38
- "executor": "@nx/jest:jest",
39
- "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
40
- "options": {
41
- "jestConfig": "packages/tgo-ai-interview-test/jest.config.ts"
42
- }
43
- },
44
- "lint": {
45
- "executor": "@nx/eslint:lint"
46
- }
47
- }
48
- }
@@ -1,42 +0,0 @@
1
- <div class="ai-interview-test">
2
- <div class="test-container">
3
- <div
4
- class="media-container"
5
- [class.is-video-visible]="isInterviewInProgress()"
6
- >
7
- <div class="candidate-no-camera" *ngIf="!candidateVideoStreamReady()">
8
- <h3>&nbsp;</h3>
9
- <ui-icon name="User-profile-in-line" color="white" size="24"></ui-icon>
10
- <h3 class="bold">{{ translations['YOU'] }}</h3>
11
- </div>
12
- <div class="candidate-camera" [hidden]="!candidateVideoStreamReady()">
13
- <video
14
- height
15
- #video
16
- id="video"
17
- playsinline
18
- (loadedmetadata)="onVideoLoad()"
19
- ></video>
20
- <h3 class="bold" *ngIf="candidateVideoStreamReady()">
21
- {{ translations['YOU'] }}
22
- </h3>
23
- </div>
24
- <tgo-audio-animation
25
- *ngIf="isInterviewInProgress()"
26
- [fakeData]="true"
27
- ></tgo-audio-animation>
28
- <div class="interview-stream-container">
29
- <tgo-interview-stream
30
- *ngIf="conversationUrl && hasMediaPermissions()"
31
- [selectedMediaDevices]="selectedMediaDevices"
32
- [conversationUrl]="conversationUrl"
33
- (streamStart)="interviewStarted()"
34
- (streamEnd)="interviewEnded()"
35
- (checkMediaPermissions)="checkMediaPermissions()"
36
- [translations]="translations"
37
- ></tgo-interview-stream>
38
- </div>
39
- </div>
40
- </div>
41
- </div>
42
-
@@ -1,167 +0,0 @@
1
- @import '@testgorilla/tgo-ui/projects/tgo-canopy-ui/theme/variables';
2
-
3
- $border-radius: 10px;
4
-
5
- .ai-interview-test {
6
- background-color: $black;
7
- padding: 24px;
8
- display: flex;
9
- justify-content: center;
10
- min-height: calc(100vh - 80px);
11
-
12
- h3 {
13
- color: $tgo-white;
14
- }
15
-
16
- .test-container {
17
- min-width: 360px;
18
- width: 100%;
19
- min-height: 300px;
20
- height: min(725px, 100%, max(calc(100vw), calc(100vh), 200px));
21
- max-width: calc(100vh * (16 / 9) - 80px - 48px);
22
- display: flex;
23
- flex-direction: column;
24
- justify-content: space-between;
25
- position: relative;
26
- background-color: $black;
27
- }
28
-
29
- .media-container {
30
- position: relative;
31
- color: $tgo-white;
32
- flex-grow: 1;
33
-
34
- .interview-stream-container {
35
- border-radius: $border-radius;
36
- aspect-ratio: 16 / 9;
37
- border: 4px solid $informative-40;
38
- margin: 0 auto;
39
- }
40
-
41
- .candidate-no-camera {
42
- position: absolute;
43
- width: 200px;
44
- aspect-ratio: 16 / 9;
45
- z-index: 3;
46
- top: 32px;
47
- left: 32px;
48
- border-radius: $border-radius;
49
- background-color: #1a47aa;
50
- display: flex;
51
- justify-content: space-between;
52
- flex-direction: column;
53
- padding: 16px;
54
-
55
- ui-icon {
56
- margin: auto;
57
- }
58
- }
59
-
60
- .candidate-camera {
61
- position: absolute;
62
- width: 200px;
63
- top: 32px;
64
- left: 32px;
65
- z-index: 3;
66
-
67
- video {
68
- width: 200px;
69
- border-radius: $border-radius;
70
- }
71
-
72
- h3 {
73
- position: absolute;
74
- bottom: 16px;
75
- left: 16px;
76
- }
77
- }
78
-
79
- tgo-audio-animation {
80
- position: absolute;
81
- top: 32px;
82
- right: 32px;
83
- z-index: 1;
84
- }
85
-
86
- tgo-vimeo-video {
87
- display: none;
88
- position: absolute;
89
- height: 100%;
90
- width: 100%;
91
- }
92
-
93
- &.is-video-visible {
94
- tgo-vimeo-video {
95
- display: block;
96
- }
97
- }
98
-
99
- &.is-playing {
100
- border: 4px solid $informative-40;
101
- border-bottom-width: 3px;
102
- }
103
-
104
- &.is-answering {
105
- .candidate-camera,
106
- .candidate-no-camera {
107
- tgo-audio-animation {
108
- position: absolute;
109
- top: 16px;
110
- right: 16px;
111
- }
112
- }
113
-
114
- .candidate-camera video,
115
- .candidate-no-camera {
116
- border: 3px solid $informative-40;
117
- border-radius: $border-radius;
118
- }
119
-
120
- tgo-vimeo-video {
121
- display: block;
122
- }
123
- }
124
-
125
- .start,
126
- .audio-info,
127
- .overlay,
128
- .answer {
129
- display: flex;
130
- justify-content: center;
131
- align-items: center;
132
- flex-direction: column;
133
- gap: 40px;
134
- height: 100%;
135
- }
136
-
137
- .preview {
138
- height: 100%;
139
- display: flex;
140
- align-items: center;
141
- flex-direction: column;
142
- justify-content: flex-end;
143
- padding: 24px;
144
-
145
- p {
146
- color: $grayscale-30;
147
- margin: 8px 0;
148
- }
149
-
150
- audio {
151
- margin: 16px 0;
152
- }
153
-
154
- &.hidden {
155
- display: none;
156
- }
157
- }
158
- }
159
- }
160
-
161
- @media screen and (max-width: 600px) {
162
- .ai-interview-test {
163
- padding: 0 24px;
164
- margin-top: 16px;
165
- }
166
- }
167
-