diff --git a/src/app/data-structure/has-id-and-title.ts b/src/app/data-structure/has-id-and-title.ts index 5d8d44c..531bf38 100644 --- a/src/app/data-structure/has-id-and-title.ts +++ b/src/app/data-structure/has-id-and-title.ts @@ -1,5 +1,5 @@ export class HasIdAndTitle { - public id: string; - public title: string; - public link: string; + public id: string = ""; + public title: string = ""; + public link: string = ""; } diff --git a/src/app/data-structure/login-info.ts b/src/app/data-structure/login-info.ts index ec2a64b..cfc3ff7 100644 --- a/src/app/data-structure/login-info.ts +++ b/src/app/data-structure/login-info.ts @@ -5,15 +5,15 @@ export class LoginInfo { return plainToClass(LoginInfo, obj as object); } - public loggedIn: boolean; - public nickname: string; + public loggedIn: boolean = false; + public nickname: string = ""; - public googleLinked: boolean; - public googleProfileUrl: string; - public gitHubLinked: boolean; - public gitHubProfileUrl: string; - public facebookLinked: boolean; - public facebookProfileUrl: string; + public googleLinked: boolean = false; + public googleProfileUrl: string = ""; + public gitHubLinked: boolean = false; + public gitHubProfileUrl: string = ""; + public facebookLinked: boolean = false; + public facebookProfileUrl: string = ""; - public errorMessage: string; + public errorMessage: string = ""; } diff --git a/src/app/data-structure/quiz-question-and-answer.ts b/src/app/data-structure/quiz-question-and-answer.ts index ab35468..3066c3c 100644 --- a/src/app/data-structure/quiz-question-and-answer.ts +++ b/src/app/data-structure/quiz-question-and-answer.ts @@ -4,8 +4,8 @@ import { QuizText } from "./quiz-text"; export class QuizQuestionAndAnswer { @Type(() => QuizQuestion) - public question: QuizQuestion; + public question?: QuizQuestion; @Type(() => QuizText) - public answer: QuizText; + public answer?: QuizText; } diff --git a/src/app/data-structure/quiz-question.ts b/src/app/data-structure/quiz-question.ts index 2082040..457c87d 100644 --- a/src/app/data-structure/quiz-question.ts +++ b/src/app/data-structure/quiz-question.ts @@ -8,25 +8,25 @@ export class QuizQuestion extends HasIdAndTitle { } @Type(() => QuizText) - public text: QuizText; + public text?: QuizText; - public note: string; - public videoUrl: string; - public codeUrl: string; + public note: string = ""; + public videoUrl: string = ""; + public codeUrl: string = ""; @Type(() => QuizText) - public choices: QuizText[]; + public choices?: QuizText[]; - public sectionId: string; - public subSectionId: string; + public sectionId: string = ""; + public subSectionId: string = ""; - public quizTitle: string; + public quizTitle: string = ""; @Type(() => HasIdAndTitle) - public section: HasIdAndTitle; + public section?: HasIdAndTitle; @Type(() => HasIdAndTitle) - public subSection: HasIdAndTitle; + public subSection?: HasIdAndTitle; - public quizUsesMathML: boolean; + public quizUsesMathML: boolean = false; } diff --git a/src/app/data-structure/quiz-section.ts b/src/app/data-structure/quiz-section.ts index 53851b2..0636e6f 100644 --- a/src/app/data-structure/quiz-section.ts +++ b/src/app/data-structure/quiz-section.ts @@ -1,12 +1,11 @@ import { plainToClass, Type } from "class-transformer"; -import {isUndefined} from "util"; import { HasIdAndTitle } from "./has-id-and-title"; import { QuizQuestionAndAnswer } from "./quiz-question-and-answer"; import { QuizSubSection } from "./quiz-sub-section"; export class QuizSection extends HasIdAndTitle { - public static fromJson(obj: any): QuizSection { - if (isUndefined(obj)) { + public static fromJson(obj: any): QuizSection | undefined { + if (!obj!) { return undefined; } @@ -14,9 +13,9 @@ export class QuizSection extends HasIdAndTitle { } @Type(() => QuizSubSection) - public subSections: QuizSubSection[]; + public subSections: QuizSubSection[] = []; // defaultChoices @Type(() => QuizQuestionAndAnswer) - public questions: QuizQuestionAndAnswer[]; + public questions: QuizQuestionAndAnswer[] = []; } diff --git a/src/app/data-structure/quiz-sub-section.ts b/src/app/data-structure/quiz-sub-section.ts index 28f50f3..0120213 100644 --- a/src/app/data-structure/quiz-sub-section.ts +++ b/src/app/data-structure/quiz-sub-section.ts @@ -5,7 +5,7 @@ import { QuizQuestionAndAnswer } from "./quiz-question-and-answer"; export class QuizSubSection extends HasIdAndTitle { @Type(() => QuizQuestionAndAnswer) - public questions: QuizQuestionAndAnswer[]; + public questions: QuizQuestionAndAnswer[] = []; public addQuestion(qa: QuizQuestionAndAnswer): void { if (!this.questions) { diff --git a/src/app/data-structure/quiz-text.ts b/src/app/data-structure/quiz-text.ts index 96942f7..009ba2d 100644 --- a/src/app/data-structure/quiz-text.ts +++ b/src/app/data-structure/quiz-text.ts @@ -1,4 +1,4 @@ export class QuizText { - public text: string; - public isHtml: boolean; + public text: string = ""; + public isHtml: boolean = false; } diff --git a/src/app/data-structure/quiz.ts b/src/app/data-structure/quiz.ts index 4b73e45..b51a343 100644 --- a/src/app/data-structure/quiz.ts +++ b/src/app/data-structure/quiz.ts @@ -8,9 +8,9 @@ export class Quiz extends HasIdAndTitle { return plainToClass(Quiz, obj as object); } - public isPrivate: boolean; - public usesMathML: boolean; + public isPrivate: boolean = false; + public usesMathML: boolean = false; @Type(() => QuizSection) - public sections: QuizSection[]; + public sections: QuizSection[] = []; } diff --git a/src/app/data-structure/submission-result.ts b/src/app/data-structure/submission-result.ts index 88d7557..8d7fa5d 100644 --- a/src/app/data-structure/submission-result.ts +++ b/src/app/data-structure/submission-result.ts @@ -7,11 +7,11 @@ export class SubmissionResult { return plainToClass(SubmissionResult, obj as object); } - public result: boolean; + public result: boolean = false; @Type(() => QuizText) - public correctAnswer: QuizText; + public correctAnswer?: QuizText = undefined; @Type(() => QuizQuestion) - public nextQuestion: QuizQuestion; + public nextQuestion?: QuizQuestion = undefined; } diff --git a/src/app/data-structure/submission.ts b/src/app/data-structure/submission.ts index 4d3ee87..596586c 100644 --- a/src/app/data-structure/submission.ts +++ b/src/app/data-structure/submission.ts @@ -1,3 +1,3 @@ export class Submission { - public answer: string; + public answer: string = ""; } diff --git a/src/app/data-structure/user-history-quizzes.ts b/src/app/data-structure/user-history-quizzes.ts index c2cf948..ed3bd04 100644 --- a/src/app/data-structure/user-history-quizzes.ts +++ b/src/app/data-structure/user-history-quizzes.ts @@ -7,5 +7,5 @@ export class UserHistoryQuizzes { } @Type(() => UserStats) - public stats: UserStats[]; + public stats: UserStats[] = []; } diff --git a/src/app/data-structure/user-history-sections.ts b/src/app/data-structure/user-history-sections.ts index 8b66474..fceaa9d 100644 --- a/src/app/data-structure/user-history-sections.ts +++ b/src/app/data-structure/user-history-sections.ts @@ -17,27 +17,27 @@ export class UserHistorySections { } // After parsing, we will use only statsMap. - result.stats = undefined; + result.stats = []; } return result; } @Type(() => LoginInfo) - public loginInfo: LoginInfo; + public loginInfo?: LoginInfo = undefined; - public quizId: string; - public quizTitle: string; + public quizId: string = ""; + public quizTitle: string = ""; // Only used when parsing from JSON. @Type(() => UserStats) - public stats: UserStats[]; + public stats: UserStats[] = []; // Map of section IDs to stats. // This is built from stats - public statsMap: Map; + public statsMap: Map = new Map(); - public getUserStatsForSection(sectionId: string): UserStats { + public getUserStatsForSection(sectionId: string): UserStats | undefined { if (!this.statsMap) { return undefined; } @@ -46,10 +46,6 @@ export class UserHistorySections { } public setUserStatsForSection(sectionId: string, userStats: UserStats) { - if (!this.statsMap) { - this.statsMap = new Map(); - } - // Update in the map. this.statsMap.set(sectionId, userStats); } diff --git a/src/app/data-structure/user-question-history.ts b/src/app/data-structure/user-question-history.ts index f0c01fa..525c403 100644 --- a/src/app/data-structure/user-question-history.ts +++ b/src/app/data-structure/user-question-history.ts @@ -15,13 +15,13 @@ export class UserQuestionHistory { return result; } - public questionId: string; + public questionId: string = ""; @Type(() => QuizText) - public questionTitle: QuizText; + public questionTitle?: QuizText = undefined; - public sectionId: string; - public subSectionTitle: string; + public sectionId: string = ""; + public subSectionTitle: string = ""; public answeredCorrectlyOnce = false; public countAnsweredWrong = 0; diff --git a/src/app/data-structure/user-stats.ts b/src/app/data-structure/user-stats.ts index a7c4fb1..002f2a4 100644 --- a/src/app/data-structure/user-stats.ts +++ b/src/app/data-structure/user-stats.ts @@ -17,7 +17,7 @@ export class UserStats { result.questionHistoriesMap.set(questionId, questionHistory); // After this point, we will only use questionHistoriesMap. - result.questionHistories = undefined; + result.questionHistories = []; } } @@ -41,10 +41,10 @@ export class UserStats { return Number((part / total) * 100).toFixed(2) + "%"; } - public quizId: string; - public quizTitle: string; - public sectionId: string; - public sectionTitle: string; + public quizId: string = ""; + public quizTitle: string = ""; + public sectionId: string = ""; + public sectionTitle: string = ""; public answered = 0; public correct = 0; @@ -52,18 +52,18 @@ export class UserStats { public countQuestionsAnsweredOnce = 0; public countQuestionsCorrectOnce = 0; - public problemQuestionHistoriesCount: number; + public problemQuestionHistoriesCount: number = 0; @Type(() => UserQuestionHistory) - public topProblemQuestionHistories: UserQuestionHistory[]; + public topProblemQuestionHistories: UserQuestionHistory[] = []; // Only used for parsing from JSON. @Type(() => UserQuestionHistory) - public questionHistories: UserQuestionHistory[]; + public questionHistories: UserQuestionHistory[] = []; // Built from questionHistories. @Exclude() - public questionHistoriesMap: Map; + public questionHistoriesMap: Map = new Map(); public percentAnsweredOnce(total: number): string { return UserStats.percentageString(total, this.countQuestionsAnsweredOnce); @@ -83,7 +83,7 @@ export class UserStats { this.questionHistoriesMap = new Map(); } - let history: UserQuestionHistory = this.questionHistoriesMap.get(questionId); + let history: UserQuestionHistory | undefined = this.questionHistoriesMap.get(questionId); // Add a new one, if necessary: if (!history) { @@ -114,7 +114,7 @@ export class UserStats { private updateTopProblemQuestions(): void { this.problemQuestionHistoriesCount = 0; - this.topProblemQuestionHistories = undefined; + this.topProblemQuestionHistories = []; if (!this.questionHistoriesMap) { return; @@ -123,18 +123,10 @@ export class UserStats { // Copy the values of the array. this.questionHistoriesMap.forEach((value: UserQuestionHistory, key: string) => { if (value.countAnsweredWrong > 0) { - if (!this.topProblemQuestionHistories) { - this.topProblemQuestionHistories = []; - } - this.topProblemQuestionHistories.push(value); } }); - if (!this.topProblemQuestionHistories) { - return; - } - // Sort the array. this.topProblemQuestionHistories.sort((a, b) => { if (!a) { @@ -169,25 +161,17 @@ export class UserStats { private clearNonProblemQuestions() { // TODO: Use a Set when/if TypeScript has one. - let idsToRemove: Map; + const idsToRemove: Map = new Map(); for (const history of this.topProblemQuestionHistories) { if (!history) { continue; } if (history.countAnsweredWrong <= 0) { - if (!idsToRemove) { - idsToRemove = new Map(); - } - idsToRemove.set(history.questionId, true); } } - if (!idsToRemove) { - return; - } - const list: UserQuestionHistory[] = []; for (const history of this.topProblemQuestionHistories) { if (!history) { diff --git a/src/app/history.component.ts b/src/app/history.component.ts index dd1c317..9931358 100644 --- a/src/app/history.component.ts +++ b/src/app/history.component.ts @@ -13,10 +13,10 @@ import { UserHistorySectionsComponent } from "./user-history-sections.component" }) export class HistoryComponent extends BaseComponent { - public quizId: string; - public quizTitle: string; + public quizId: string = ""; + public quizTitle: string = ""; @ViewChild(UserHistorySectionsComponent, { static: true }) - private sectionsComponent: UserHistorySectionsComponent; + private sectionsComponent?: UserHistorySectionsComponent; constructor(private userHistoryService: UserHistoryService, titleService: Title) { @@ -24,9 +24,13 @@ export class HistoryComponent extends BaseComponent { } public onViewChildJsonParsed() { - const sections: UserHistorySections = this.sectionsComponent.userHistorySections; - this.quizId = sections.quizId; - this.quizTitle = sections.quizTitle; + if (this.sectionsComponent) { + const sections: UserHistorySections | undefined = this.sectionsComponent.userHistorySections; + if (sections) { + this.quizId = sections.quizId; + this.quizTitle = sections.quizTitle; + } + } this.setTitle("History: " + this.quizTitle); } diff --git a/src/app/login.component.ts b/src/app/login.component.ts index f1b533e..669b222 100644 --- a/src/app/login.component.ts +++ b/src/app/login.component.ts @@ -1,6 +1,6 @@ import { Component, Input, NgZone, OnInit } from "@angular/core"; import { Title } from "@angular/platform-browser"; -import { ActivatedRoute, ParamMap } from "@angular/router"; +import {ActivatedRoute, ParamMap, Params} from "@angular/router"; import { BaseComponent } from "./base.component"; import { Config } from "./config"; @@ -20,10 +20,10 @@ export class LoginComponent extends BaseComponent implements OnInit { private static redirectSuffix = `?redirect=${Config.baseUrl}/user`; // We don't want to show the logout button in the header, // but we do want to show it on the user/profile page. - @Input() public showLogOutWhenAppropriate: boolean; + @Input() public showLogOutWhenAppropriate: boolean = false; - public loginInfo: LoginInfo; - public loginFailed: boolean; + public loginInfo?: LoginInfo; + public loginFailed: boolean = false; public googleLoginUrl = `${Config.googleLoginPrefix}${LoginComponent.redirectSuffix}`; public gitHubLoginUrl = `${Config.gitHubLoginPrefix}${LoginComponent.redirectSuffix}`; public facebookLoginUrl = `${Config.facebookLoginPrefix}${LoginComponent.redirectSuffix}`; diff --git a/src/app/question-result-event.ts b/src/app/question-result-event.ts index a99079c..ee930ba 100644 --- a/src/app/question-result-event.ts +++ b/src/app/question-result-event.ts @@ -1,6 +1,6 @@ import { QuizQuestion } from "./data-structure/quiz-question"; export class QuestionResultEvent { - public question: QuizQuestion; - public result: boolean; + public question?: QuizQuestion; + public result: boolean = false; } diff --git a/src/app/question.component.ts b/src/app/question.component.ts index ef34944..d10575e 100644 --- a/src/app/question.component.ts +++ b/src/app/question.component.ts @@ -2,6 +2,7 @@ import { Component } from "@angular/core"; import { OnInit } from "@angular/core"; import { Title } from "@angular/platform-browser"; import { ActivatedRoute, ParamMap, Router } from "@angular/router"; +import { of } from "rxjs"; import { switchMap } from "rxjs/operators"; import { BaseComponent } from "./base.component"; @@ -24,7 +25,7 @@ import { QuestionResultsService } from "./question-results.service"; }) export class QuestionComponent extends BaseComponent implements OnInit { - private static titleForHasIdAndTitle(obj: HasIdAndTitle): string { + private static titleForHasIdAndTitle(obj?: HasIdAndTitle): string { if (!obj) { return ""; } @@ -35,7 +36,7 @@ export class QuestionComponent extends BaseComponent implements OnInit { /** Gets the title, if it is not HTML. * Otherwise, this returns an empty string. */ - private static titleWithoutHtmlForText(text: QuizText): string { + private static titleWithoutHtmlForText(text?: QuizText): string { if (!text) { return ""; } @@ -51,7 +52,7 @@ export class QuestionComponent extends BaseComponent implements OnInit { * avoiding use of unparsed HTML * and avoiding duplication where the quiz, * section, and subsection titles are duplicates of each other. */ - private static questionTitle(question: QuizQuestion): string { + private static questionTitle(question?: QuizQuestion): string { if (!question) { return ""; } @@ -76,20 +77,20 @@ export class QuestionComponent extends BaseComponent implements OnInit { return text; } - public quizId: string; + public quizId: string = ""; - public question: QuizQuestion; - public submissionResult: SubmissionResult; - public showAnswer: boolean; - public chosenAnswer: string; + public question?: QuizQuestion = undefined; + public submissionResult?: SubmissionResult = undefined; + public showAnswer: boolean = false; + public chosenAnswer: string = ""; public enableChoices = true; - public sections: QuizSection[]; + public sections: QuizSection[] = []; // The section to show questions from. // Not just the section ID of the question. - public sectionId: string; - private questionId: string; + public sectionId: string = ""; + private questionId: string = ""; constructor(private quizService: QuizService, private questionService: QuestionService, @@ -103,10 +104,10 @@ export class QuestionComponent extends BaseComponent implements OnInit { public ngOnInit(): void { this.route.queryParamMap.pipe( - switchMap((params: ParamMap) => { - this.quizId = params.get("quiz-id"); - this.questionId = params.get("question-id"); - this.sectionId = params.get("section-id"); + switchMap((params: ParamMap, index: number) => { + this.quizId = params.get("quiz-id") || ""; + this.questionId = params.get("question-id") || ""; + this.sectionId = params.get("section-id") || ""; if (this.submissionResult && this.submissionResult.nextQuestion && this.submissionResult.nextQuestion.id === this.questionId) { @@ -132,17 +133,17 @@ export class QuestionComponent extends BaseComponent implements OnInit { return this.questionService.getNextQuestion(this.quizId, this.sectionId); // TODO: Update the URL. } else { - // TODO: Show an error message? - return undefined; + return of({ + error: "No question ID or quiz ID"}); } } })) .subscribe( - (question) => { + (question: any) => { this.setServerSuccess(); if (this.questionId) { - this.question = question; + this.question = question as QuizQuestion; this.setTitle("Question: " + QuestionComponent.questionTitle(this.question)); } else { @@ -156,8 +157,9 @@ export class QuestionComponent extends BaseComponent implements OnInit { }, }); } + }, - (err) => { + (err: any) => { this.setServerFailed(); this.question = undefined; }); @@ -292,7 +294,7 @@ export class QuestionComponent extends BaseComponent implements OnInit { } // Wipe these: - this.chosenAnswer = undefined; + this.chosenAnswer = ""; this.showAnswer = false; this.enableChoices = true; diff --git a/src/app/quiz.component.ts b/src/app/quiz.component.ts index a963b78..31a1574 100644 --- a/src/app/quiz.component.ts +++ b/src/app/quiz.component.ts @@ -15,7 +15,7 @@ import { QuizService } from "./rest-api-clients/quiz.service"; templateUrl: "./quiz.component.html", }) export class QuizComponent extends BaseComponent implements OnInit { - public quiz: Quiz; + public quiz?: Quiz = undefined; constructor(private quizService: QuizService, private route: ActivatedRoute, @@ -26,7 +26,7 @@ export class QuizComponent extends BaseComponent implements OnInit { public ngOnInit(): void { this.setServerLoading(); this.route.queryParamMap.pipe( - switchMap((params: ParamMap) => this.quizService.getQuiz(params.get("quiz-id")))) + switchMap((params: ParamMap) => this.quizService.getQuiz(params.get("quiz-id") || ""))) .subscribe( (quiz) => { this.setServerSuccess(); diff --git a/src/app/quizzes.component.ts b/src/app/quizzes.component.ts index 1a6328c..62c24ad 100644 --- a/src/app/quizzes.component.ts +++ b/src/app/quizzes.component.ts @@ -12,7 +12,7 @@ import { Quiz } from "./data-structure/quiz"; templateUrl: "./quizzes.component.html", }) export class QuizzesComponent extends BaseComponent implements OnInit { - public quizzes: Quiz[]; + public quizzes: Quiz[] = []; constructor(private quizService: QuizService, titleService: Title) { super(titleService); diff --git a/src/app/server-status.component.ts b/src/app/server-status.component.ts index efef21b..f92f314 100644 --- a/src/app/server-status.component.ts +++ b/src/app/server-status.component.ts @@ -16,5 +16,5 @@ export class ServerStatusComponent { public ServerStateEnum = ServerState; // Note: For some reason we need to define an explicit set, - @Input() public state: ServerState; + @Input() public state?: ServerState; } diff --git a/src/app/user-history-sections.component.ts b/src/app/user-history-sections.component.ts index e975ed4..0e6651f 100644 --- a/src/app/user-history-sections.component.ts +++ b/src/app/user-history-sections.component.ts @@ -21,13 +21,13 @@ import { QuestionResultsService } from "./question-results.service"; }) export class UserHistorySectionsComponent extends BaseComponent implements OnInit, OnDestroy { @Output() public onJsonParsed = new EventEmitter(); - public userHistorySections: UserHistorySections; + public userHistorySections?: UserHistorySections; public readonly MAX_PROBLEM_QUESTIONS: number = 5; - public quizId: string; - private sectionId: string; - private subscriptionQuestionResultsService: Subscription; + public quizId: string = ""; + private sectionId: string = ""; + private subscriptionQuestionResultsService?: Subscription = undefined; constructor(private userHistoryService: UserHistoryService, private questionResultsService: QuestionResultsService, @@ -39,7 +39,7 @@ export class UserHistorySectionsComponent extends BaseComponent implements OnIni public ngOnInit(): void { this.route.queryParamMap.pipe( switchMap((params: ParamMap) => { - const paramQuizId = params.get("quiz-id"); + const paramQuizId = params.get("quiz-id") || ""; if (this.quizId === paramQuizId && this.userHistorySections) { // Use the existing data: @@ -48,7 +48,7 @@ export class UserHistorySectionsComponent extends BaseComponent implements OnIni } this.quizId = paramQuizId; - this.sectionId = params.get("section-id"); + this.sectionId = params.get("section-id") || ""; this.setServerLoading(); return this.userHistoryService.getUserHistorySectionsForQuiz(this.quizId); @@ -71,7 +71,9 @@ export class UserHistorySectionsComponent extends BaseComponent implements OnIni } public ngOnDestroy(): void { - this.subscriptionQuestionResultsService.unsubscribe(); + if (this.subscriptionQuestionResultsService) { + this.subscriptionQuestionResultsService.unsubscribe(); + } } // This is not static because it is difficult to call static method from the .html template. @@ -118,7 +120,7 @@ export class UserHistorySectionsComponent extends BaseComponent implements OnIni } public generateQuestionLinkQueryParams(qh: UserQuestionHistory): object { - const result = {"quiz-id": this.quizId, "question-id": qh.questionId}; + const result = {"quiz-id": this.quizId, "question-id": qh.questionId, "section-id": ""}; if (this.sectionId && this.sectionId === qh.sectionId) { result["section-id"] = this.sectionId; } @@ -131,11 +133,15 @@ export class UserHistorySectionsComponent extends BaseComponent implements OnIni return; } + if (!data.question) { + return; + } + if (!data.question.sectionId) { return; } - const stats: UserStats = this.userHistorySections.getUserStatsForSection(data.question.sectionId); + const stats: UserStats | undefined = this.userHistorySections.getUserStatsForSection(data.question.sectionId); if (!stats) { return; } diff --git a/src/app/user-status.component.ts b/src/app/user-status.component.ts index b3497e6..2c63a67 100644 --- a/src/app/user-status.component.ts +++ b/src/app/user-status.component.ts @@ -14,9 +14,9 @@ export class UserStatusComponent implements OnInit { private static redirectSuffix = `?redirect=${Config.baseUrl}/user`; // We don't want to show the logout button in the header, // but we do want to show it on the user/profile page. - @Input() public showExtras: boolean; + @Input() public showExtras: boolean = false; - public loginInfo: LoginInfo; + public loginInfo?: LoginInfo = undefined; public logoutUrl = `${Config.baseApiUrl}/login/logout?redirect=${Config.baseUrl}/user`; public googleLoginUrl = `${Config.googleLoginPrefix}${UserStatusComponent.redirectSuffix}`; public gitHubLoginUrl = `${Config.gitHubLoginPrefix}${UserStatusComponent.redirectSuffix}`; diff --git a/src/app/user.component.ts b/src/app/user.component.ts index 3c942fb..d2c685e 100644 --- a/src/app/user.component.ts +++ b/src/app/user.component.ts @@ -11,7 +11,7 @@ import { UserHistoryService } from "./rest-api-clients/user-history.service"; templateUrl: "./user.component.html", }) export class UserComponent extends BaseComponent implements OnInit { - public userHistoryQuizzes: UserHistoryQuizzes; + public userHistoryQuizzes?: UserHistoryQuizzes; constructor(private userHistoryService: UserHistoryService, titleService: Title) { diff --git a/tsconfig.json b/tsconfig.json index b3ce562..fb9dc81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,7 @@ "dom" ], "module": "esnext", - "baseUrl": "./" + "baseUrl": "./", + "strict": true } -} \ No newline at end of file +}