diff --git a/package-lock.json b/package-lock.json index 8ec732eb..27cca9be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -367,9 +367,9 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yargs": { @@ -2889,18 +2889,26 @@ "dev": true }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } } }, "emojis-list": { @@ -10931,9 +10939,9 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { @@ -10972,22 +10980,23 @@ "optional": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true, "optional": true } } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "dev": true, "optional": true, "requires": { - "camelcase": "^3.0.0" + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dfd96dda..d9399a36 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -63,6 +63,7 @@ import { RequestComponent } from './components/book/request/request.component'; import { TrackingComponent } from './components/book/tracking/tracking.component'; import { FacilitatorNotesComponent } from './components/book/facilitator-notes/facilitator-notes.component'; import { MainUsersComponent } from './components/book/main-users/main-users.component'; +import { WinnerUsersComponent } from './components/book/winner-users/winner-users.component'; import { ConfirmationDialogComponent } from './core/directives/confirmation-dialog/confirmation-dialog.component'; import { ConfirmationDialogService } from './core/services/confirmation-dialog/confirmation-dialog.service'; @@ -70,6 +71,8 @@ import { RouteReuseStrategy } from '@angular/router'; import { CustomReuseStrategy } from './core/router/custom-reuse-strategy'; import { InputSearchModule } from './components/input-search/input-search.module'; import { DonatePageComponent } from './components/book/donate-page/donate-page.component'; +import { TermsOfUseComponent } from './components/terms-of-use/terms-of-use.component'; +import { DonorModalComponent } from './components/book/donor-modal/donor-modal.component'; @NgModule({ declarations: [ @@ -100,8 +103,11 @@ import { DonatePageComponent } from './components/book/donate-page/donate-page.c TrackingComponent, FacilitatorNotesComponent, MainUsersComponent, + WinnerUsersComponent, PrivacyPolicyComponent, CookieConsentComponent, + TermsOfUseComponent, + DonorModalComponent, ], imports: [ BrowserModule, @@ -152,9 +158,11 @@ import { DonatePageComponent } from './components/book/donate-page/donate-page.c TrackingComponent, FacilitatorNotesComponent, MainUsersComponent, + WinnerUsersComponent, + DonorModalComponent ], bootstrap: [AppComponent], }) export class AppModule { - constructor(protected _googleAnalyticsService: GoogleAnalyticsService) {} // <-- We inject the service here to keep it alive whole time + constructor(protected _googleAnalyticsService: GoogleAnalyticsService) { } // <-- We inject the service here to keep it alive whole time } diff --git a/src/app/components/book/donations/donations.component.ts b/src/app/components/book/donations/donations.component.ts index 55a00c48..f3e943a2 100644 --- a/src/app/components/book/donations/donations.component.ts +++ b/src/app/components/book/donations/donations.component.ts @@ -9,10 +9,10 @@ import { BookService } from '../../../core/services/book/book.service'; import { BookDonationStatus } from '../../../core/models/BookDonationStatus'; import { TrackingComponent } from '../tracking/tracking.component'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { DonateComponent } from '../donate/donate.component'; import { ConfirmationDialogService } from 'src/app/core/services/confirmation-dialog/confirmation-dialog.service'; import { ToastrService } from 'ngx-toastr'; import { getStatusDescription } from 'src/app/core/utils/getStatusDescription'; +import { WinnerUsersComponent } from '../winner-users/winner-users.component'; @Component({ selector: 'app-donations', @@ -23,6 +23,7 @@ export class DonationsComponent implements OnInit, OnDestroy { donatedBooks = new Array(); tableSettings: any; isLoading: boolean; + statusBtnWinner: boolean; private _destroySubscribes$ = new Subject(); @@ -61,6 +62,10 @@ export class DonationsComponent implements OnInit, OnDestroy { '' + ' '; + const btnShowWinnerInfo = + '' + + ' '; + this.tableSettings = { columns: { title: { @@ -129,6 +134,10 @@ export class DonationsComponent implements OnInit, OnDestroy { name: 'CancelDonation', title: btnCancelDonation, }, + { + name: 'ShowWinnerInfo', + title: btnShowWinnerInfo, + }, ], position: 'right', // left|right }, @@ -283,6 +292,26 @@ export class DonationsComponent implements OnInit, OnDestroy { break; } + case 'ShowWinnerInfo': { + + if (event.data.status !== BookDonationStatus.WAITING_SEND && + event.data.status !== BookDonationStatus.SENT && + event.data.status !== BookDonationStatus.RECEIVED) { + alert( + `Você ainda não escolheu o ganhador.` + ); + return; + } + const modalRef = this._modalService.open(WinnerUsersComponent, { + backdropClass: 'light-blue-backdrop', + centered: true, + }); + + modalRef.componentInstance.bookId = event.data.id; + modalRef.componentInstance.bookTitle = event.data.title; + break; + } + } } diff --git a/src/app/components/book/donor-modal/donor-modal.component.css b/src/app/components/book/donor-modal/donor-modal.component.css new file mode 100644 index 00000000..ad050c4a --- /dev/null +++ b/src/app/components/book/donor-modal/donor-modal.component.css @@ -0,0 +1,3 @@ +section { + text-align: center; +} diff --git a/src/app/components/book/donor-modal/donor-modal.component.html b/src/app/components/book/donor-modal/donor-modal.component.html new file mode 100644 index 00000000..063f518b --- /dev/null +++ b/src/app/components/book/donor-modal/donor-modal.component.html @@ -0,0 +1,34 @@ + + + + + diff --git a/src/app/components/book/donor-modal/donor-modal.component.spec.ts b/src/app/components/book/donor-modal/donor-modal.component.spec.ts new file mode 100644 index 00000000..60443cba --- /dev/null +++ b/src/app/components/book/donor-modal/donor-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DonorModalComponent } from './donor-modal.component'; + +describe('DonorModalComponent', () => { + let component: DonorModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DonorModalComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DonorModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/book/donor-modal/donor-modal.component.ts b/src/app/components/book/donor-modal/donor-modal.component.ts new file mode 100644 index 00000000..f2f1edb9 --- /dev/null +++ b/src/app/components/book/donor-modal/donor-modal.component.ts @@ -0,0 +1,44 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +import { BookService } from 'src/app/core/services/book/book.service'; +import { UserInfoBook } from 'src/app/core/models/UserInfoBook'; + +@Component({ + selector: 'app-donor-modal', + templateUrl: './donor-modal.component.html', + styleUrls: ['./donor-modal.component.css'] +}) +export class DonorModalComponent implements OnInit { + @Input() bookId; + @Input() bookTitle; + @Input() messageBody; + loading: boolean; + + userInfo$: Observable; + + constructor(public activeModal: NgbActiveModal, + private readonly _bookService: BookService) { } + + ngOnInit() { + this.loading = true; + if (this.messageBody === '') { + this.getDonor(); + } else { + this.loading = false; + } + } + + private getDonor() { + + this.userInfo$ = this._bookService.getMainUsers(this.bookId).pipe( + map(userInfo => { + this.loading = false; + return userInfo; + }) + ); + } +} diff --git a/src/app/components/book/main-users/main-users.component.ts b/src/app/components/book/main-users/main-users.component.ts index a51f4a1d..752f6258 100644 --- a/src/app/components/book/main-users/main-users.component.ts +++ b/src/app/components/book/main-users/main-users.component.ts @@ -20,26 +20,27 @@ export class MainUsersComponent implements OnInit, OnDestroy { private _destroySubscribes$ = new Subject(); - constructor(public activeModal: NgbActiveModal, private _scBook: BookService) {} + constructor(public activeModal: NgbActiveModal, private _scBook: BookService) { } ngOnInit() { this.isLoading = true; this._scBook.getMainUsers(this.bookId) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe( - resp => { - this.isLoading = false; - - this.mainUsers[0] = !!resp.donor ? resp.donor : ''; - this.mainUsers[1] = !!resp.facilitator ? resp.facilitator : ''; - this.mainUsers[2] = !!resp.winner ? resp.winner : ''; - }, - error => { - this.isLoading = false; - } - ); + .pipe( + takeUntil(this._destroySubscribes$) + ) + .subscribe( + resp => { + this.isLoading = false; + const emptyUserInfo = new UserInfo(); + this.mainUsers[0] = !!resp.donor ? resp.donor : emptyUserInfo; + this.mainUsers[1] = !!resp.facilitator ? resp.facilitator : emptyUserInfo; + this.mainUsers[2] = !!resp.winner ? resp.winner : emptyUserInfo; + + }, + error => { + this.isLoading = false; + } + ); } ngOnDestroy() { diff --git a/src/app/components/book/requesteds/requesteds.component.html b/src/app/components/book/requesteds/requesteds.component.html index b23c4651..fc859569 100644 --- a/src/app/components/book/requesteds/requesteds.component.html +++ b/src/app/components/book/requesteds/requesteds.component.html @@ -1,13 +1,16 @@

