Просмотр исходного кода

Play pronunciation when selecting wordbook words

彭峰 2 недель назад
Родитель
Сommit
de21ed42b7

+ 24 - 0
projects/xiaoshu-mobile/src/app/core/home-learning-modules.integration.spec.ts

@@ -481,6 +481,30 @@ describe('home learning modules', () => {
     expect(harness.routeNativeElement?.querySelector('.pending-column .word-select-list > button.selected')).not.toBeNull();
   });
 
+  it('pronounces a wordbook word on row click and only once on speaker click', async () => {
+    const api = TestBed.inject(ApiService) as unknown as LearningModulesApiService;
+    const get = api.get.bind(api);
+    spyOn(api, 'get').and.callFake((action, params) => action === 'e_words_list'
+      ? of({ retcode: 1, result: [{ GeneralID: 601, xxcs: 1, detail: [{ GeneralID: 701, Title: 'tend', yp: 'UploadFiles/tend.mp3' }] }],
+        page: { itemCount: 1, pageCount: 1, pageIndex: 1, pageSize: Number(params?.['psize']) } } as ApiEnvelope<any>)
+      : get(action, params));
+    const play = spyOn(TestBed.inject(PlatformService), 'play');
+    const harness = await RouterTestingHarness.create();
+    await harness.navigateByUrl('/pages/member/starshop');
+    harness.fixture.detectChanges();
+    const row = harness.routeNativeElement?.querySelector('.pending-column .word-select-list > button') as HTMLButtonElement;
+    row.querySelector('strong')!.click();
+    harness.fixture.detectChanges();
+    expect(row.classList.contains('selected')).toBeTrue();
+    expect(play).toHaveBeenCalledTimes(1);
+    expect(play.calls.mostRecent().args[0]).toBe('UploadFiles/tend.mp3');
+    expect(play.calls.mostRecent().args[0]).not.toContain('UploadFiles/UploadFiles');
+    (row.querySelector('.audio') as HTMLElement).click();
+    harness.fixture.detectChanges();
+    expect(play).toHaveBeenCalledTimes(2);
+    expect(row.classList.contains('selected')).toBeTrue();
+  });
+
   it('shows 30 wordbook words per page while counting every learning status', async () => {
     const api = TestBed.inject(ApiService) as unknown as LearningModulesApiService;
     const get = api.get.bind(api);

+ 1 - 1
projects/xiaoshu-mobile/src/app/features/learning/learning-page.component.html

@@ -132,7 +132,7 @@
         <section class="word-selection-list" [class.pending-column]="activeSelectionBucket() === 'pending'" [class.completed-column]="activeSelectionBucket() === 'completed'" role="tabpanel" [attr.aria-label]="activeSelectionBucket() === 'pending' ? '未学习的生词' : '已学习的生词'">
           <div class="word-select-list">
             @for (word of visibleNewWords(); track word.id) {
-              <button type="button" [class.selected]="selected().has(word.id)" (click)="toggleWord(word)">
+              <button type="button" [class.selected]="selected().has(word.id)" (click)="toggleWord(word); play(word)">
                 <span class="check">@if (selected().has(word.id)) { <lucide-icon [img]="icons.Check" [size]="16" /> }</span>
                 <span><strong>{{ word.word }}</strong><small>{{ word.meaning || '暂无释义' }}</small></span>
                 <span class="audio" (click)="$event.stopPropagation(); play(word)"><lucide-icon [img]="icons.Volume2" [size]="18" /></span>

+ 1 - 1
projects/xiaoshu-mobile/src/app/features/learning/learning-page.component.ts

@@ -2112,7 +2112,7 @@ export class LearningPageComponent implements OnInit, OnDestroy {
 
   private wordAudioUrl(path: string): string {
     if (/^(data:|https?:\/\/|\/)/i.test(path)) return this.api.assetUrl(path);
-    return this.api.assetUrl(`UploadFiles/${path}`);
+    return this.api.assetUrl(/^UploadFiles\//i.test(path) ? path : `UploadFiles/${path}`);
   }
 
   private setWordSelected(word: Word, shouldSelect: boolean): boolean {