Meus Pedidos

-
+ + -
-
- + +
+ +

Voltar

+
diff --git a/src/app/components/book/requesteds/requesteds.component.ts b/src/app/components/book/requesteds/requesteds.component.ts index fd323af1..4f27604d 100644 --- a/src/app/components/book/requesteds/requesteds.component.ts +++ b/src/app/components/book/requesteds/requesteds.component.ts @@ -1,9 +1,13 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; +import { Subject, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { BookService } from '../../../core/services/book/book.service'; import { BookRequestStatus, getStatusDescription } from '../../../core/models/BookRequestStatus'; +import { MyRequest } from 'src/app/core/models/MyRequest'; +import { DonorModalComponent } from '../donor-modal/donor-modal.component'; @Component({ selector: 'app-requesteds', @@ -11,25 +15,39 @@ import { BookRequestStatus, getStatusDescription } from '../../../core/models/Bo styleUrls: ['./requesteds.component.css'], }) export class RequestedsComponent implements OnInit, OnDestroy { - requestedBooks = new Array(); + requestedBooks$: Observable; tableSettings: any; - isLoading: boolean; + private _messageToModalBody: string; private _destroySubscribes$ = new Subject(); - constructor(private _bookService: BookService) {} + constructor(private _bookService: BookService, private _modalService: NgbModal) { } ngOnInit() { - this.isLoading = true; + this.buscarDados(); + this.inicializarTabela(); + } + + private buscarDados() { + this.requestedBooks$ = this._bookService.getRequestedBooks(1, 9999) + .pipe( + map(requestedBooks => { + requestedBooks.items.map(item => { + const badgeColor = this.getBadgeColor(item.status); + item.statusCode = item.status; + item.status = this.addBadgeToStatusColumn(badgeColor, item.status); + + }); - this._bookService - .getRequestedBooks(1, 9999) - .pipe(takeUntil(this._destroySubscribes$)) - .subscribe((resp) => { - this.requestedBooks = resp.items; - this.addBadgeToStatusColumn(); - this.isLoading = false; - }); + return requestedBooks; + }) + ); + } + + private inicializarTabela() { + const btnShowUserBookInfo = + '' + + ' '; this.tableSettings = { columns: { @@ -44,14 +62,22 @@ export class RequestedsComponent implements OnInit, OnDestroy { status: { title: 'Status', width: '25%', - type: 'html', - }, + type: 'html' + } }, actions: { delete: false, edit: false, add: false, update: false, + columnTitle: 'Doador', + custom: [ + { + name: 'showUserBookInfo', + title: btnShowUserBookInfo, + } + ], + position: 'right' }, attr: { class: 'table table-bordered table-hover table-striped', @@ -60,24 +86,45 @@ export class RequestedsComponent implements OnInit, OnDestroy { }; } - public addBadgeToStatusColumn() { - this.requestedBooks.forEach((book) => { - let badgeColor = ''; - - switch (book.status) { - case BookRequestStatus.DONATED: - badgeColor = 'success'; - break; - case BookRequestStatus.REFUSED: - badgeColor = 'danger'; - break; - default: - badgeColor = 'light'; - break; - } - - book.status = `${getStatusDescription(book.status)}`; + private getBadgeColor(status: string): string { + let badgeColor = ''; + switch (status) { + case BookRequestStatus.DONATED: + badgeColor = 'success'; + break; + case BookRequestStatus.REFUSED: + badgeColor = 'danger'; + break; + default: + badgeColor = 'light'; + break; + } + return badgeColor; + } + + private addBadgeToStatusColumn(badgeColor: string, itemStatus): string { + return `${getStatusDescription(itemStatus)}`; + } + + onCustomActionColum(event) { + this._messageToModalBody = ''; + + if (event.data.statusCode === BookRequestStatus.AWAITING_ACTION) { + this._messageToModalBody = 'Por favor aguarde a decisão do doador.'; + } + + if (event.data.statusCode === BookRequestStatus.REFUSED) { + this._messageToModalBody = 'Você não é o ganhador desse livro. =/'; + } + + const modalRef = this._modalService.open(DonorModalComponent, { + backdropClass: 'light-blue-backdrop', + centered: true, }); + + modalRef.componentInstance.bookId = event.data.bookId; + modalRef.componentInstance.bookTitle = event.data.title; + modalRef.componentInstance.messageBody = this._messageToModalBody; } ngOnDestroy() { diff --git a/src/app/components/book/winner-users/winner-users.component.css b/src/app/components/book/winner-users/winner-users.component.css new file mode 100644 index 00000000..1b7028d8 --- /dev/null +++ b/src/app/components/book/winner-users/winner-users.component.css @@ -0,0 +1,29 @@ +.carousel-indicators { + position: absolute; + bottom: 0; + margin: 0; + left: 0; + right: 0; + width: auto; +} + +.carousel-indicators li, +.carousel-indicators li.active { + float: left; + margin: 0; + border-radius: 0; + border: 0; + background: #ccc; +} + +.carousel-indicators li.active { + background: black; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") !important; +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23000' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") !important; +} diff --git a/src/app/components/book/winner-users/winner-users.component.html b/src/app/components/book/winner-users/winner-users.component.html new file mode 100644 index 00000000..0e671e6c --- /dev/null +++ b/src/app/components/book/winner-users/winner-users.component.html @@ -0,0 +1,57 @@ + + + diff --git a/src/app/components/book/winner-users/winner-users.component.spec.ts b/src/app/components/book/winner-users/winner-users.component.spec.ts new file mode 100644 index 00000000..e8841cae --- /dev/null +++ b/src/app/components/book/winner-users/winner-users.component.spec.ts @@ -0,0 +1,29 @@ +import { AppConfigModule } from '../../../app-config.module'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WinnerUsersComponent } from './winner-users.component'; + +describe('WinnerUsersComponent', () => { + let component: WinnerUsersComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [WinnerUsersComponent], + imports: [HttpClientTestingModule, AppConfigModule], + providers: [NgbActiveModal], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WinnerUsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/book/winner-users/winner-users.component.ts b/src/app/components/book/winner-users/winner-users.component.ts new file mode 100644 index 00000000..1281f032 --- /dev/null +++ b/src/app/components/book/winner-users/winner-users.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit, Input, OnDestroy } from '@angular/core'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +import { BookService } from 'src/app/core/services/book/book.service'; +import { UserInfo } from 'src/app/core/models/userInfo'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'app-winner-users', + templateUrl: './winner-users.component.html', + styleUrls: ['./winner-users.component.css'] +}) +export class WinnerUsersComponent implements OnInit, OnDestroy { + @Input() bookId; + @Input() bookTitle; + + isLoading: Boolean; + winnerUsers: UserInfo[] = []; + + private _destroySubscribes$ = new Subject(); + + constructor(public activeModal: NgbActiveModal, private _scBook: BookService) { } + + ngOnInit() { + this.isLoading = true; + this._scBook.getMainUsers(this.bookId) + .pipe( + takeUntil(this._destroySubscribes$) + ) + .subscribe( + resp => { + this.isLoading = false; + this.winnerUsers[0] = !!resp.winner ? resp.winner : null; + }, + error => { + this.isLoading = false; + } + ); + } + + ngOnDestroy() { + this._destroySubscribes$.next(); + this._destroySubscribes$.complete(); + } +} diff --git a/src/app/components/footer/footer.component.html b/src/app/components/footer/footer.component.html index 37399c1d..1f5923aa 100644 --- a/src/app/components/footer/footer.component.html +++ b/src/app/components/footer/footer.component.html @@ -34,6 +34,9 @@
Páginas
  • Política de privacidade
  • +
  • + Termos de uso +
  • diff --git a/src/app/components/home/home.component.html b/src/app/components/home/home.component.html index 8ec26c8d..2ae8abba 100644 --- a/src/app/components/home/home.component.html +++ b/src/app/components/home/home.component.html @@ -52,7 +52,7 @@

    Nenhum livro encontrado ☹
    Ajude o Sharebook e doe um livro agora

    -

    Livros mais novos

    +

    Livros em destaque

    @@ -66,70 +66,90 @@

    Livros mais novos

    - + + -

    Autor em destaque

    -
    -
    -
    - -
    -
    - Meg Mendes - Autora e Organizadora -
    -
    -
    -

    - Meg Mendes (organizadora) - "Grimm, contos para sonhos - horripilantes”
    - Meg Mendes é formada em Engenharia Civil e agora estudante de Letras, - escreveu seu primeiro romance aos 15 anos, mas nunca o publicou. A - antologia “Por baixo d’água” é sua primeira seleção, onde possui dois - contos; além de sua participação em mais de vinte antologias. Faz parte - do “Clube dos Cinco” e é membro da ABERST (Associação Brasileira dos - Escritores de Romance Policial, Suspense e Terror) desde julho de 2018. - Atualmente dedica-se ao projeto “Contos Coletivos” onde, junto a um time - de autores, escrevem contos de vários gêneros, publicados semanalmente - no blog de mesmo nome (coletivodoscontos.blogspot.com). É organizadora - das antologias “Grimm – Contos para sonhos horripilantes” e “Aventuras - no País das Maravilhas” +

    Autor em destaque

    +
    +
    +
    + +
    +
    + Meg Mendes - Autora e Organizadora +
    +
    +
    +

    + Meg Mendes (organizadora) - "Grimm, contos para sonhos + horripilantes”
    + Meg Mendes é formada em Engenharia Civil e agora estudante de Letras, + escreveu seu primeiro romance aos 15 anos, mas nunca o publicou. A + antologia “Por baixo d’água” é sua primeira seleção, onde possui dois + contos; além de sua participação em mais de vinte antologias. Faz parte + do “Clube dos Cinco” e é membro da ABERST (Associação Brasileira dos + Escritores de Romance Policial, Suspense e Terror) desde julho de 2018. + Atualmente dedica-se ao projeto “Contos Coletivos” onde, junto a um time + de autores, escrevem contos de vários gêneros, publicados semanalmente + no blog de mesmo nome (coletivodoscontos.blogspot.com). É organizadora + das antologias “Grimm – Contos para sonhos horripilantes” e “Aventuras + no País das Maravilhas” -

    +

    + + Os irmãos Grimm foram acadêmicos, linguistas, poetas e escritores que + nasceram no então Condado de Hesse-Darmstadt, atual Alemanha. Os dois + dedicaram-se ao registro de várias fábulas infantis, ganhando assim + grande notoriedade, notoriedade essa que, gradativamente, tomou + proporções globais. Seus contos servem de inspiração até hoje para + crianças e adultos. Pensando nisso, nossa antologia retoma a essência + original dos contos que eram feitos para assustar as crianças. + Trabalhamos com contos que poucos conhecem, mas que fazem parte da mais + bela coletânea. Todos são bem-vindos para mergulhar no mundo de Jacob e + Wilhelm Grimm... - Os irmãos Grimm foram acadêmicos, linguistas, poetas e escritores que - nasceram no então Condado de Hesse-Darmstadt, atual Alemanha. Os dois - dedicaram-se ao registro de várias fábulas infantis, ganhando assim - grande notoriedade, notoriedade essa que, gradativamente, tomou - proporções globais. Seus contos servem de inspiração até hoje para - crianças e adultos. Pensando nisso, nossa antologia retoma a essência - original dos contos que eram feitos para assustar as crianças. - Trabalhamos com contos que poucos conhecem, mas que fazem parte da mais - bela coletânea. Todos são bem-vindos para mergulhar no mundo de Jacob e - Wilhelm Grimm... +

    + É disso que trata o livro Grimm, contos para sonhos horripilantes, agora + disponível (Grátis) no Sharebook. Confira. +

    + + Eu quero esse + livro!

    - É disso que trata o livro Grimm, contos para sonhos horripilantes, agora - disponível (Grátis) no Sharebook. Confira. -

    - - Eu quero esse - livro! - -

    -

    - - Você é escritor e deseja estar no programa de destaque do Sharebook? - -
    - Então entre em contato através do link abaixo! -

    - - Eu quero ser Autor Destaque! +

    + + Você é escritor e deseja estar no programa de destaque do Sharebook? + +
    + Então entre em contato através do link abaixo! +

    + + Eu quero ser Autor Destaque! +
    -
    -
    - - - - - -

     

    +

     

    - + -
    -
    - - Seja um apoiador do Sharebook. - -
    -
    +
    +
    + + Seja um apoiador do Sharebook. + +
    +
    \ No newline at end of file diff --git a/src/app/components/home/home.component.ts b/src/app/components/home/home.component.ts index 945ebfd8..07b03b95 100644 --- a/src/app/components/home/home.component.ts +++ b/src/app/components/home/home.component.ts @@ -14,10 +14,13 @@ export class HomeComponent implements OnInit, OnDestroy { public availableBooks: Book[] = []; public random15NewBooks: Book[] = []; public hasBook: Boolean = true; + public hasEbook: Boolean = true; + public randomEbooks: Book[] = []; + private _destroySubscribes$ = new Subject(); - constructor(private _scBook: BookService) {} + constructor(private _scBook: BookService) { } ngOnInit() { this._scBook @@ -27,6 +30,16 @@ export class HomeComponent implements OnInit, OnDestroy { this.availableBooks = books; this.hasBook = books.length > 0 ? true : false; }); + + this._scBook + .getRandomEbooks() + .pipe(takeUntil(this._destroySubscribes$)) + .subscribe((ebooks) => { + this.randomEbooks = ebooks; + console.log(ebooks); + this.hasEbook = ebooks.length > 0 ? true : false; + }); + } ngOnDestroy() { diff --git a/src/app/components/register/register.component.html b/src/app/components/register/register.component.html index ab0a9fdf..dbabb9eb 100644 --- a/src/app/components/register/register.component.html +++ b/src/app/components/register/register.component.html @@ -87,13 +87,8 @@

    Registro

    - +
    @@ -129,14 +124,8 @@

    Registro

    - +
    @@ -270,18 +259,27 @@

    Registro

    +
    +
    + + +
    +
    + +
    - + Cancelar
    +
    +
    - + + \ No newline at end of file diff --git a/src/app/components/register/register.component.ts b/src/app/components/register/register.component.ts index d61b8767..2dcdb57a 100644 --- a/src/app/components/register/register.component.ts +++ b/src/app/components/register/register.component.ts @@ -48,34 +48,35 @@ export class RegisterComponent implements OnInit, OnDestroy { city: ['', [Validators.required]], state: ['', [Validators.required]], country: ['', [Validators.required]], - allowSendingEmail: [true, null] + allowSendingEmail: [true, null], + acceptTermOfUse: [false, null], }, { validator: PasswordValidation.MatchPassword }); } - ngOnInit() {} + ngOnInit() { } registerUser() { if (this.formGroup.valid) { this._scUser.register(this.formGroup.value) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe( - data => { - if (data.success || data.authenticated) { - this._toastr.success('Registro realizado com sucesso'); - this._router.navigate(['/']); - } else { - this._toastr.error(data.messages[0]); + .pipe( + takeUntil(this._destroySubscribes$) + ) + .subscribe( + data => { + if (data.success || data.authenticated) { + this._toastr.success('Registro realizado com sucesso'); + this._router.navigate(['/']); + } else { + this._toastr.error(data.messages[0]); + } + }, + error => { + this._toastr.error(error); } - }, - error => { - this._toastr.error(error); - } - ); + ); } } @@ -83,20 +84,20 @@ export class RegisterComponent implements OnInit, OnDestroy { this.isGettingAddress = true; this._AddressService.getAddressByPostalCode(postalCode) - .pipe( - takeUntil(this._destroySubscribes$) - ) - .subscribe((address: Address) => { - this.address = address; - this.address.country = 'Brasil'; - this.formGroup.controls['street'].setValue(this.address.street.substring(0, 80)); - this.formGroup.controls['complement'].setValue(this.address.complement.substring(0, 50)); - this.formGroup.controls['neighborhood'].setValue(this.address.neighborhood.substring(0, 50)); - this.formGroup.controls['city'].setValue(this.address.city.substring(0, 50)); - this.formGroup.controls['state'].setValue(this.address.state.substring(0, 30)); - this.formGroup.controls['country'].setValue(this.address.country.substring(0, 50)); - this.isGettingAddress = false; - }); + .pipe( + takeUntil(this._destroySubscribes$) + ) + .subscribe((address: Address) => { + this.address = address; + this.address.country = 'Brasil'; + this.formGroup.controls['street'].setValue(this.address.street.substring(0, 80)); + this.formGroup.controls['complement'].setValue(this.address.complement.substring(0, 50)); + this.formGroup.controls['neighborhood'].setValue(this.address.neighborhood.substring(0, 50)); + this.formGroup.controls['city'].setValue(this.address.city.substring(0, 50)); + this.formGroup.controls['state'].setValue(this.address.state.substring(0, 30)); + this.formGroup.controls['country'].setValue(this.address.country.substring(0, 50)); + this.isGettingAddress = false; + }); } ngOnDestroy() { diff --git a/src/app/components/terms-of-use/terms-of-use.component.css b/src/app/components/terms-of-use/terms-of-use.component.css new file mode 100644 index 00000000..e69de29b diff --git a/src/app/components/terms-of-use/terms-of-use.component.html b/src/app/components/terms-of-use/terms-of-use.component.html new file mode 100644 index 00000000..772bd108 --- /dev/null +++ b/src/app/components/terms-of-use/terms-of-use.component.html @@ -0,0 +1,124 @@ +
    +

    Termos de Uso

    + +

    1. Termos

    +

    + Ao acessar ao site Sharebook, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis + ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum + desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas + leis de direitos autorais e marcas comerciais aplicáveis. +

    + +

    + 2. Uso de Licença +

    +

    + É concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site + Sharebook , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma + transferência de título e, sob esta licença, você não pode: +

    +

    1 - Modificar ou copiar os materiais;

    +

    2 - Usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial);

    +

    3 - Tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Sharebook;

    +

    4 - Remover quaisquer direitos autorais ou outras notações de propriedade dos materiais;

    +

    5 - Transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.

    +

    Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por + Sharebook a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve + apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.

    + + +

    + 3. Isenção de responsabilidade +

    + +

    1 - Os materiais no site da Sharebook são fornecidos 'como estão'. Sharebook não oferece garantias, expressas ou + implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias + implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual + ou outra violação de direitos.

    + +

    2 - Além disso, o Sharebook não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis + ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites + vinculados a este site.

    + +

    + 4. Limitações +

    + +

    + Em nenhum caso o Sharebook ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, + danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de + usar os materiais em Sharebook, mesmo que Sharebook ou um representante autorizado da Sharebook tenha sido + notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações + em garantias implícitas, ou limitações de responsabilidade por danos conseqüentes ou incidentais, essas limitações + podem não se aplicar a você. +

    + +
    Precisão dos materiais
    + +

    Os materiais exibidos no site da Sharebook podem incluir erros técnicos, tipográficos ou fotográficos. Sharebook + não garante que qualquer material em seu site seja preciso, completo ou atual. Sharebook pode fazer alterações nos + materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Sharebook não se compromete a + atualizar os materiais.

    + + +

    + 5. Links +

    +

    + O Sharebook não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site + vinculado. A inclusão de qualquer link não implica endosso por Sharebook do site. O uso de qualquer site vinculado é + por conta e risco do usuário. +

    + +
    Modificações
    + +

    O Sharebook pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, + você concorda em ficar vinculado à versão atual desses termos de serviço.

    + +
    Lei aplicável
    + +

    Estes termos e condições são regidos e interpretados de acordo com as leis do Sharebook e você se submete + irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade.

    + +

    6. Consentimento para Tratamento de Dados

    + +

    O Titular concorda com o + tratamento de seus dados pessoais para finalidade específica, em conformidade com a Lei nº 13.709 – Lei Geral de + Proteção de Dados Pessoais (LGPD). + + Ao manifestar sua aceitação para com o presente termo, o Titular consente e concorda que a Câmara Brasileira do + Livro, CNPJ nº 60.762.942/0001-81, com sede na Rua Cristiano Viana, 91 – Pinheiros, São Paulo / SP, telefone: 11 + 3069-1300, e-mail sac@isbn.org.br, doravante denominada Controladora, tome decisões referentes ao tratamento de seus + dados pessoais, dados referentes as empresas em que atuem os usuários ou dados necessários ao usufruto de serviços + ofertados pela CBL, bem como realize o tratamento de tais dados, envolvendo operações como as que se referem a + coleta, produção, recepção, classificação, utilização, acesso, reprodução, transmissão, distribuição, processamento, + arquivamento, armazenamento, eliminação, avaliação ou controle da informação, modificação, comunicação, + transferência, difusão ou extração.

    + +
    Segurança dos Dados
    +

    + A Controladora responsabiliza-se pela manutenção de medidas de segurança, técnicas e administrativas aptas a + proteger os dados pessoais de acessos não autorizados e de situações acidentais ou ilícitas de destruição, perda, + alteração, comunicação ou qualquer forma de tratamento inadequado ou ilícito. + + Em conformidade ao art. 48 da Lei nº 13.709, o Controlador comunicará ao Titular e à Autoridade Nacional de Proteção + de Dados (ANPD) a ocorrência de incidente de segurança que possa acarretar risco ou dano relevante ao Titular.

    + +
    Direitos do Titular
    + +

    O Titular tem direito a obter da Controladora, em relação aos dados por ele tratados, a qualquer momento e mediante + requisição: I - confirmação da existência de tratamento; II - acesso aos dados; III - correção de dados incompletos, + inexatos ou desatualizados; IV - anonimização, bloqueio ou eliminação de dados desnecessários, excessivos ou + tratados em desconformidade com o disposto na Lei nº 13.709; V - portabilidade dos dados a outro fornecedor de + serviço ou produto, mediante requisição expressa e observados os segredos comercial e industrial, de acordo com a + regulamentação do órgão controlador; V - portabilidade dos dados a outro fornecedor de serviço ou produto, mediante + requisição expressa, de acordo com a regulamentação da autoridade nacional, observados os segredos comercial e + industrial; VI - eliminação dos dados pessoais tratados com o consentimento do titular, exceto nas hipóteses + previstas no art. 16 da Lei nº 13.709; VII - informação das entidades públicas e privadas com as quais o controlador + realizou uso compartilhado de dados; VIII - informação sobre a possibilidade de não fornecer consentimento e sobre + as consequências da negativa; IX - revogação do consentimento, nos termos do § 5º do art. 8º da Lei nº 13.709.

    + +
    Direito de Revogação do Consentimento
    + +

    Este consentimento poderá ser revogado pelo Titular, a qualquer momento, mediante solicitação via e-mail ou + correspondência ao Controlador.

    \ No newline at end of file diff --git a/src/app/components/terms-of-use/terms-of-use.component.spec.ts b/src/app/components/terms-of-use/terms-of-use.component.spec.ts new file mode 100644 index 00000000..438fcddc --- /dev/null +++ b/src/app/components/terms-of-use/terms-of-use.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TermsOfUseComponent } from './terms-of-use.component'; + +describe('TermsOfUseComponent', () => { + let component: TermsOfUseComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [TermsOfUseComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TermsOfUseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/terms-of-use/terms-of-use.component.ts b/src/app/components/terms-of-use/terms-of-use.component.ts new file mode 100644 index 00000000..f42ea2a4 --- /dev/null +++ b/src/app/components/terms-of-use/terms-of-use.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-terms-of-use', + templateUrl: './terms-of-use.component.html', + styleUrls: ['./terms-of-use.component.css'] +}) +export class TermsOfUseComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/core/app-routing.module.ts b/src/app/core/app-routing.module.ts index 3f220fc5..5795ecaf 100644 --- a/src/app/core/app-routing.module.ts +++ b/src/app/core/app-routing.module.ts @@ -1,4 +1,5 @@ -import { NgModule } from '@angular/core'; + +import { NgModule, Component } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { AuthGuardUser } from './guards/auth.guard.user'; import { AuthGuardAdmin } from './guards/auth.guard.admin'; @@ -21,6 +22,7 @@ import { DonationsComponent } from '../components/book/donations/donations.compo import { AboutComponent } from '../components/about/about.component'; import { DonatePageComponent } from '../components/book/donate-page/donate-page.component'; import { PrivacyPolicyComponent } from '../components/privacy-policy/privacy-policy.component'; +import { TermsOfUseComponent } from '../components/terms-of-use/terms-of-use.component'; const routes: Routes = [ { @@ -117,6 +119,10 @@ const routes: Routes = [ path: 'politica-privacidade', component: PrivacyPolicyComponent }, + { + path: 'termos-de-uso', + component: TermsOfUseComponent + }, // otherwise redirect to home { path: '**', @@ -132,4 +138,4 @@ const routes: Routes = [ ], exports: [RouterModule] }) -export class AppRoutingModule {} +export class AppRoutingModule { } diff --git a/src/app/core/models/MyRequest.ts b/src/app/core/models/MyRequest.ts new file mode 100644 index 00000000..d2a77bd8 --- /dev/null +++ b/src/app/core/models/MyRequest.ts @@ -0,0 +1,35 @@ +export class MyRequest { + page: number; + itemsPerPage: number; + totalItems: number; + items?: [ + { + requestId?: string; + title?: string; + author?: string; + status?: string; + statusCode: string; + bookStatus?: string; + trackingNumber?: string; + bookId?: string; + slug?: string; + } + ]; + + constructor(myRequest?: MyRequest) { + this.page = 0; + this.itemsPerPage = 0; + this.totalItems = 0; + this.items = [{ + requestId: '', + title: '', + author: '', + status: '', + statusCode: '', + bookStatus: '', + trackingNumber: '', + bookId: '', + slug: '' + }]; + } +} diff --git a/src/app/core/models/UserInfoBook.ts b/src/app/core/models/UserInfoBook.ts new file mode 100644 index 00000000..140f8802 --- /dev/null +++ b/src/app/core/models/UserInfoBook.ts @@ -0,0 +1,7 @@ +import { UserInfo } from './userInfo'; + +export class UserInfoBook { + donor: UserInfo; + facilitator: UserInfo; + winner: UserInfo; +} diff --git a/src/app/core/services/book/book.service.ts b/src/app/core/services/book/book.service.ts index 2776bee4..d998b36c 100644 --- a/src/app/core/services/book/book.service.ts +++ b/src/app/core/services/book/book.service.ts @@ -1,3 +1,4 @@ +import { UserInfoBook } from './../../models/UserInfoBook'; import { Injectable, Inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Book } from '../../models/book'; @@ -10,6 +11,7 @@ import { TrackingNumberBookVM } from '../../models/trackingNumberBookVM'; import { FacilitatorNotes } from '../../models/facilitatorNotes'; import { Observable } from 'rxjs'; import { Requesters } from '../../models/requesters'; +import { MyRequest } from '../../models/MyRequest'; @Injectable({ providedIn: 'root', @@ -19,7 +21,7 @@ export class BookService { constructor( private _http: HttpClient, @Inject(APP_CONFIG) private config: AppConfig - ) {} + ) { } public getAll() { return this._http.get(`${this.config.apiEndpoint}/book/1/9999`); @@ -31,6 +33,12 @@ export class BookService { ); } + public getRandomEbooks() { + return this._http.get( + `${this.config.apiEndpoint}/book/random15ebooks` + ); + } + public getRandom15Books() { return this._http.get( `${this.config.apiEndpoint}/book/Random15Books` @@ -123,7 +131,7 @@ export class BookService { } public getRequestedBooks(page: number, items: number) { - return this._http.get( + return this._http.get( `${this.config.apiEndpoint}/book/MyRequests/${page}/${items}` ); } @@ -161,8 +169,8 @@ export class BookService { ); } - public getMainUsers(bookId: string) { - return this._http.get( + public getMainUsers(bookId: string): Observable { + return this._http.get( `${this.config.apiEndpoint}/book/MainUsers/${bookId}` ); }