@internetarchive/elements 1.1.3-webdev-8840.0 → 1.1.3-webdev-9107.0

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 (38) hide show
  1. package/README.md +1 -1
  2. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts +2 -0
  3. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts.map +1 -1
  4. package/dist/src/elements/ia-radio-player/ia-radio-player.js +6 -1
  5. package/dist/src/elements/ia-radio-player/ia-radio-player.js.map +1 -1
  6. package/dist/src/elements/ia-reviews/ia-review-form.d.ts +7 -2
  7. package/dist/src/elements/ia-reviews/ia-review-form.d.ts.map +1 -1
  8. package/dist/src/elements/ia-reviews/ia-review-form.js +43 -11
  9. package/dist/src/elements/ia-reviews/ia-review-form.js.map +1 -1
  10. package/dist/src/elements/ia-reviews/ia-review.d.ts +1 -2
  11. package/dist/src/elements/ia-reviews/ia-review.d.ts.map +1 -1
  12. package/dist/src/elements/ia-reviews/ia-review.js +25 -13
  13. package/dist/src/elements/ia-reviews/ia-review.js.map +1 -1
  14. package/dist/src/elements/ia-reviews/ia-reviews.d.ts +4 -9
  15. package/dist/src/elements/ia-reviews/ia-reviews.d.ts.map +1 -1
  16. package/dist/src/elements/ia-reviews/ia-reviews.js +20 -16
  17. package/dist/src/elements/ia-reviews/ia-reviews.js.map +1 -1
  18. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.d.ts +2 -17
  19. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.d.ts.map +1 -1
  20. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.js +2 -24
  21. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.js.map +1 -1
  22. package/dist/src/elements/index.d.ts +0 -2
  23. package/dist/src/elements/index.d.ts.map +1 -1
  24. package/dist/src/elements/index.js +0 -2
  25. package/dist/src/elements/index.js.map +1 -1
  26. package/package.json +3 -3
  27. package/dist/src/elements/ia-reviews/mocks/mock-review-service.d.ts +0 -12
  28. package/dist/src/elements/ia-reviews/mocks/mock-review-service.d.ts.map +0 -1
  29. package/dist/src/elements/ia-reviews/mocks/mock-review-service.js +0 -19
  30. package/dist/src/elements/ia-reviews/mocks/mock-review-service.js.map +0 -1
  31. package/dist/src/elements/ia-reviews/models.d.ts +0 -38
  32. package/dist/src/elements/ia-reviews/models.d.ts.map +0 -1
  33. package/dist/src/elements/ia-reviews/models.js +0 -2
  34. package/dist/src/elements/ia-reviews/models.js.map +0 -1
  35. package/dist/src/elements/ia-reviews/review-service.d.ts +0 -53
  36. package/dist/src/elements/ia-reviews/review-service.d.ts.map +0 -1
  37. package/dist/src/elements/ia-reviews/review-service.js +0 -97
  38. package/dist/src/elements/ia-reviews/review-service.js.map +0 -1
@@ -23,6 +23,8 @@ let IAReview = class IAReview extends LitElement {
23
23
  this.maxBodyLength = 150;
24
24
  /* Base for URLs */
25
25
  this.baseHost = 'https://archive.org';
26
+ /* CSRF token to use for delete request submission */
27
+ this.csrfToken = '';
26
28
  /* Whether the person viewing this review has the power to delete it */
27
29
  this.canDelete = false;
28
30
  /* Whether we should skip the truncation step for the subject/body */
@@ -201,22 +203,32 @@ let IAReview = class IAReview extends LitElement {
201
203
  * Deletes the review, following an extra confirmation.
202
204
  */
203
205
  async deleteReview() {
204
- if (!this.review?.reviewer || !this.identifier)
206
+ if (!this.review || !this.identifier)
205
207
  return;
206
208
  if (!confirm(msg('Are you sure you want to delete this review?')))
207
209
  return;
208
- if (!this.reviewService) {
209
- this.deleteMsg = msg('Sorry, we were unable to delete this review.');
210
- return;
211
- }
212
- const result = await this.reviewService.deleteReview({
210
+ // Screennames can contain spaces and ampersands, so the parameters are
211
+ // encoded rather than interpolated straight into the query string.
212
+ const params = new URLSearchParams({
213
213
  identifier: this.identifier,
214
- reviewer: this.review.reviewer,
215
- reviewerItemname: this.review.reviewer_itemname,
214
+ deleteReviewer: this.review.reviewer ?? '',
215
+ deleteReviewerItemname: this.review.reviewer_itemname ?? '',
216
+ csrf_token: this.csrfToken,
216
217
  });
217
- this.deleteMsg = result.success
218
- ? msg('This review has been queued for deletion.')
219
- : (result.error ?? msg('Sorry, we were unable to delete this review.'));
218
+ const deleteUrl = `${this.baseHost}/edit-reviews.php?${params}`;
219
+ try {
220
+ const response = await fetch(deleteUrl, {
221
+ method: 'POST',
222
+ });
223
+ // fetch only rejects on a network error, so a 4xx or 5xx arrives here as
224
+ // a resolved response and has to be checked before reporting success.
225
+ if (!response.ok)
226
+ throw new Error(`Delete failed: ${response.status}`);
227
+ this.deleteMsg = 'This review has been queued for deletion.';
228
+ }
229
+ catch {
230
+ this.deleteMsg = 'Sorry, we were unable to delete this review.';
231
+ }
220
232
  }
221
233
  static get styles() {
222
234
  return css `
@@ -316,8 +328,8 @@ __decorate([
316
328
  property({ type: String })
317
329
  ], IAReview.prototype, "baseHost", void 0);
318
330
  __decorate([
319
- property({ type: Object })
320
- ], IAReview.prototype, "reviewService", void 0);
331
+ property({ type: String })
332
+ ], IAReview.prototype, "csrfToken", void 0);
321
333
  __decorate([
322
334
  property({ type: Boolean })
323
335
  ], IAReview.prototype, "canDelete", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ia-review.js","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-review.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n html,\n css,\n LitElement,\n nothing,\n HTMLTemplateResult,\n CSSResultGroup,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg } from '@lit/localize';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { Review } from '@internetarchive/metadata-service';\n\nimport type { ReviewServiceInterface } from './models';\n\nimport starBasic from './assets/star-basic.svg';\nimport { truncateScreenname } from './utils/truncate-screenname';\nimport sanitizeReviewBody from './utils/sanitize-review-body';\nimport friendlyTruncate from './utils/friendly-truncate';\nimport linkUrlsInText from './utils/link-urls-in-text';\nimport collapseSpace from './utils/collapse-space';\n\nimport deleteIcon from './assets/delete-icon.svg';\n\n/**\n * Renders a single IA review\n */\n@customElement('ia-review')\nexport class IAReview extends LitElement {\n /* The review to be rendered */\n @property({ type: Object }) review?: Review;\n\n /* The identifier for the item being reviewed */\n @property({ type: String }) identifier?: string;\n\n /* Maximum renderable length for subject */\n @property({ type: Number }) maxSubjectLength = 100;\n\n /* Maximum renderable length for body */\n @property({ type: Number }) maxBodyLength = 150;\n\n /* Base for URLs */\n @property({ type: String }) baseHost = 'https://archive.org';\n\n /* Handles the review deletion request */\n @property({ type: Object }) reviewService?: ReviewServiceInterface;\n\n /* Whether the person viewing this review has the power to delete it */\n @property({ type: Boolean }) canDelete = false;\n\n /* Whether we should skip the truncation step for the subject/body */\n @property({ type: Boolean }) bypassTruncation = false;\n\n /* Whether to show truncated review title / body */\n @state()\n private showTruncatedContent: boolean = false;\n\n /* An optional message created following attempted review deletion */\n @state()\n private deleteMsg: string = '';\n\n render() {\n return !this.review\n ? html`\n <div class=\"error\">\n ${msg('This review cannot be displayed at this time.')}\n </div>\n `\n : html`\n <article class=\"review\" id=${this.generateDomId()}>\n ${this.canDelete\n ? html`\n <button\n class=\"delete-btn\"\n title=\"Delete this review\"\n @click=${this.deleteReview}\n >\n <img\n class=\"delete-icon\"\n src=${deleteIcon}\n alt=\"\"\n aria-hidden=\"true\"\n />\n </button>\n `\n : nothing}\n <div class=\"top-line\">\n <b>${msg('Reviewer:')}</b> ${this.reviewerTemplate} -\n ${this.starsTemplate}${this.createDateTemplate}\n </div>\n <div class=\"subject\">\n <b>${msg('Subject: ')}</b>${this.subjectTemplate}\n </div>\n <div class=\"body\">\n ${!this.deleteMsg\n ? this.bodyTemplate\n : html`<i>${msg(this.deleteMsg)}</i>`}\n </div>\n ${this.truncationButtonsTemplate}\n </article>\n `;\n }\n\n /* Renders the review subject, truncating if necessary */\n private get subjectTemplate(): string {\n const subject = this.review?.reviewtitle;\n\n return this.truncateContent(subject ?? '', this.maxSubjectLength);\n }\n\n /* Renders the review body, truncating if necessary */\n private get bodyTemplate(): HTMLTemplateResult | typeof nothing {\n const body = this.review?.reviewbody;\n if (!body) return nothing;\n\n const sanitizedReview = sanitizeReviewBody(body);\n const truncatedReview = this.truncateContent(\n sanitizedReview,\n this.maxBodyLength,\n );\n\n return html`${unsafeHTML(this.prepReview(truncatedReview))}`;\n }\n\n /* Renders the More/Less button if review is truncated */\n private get truncationButtonsTemplate(): HTMLTemplateResult | typeof nothing {\n if (this.bypassTruncation) return nothing;\n\n const noTruncationNeeded =\n (this.review?.reviewtitle?.length ?? 0) <= this.maxSubjectLength &&\n (this.review?.reviewbody?.length ?? 0) <= this.maxBodyLength;\n\n if (noTruncationNeeded) return nothing;\n\n return this.showTruncatedContent\n ? this.lessButtonTemplate\n : this.moreButtonTemplate;\n }\n\n /* More button for truncation */\n private get moreButtonTemplate(): HTMLTemplateResult {\n return html`\n <button\n class=\"simple-link more-btn\"\n @click=${() => (this.showTruncatedContent = true)}\n >\n ${msg('More...')}\n </button>\n `;\n }\n\n /* Less button for truncation */\n private get lessButtonTemplate(): HTMLTemplateResult {\n return html`<button\n class=\"simple-link less-btn\"\n @click=${() => (this.showTruncatedContent = false)}\n >\n ${msg('...Less')}\n </button>`;\n }\n\n /* Reviewer name, with hyperlink and truncation if needed */\n private get reviewerTemplate(): HTMLTemplateResult | typeof nothing {\n return !this.review\n ? nothing\n : this.review.reviewer_itemname\n ? html`\n <a\n href=\"${this.baseHost}/details/${this.review.reviewer_itemname}\"\n class=\"reviewer-link simple-link\"\n data-event-click-tracking=\"ItemReviews|ReviewerLink\"\n >\n ${truncateScreenname(this.review.reviewer)}\n </a>\n `\n : html`${truncateScreenname(this.review.reviewer)}`;\n }\n\n /* Number of stars that corresponds to patron's rating */\n private get starsTemplate(): HTMLTemplateResult | typeof nothing {\n if (!this.review || !this.review.stars) return nothing;\n return html`\n <div\n class=\"review-stars\"\n title=\"${msg(`${this.review.stars} out of 5 stars`)}\"\n >\n ${new Array(Number(this.review.stars)).fill(null).map(\n () =>\n html`<div class=\"review-star\">\n <img\n class=\"star-basic\"\n src=${starBasic}\n alt=\"\"\n aria-hidden=\"true\"\n />\n </div>`,\n )}\n </div>\n -\n `;\n }\n\n /* Formats the review's date for render, adding (edited) if needed */\n private get createDateTemplate(): string | typeof nothing {\n if (!this.review?.createdate || !this.review?.reviewdate) return nothing;\n\n const reviewDate = new Date(this.review.reviewdate);\n const createDate = new Date(this.review.createdate);\n\n const prettyDate = createDate.toLocaleString('en-us', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n\n const editedMsg =\n reviewDate.getTime() !== createDate.getTime() ? '(edited)' : '';\n\n return msg(`${prettyDate} ${editedMsg}`);\n }\n\n /**\n * Generates a unique ID for the review, using its createdate.\n *\n * @returns {string} The ID to render\n */\n private generateDomId(): string {\n if (!this.review?.createdate) return '';\n\n return `review-${Date.parse(this.review.createdate.toString())}`;\n }\n\n /** Truncates the review subject/body if needed */\n private truncateContent(original: string, maxLength: number): string {\n if (this.showTruncatedContent || this.bypassTruncation) return original;\n\n return friendlyTruncate(original, maxLength);\n }\n\n /**\n * Uses a set of utils in sequence to prepare a review for render,\n * including transforming inline links into anchor links\n * and collapsing internal spaces.\n *\n * @param {string} review The review to be prepped\n * @returns {string} The review prepped for render\n */\n private prepReview(review: string): string {\n return collapseSpace(linkUrlsInText(review));\n }\n\n /**\n * Deletes the review, following an extra confirmation.\n */\n private async deleteReview(): Promise<void> {\n if (!this.review?.reviewer || !this.identifier) return;\n if (!confirm(msg('Are you sure you want to delete this review?'))) return;\n\n if (!this.reviewService) {\n this.deleteMsg = msg('Sorry, we were unable to delete this review.');\n return;\n }\n\n const result = await this.reviewService.deleteReview({\n identifier: this.identifier,\n reviewer: this.review.reviewer,\n reviewerItemname: this.review.reviewer_itemname,\n });\n\n this.deleteMsg = result.success\n ? msg('This review has been queued for deletion.')\n : (result.error ?? msg('Sorry, we were unable to delete this review.'));\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n font-family: var(\n --ia-font-stack,\n 'Helvetica Neue',\n Helvetica,\n Arial,\n sans-serif\n );\n\n font-size: inherit;\n --container-bg-color: #fbfbfd;\n --container-border-color: #999999;\n }\n\n .review {\n position: relative;\n padding-right: 30px;\n }\n\n .error {\n color: var(--error-color, #cc0000);\n }\n\n .top-line {\n margin-bottom: 0.5rem;\n }\n\n .top-line > * {\n display: inline-block;\n }\n\n .review-star {\n width: 1rem;\n display: inline-block;\n }\n\n .star-basic {\n display: block;\n width: 100%;\n }\n\n .simple-link,\n .body a {\n color: var(--link-color, #4b64ff);\n text-decoration: none;\n background: transparent;\n border: none;\n padding: 0px;\n }\n\n .simple-link:hover,\n .body a:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n\n .subject {\n margin-bottom: 0.5rem;\n }\n\n .delete-btn {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0;\n background: none;\n border: 0;\n }\n\n .delete-btn:hover {\n cursor: pointer;\n }\n\n .delete-icon {\n width: 20px;\n mix-blend-mode: multiply;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"ia-review.js","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-review.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,IAAI,EACJ,GAAG,EACH,UAAU,EACV,OAAO,GAGR,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,kBAAkB,MAAM,8BAA8B,CAAC;AAC9D,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,aAAa,MAAM,wBAAwB,CAAC;AAEnD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAElD;;GAEG;AAEI,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,UAAU;IAAjC;;QAOL,2CAA2C;QACf,qBAAgB,GAAG,GAAG,CAAC;QAEnD,wCAAwC;QACZ,kBAAa,GAAG,GAAG,CAAC;QAEhD,mBAAmB;QACS,aAAQ,GAAG,qBAAqB,CAAC;QAE7D,qDAAqD;QACzB,cAAS,GAAW,EAAE,CAAC;QAEnD,uEAAuE;QAC1C,cAAS,GAAG,KAAK,CAAC;QAE/C,qEAAqE;QACxC,qBAAgB,GAAG,KAAK,CAAC;QAEtD,mDAAmD;QAE3C,yBAAoB,GAAY,KAAK,CAAC;QAE9C,qEAAqE;QAE7D,cAAS,GAAW,EAAE,CAAC;IA+SjC,CAAC;IA7SC,MAAM;QACJ,OAAO,CAAC,IAAI,CAAC,MAAM;YACjB,CAAC,CAAC,IAAI,CAAA;;cAEE,GAAG,CAAC,+CAA+C,CAAC;;SAEzD;YACH,CAAC,CAAC,IAAI,CAAA;uCAC2B,IAAI,CAAC,aAAa,EAAE;cAC7C,IAAI,CAAC,SAAS;gBACd,CAAC,CAAC,IAAI,CAAA;;;;6BAIS,IAAI,CAAC,YAAY;;;;4BAIlB,UAAU;;;;;iBAKrB;gBACH,CAAC,CAAC,OAAO;;mBAEJ,GAAG,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,gBAAgB;gBAChD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,kBAAkB;;;mBAGzC,GAAG,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,eAAe;;;gBAG9C,CAAC,IAAI,CAAC,SAAS;gBACf,CAAC,CAAC,IAAI,CAAC,YAAY;gBACnB,CAAC,CAAC,IAAI,CAAA,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;;cAEvC,IAAI,CAAC,yBAAyB;;SAEnC,CAAC;IACR,CAAC;IAED,yDAAyD;IACzD,IAAY,eAAe;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QAEzC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAED,sDAAsD;IACtD,IAAY,YAAY;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC;QAE1B,MAAM,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAC1C,eAAe,EACf,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,OAAO,IAAI,CAAA,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,yDAAyD;IACzD,IAAY,yBAAyB;QACnC,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,OAAO,CAAC;QAE1C,MAAM,kBAAkB,GACtB,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB;YAChE,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;QAE/D,IAAI,kBAAkB;YAAE,OAAO,OAAO,CAAC;QAEvC,OAAO,IAAI,CAAC,oBAAoB;YAC9B,CAAC,CAAC,IAAI,CAAC,kBAAkB;YACzB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC9B,CAAC;IAED,gCAAgC;IAChC,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;;iBAGE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;;UAE/C,GAAG,CAAC,SAAS,CAAC;;KAEnB,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,IAAY,kBAAkB;QAC5B,OAAO,IAAI,CAAA;;eAEA,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;;QAEhD,GAAG,CAAC,SAAS,CAAC;cACR,CAAC;IACb,CAAC;IAED,4DAA4D;IAC5D,IAAY,gBAAgB;QAC1B,OAAO,CAAC,IAAI,CAAC,MAAM;YACjB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB;gBAC7B,CAAC,CAAC,IAAI,CAAA;;sBAEQ,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,MAAM,CAAC,iBAAiB;;;;gBAI5D,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;WAE7C;gBACH,CAAC,CAAC,IAAI,CAAA,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,yDAAyD;IACzD,IAAY,aAAa;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QACvD,OAAO,IAAI,CAAA;;;iBAGE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,iBAAiB,CAAC;;UAEjD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CACnD,GAAG,EAAE,CACH,IAAI,CAAA;;;sBAGM,SAAS;;;;mBAIZ,CACV;;;KAGJ,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,IAAY,kBAAkB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO,OAAO,CAAC;QAEzE,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE;YACpD,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,MAAM,SAAS,GACb,UAAU,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,OAAO,GAAG,CAAC,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACK,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAO,EAAE,CAAC;QAExC,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,kDAAkD;IAC1C,eAAe,CAAC,QAAgB,EAAE,SAAiB;QACzD,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,QAAQ,CAAC;QAExE,OAAO,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACK,UAAU,CAAC,MAAc;QAC/B,OAAO,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAAE,OAAO;QAE1E,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC1C,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE;YAC3D,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,QAAQ,qBAAqB,MAAM,EAAE,CAAC;QAChE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;gBACtC,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YACH,yEAAyE;YACzE,sEAAsE;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAEvE,IAAI,CAAC,SAAS,GAAG,2CAA2C,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,8CAA8C,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8ET,CAAC;IACJ,CAAC;CACF,CAAA;AA5U6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCAAiB;AAGhB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CAAqB;AAGpB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDAAwB;AAGvB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CAAqB;AAGpB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAAkC;AAGjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAwB;AAGtB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;2CAAmB;AAGlB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDAA0B;AAI9C;IADP,KAAK,EAAE;sDACsC;AAItC;IADP,KAAK,EAAE;2CACuB;AA/BpB,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CA8UpB","sourcesContent":["import {\n html,\n css,\n LitElement,\n nothing,\n HTMLTemplateResult,\n CSSResultGroup,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg } from '@lit/localize';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nimport { Review } from '@internetarchive/metadata-service';\n\nimport starBasic from './assets/star-basic.svg';\nimport { truncateScreenname } from './utils/truncate-screenname';\nimport sanitizeReviewBody from './utils/sanitize-review-body';\nimport friendlyTruncate from './utils/friendly-truncate';\nimport linkUrlsInText from './utils/link-urls-in-text';\nimport collapseSpace from './utils/collapse-space';\n\nimport deleteIcon from './assets/delete-icon.svg';\n\n/**\n * Renders a single IA review\n */\n@customElement('ia-review')\nexport class IAReview extends LitElement {\n /* The review to be rendered */\n @property({ type: Object }) review?: Review;\n\n /* The identifier for the item being reviewed */\n @property({ type: String }) identifier?: string;\n\n /* Maximum renderable length for subject */\n @property({ type: Number }) maxSubjectLength = 100;\n\n /* Maximum renderable length for body */\n @property({ type: Number }) maxBodyLength = 150;\n\n /* Base for URLs */\n @property({ type: String }) baseHost = 'https://archive.org';\n\n /* CSRF token to use for delete request submission */\n @property({ type: String }) csrfToken: string = '';\n\n /* Whether the person viewing this review has the power to delete it */\n @property({ type: Boolean }) canDelete = false;\n\n /* Whether we should skip the truncation step for the subject/body */\n @property({ type: Boolean }) bypassTruncation = false;\n\n /* Whether to show truncated review title / body */\n @state()\n private showTruncatedContent: boolean = false;\n\n /* An optional message created following attempted review deletion */\n @state()\n private deleteMsg: string = '';\n\n render() {\n return !this.review\n ? html`\n <div class=\"error\">\n ${msg('This review cannot be displayed at this time.')}\n </div>\n `\n : html`\n <article class=\"review\" id=${this.generateDomId()}>\n ${this.canDelete\n ? html`\n <button\n class=\"delete-btn\"\n title=\"Delete this review\"\n @click=${this.deleteReview}\n >\n <img\n class=\"delete-icon\"\n src=${deleteIcon}\n alt=\"\"\n aria-hidden=\"true\"\n />\n </button>\n `\n : nothing}\n <div class=\"top-line\">\n <b>${msg('Reviewer:')}</b> ${this.reviewerTemplate} -\n ${this.starsTemplate}${this.createDateTemplate}\n </div>\n <div class=\"subject\">\n <b>${msg('Subject: ')}</b>${this.subjectTemplate}\n </div>\n <div class=\"body\">\n ${!this.deleteMsg\n ? this.bodyTemplate\n : html`<i>${msg(this.deleteMsg)}</i>`}\n </div>\n ${this.truncationButtonsTemplate}\n </article>\n `;\n }\n\n /* Renders the review subject, truncating if necessary */\n private get subjectTemplate(): string {\n const subject = this.review?.reviewtitle;\n\n return this.truncateContent(subject ?? '', this.maxSubjectLength);\n }\n\n /* Renders the review body, truncating if necessary */\n private get bodyTemplate(): HTMLTemplateResult | typeof nothing {\n const body = this.review?.reviewbody;\n if (!body) return nothing;\n\n const sanitizedReview = sanitizeReviewBody(body);\n const truncatedReview = this.truncateContent(\n sanitizedReview,\n this.maxBodyLength,\n );\n\n return html`${unsafeHTML(this.prepReview(truncatedReview))}`;\n }\n\n /* Renders the More/Less button if review is truncated */\n private get truncationButtonsTemplate(): HTMLTemplateResult | typeof nothing {\n if (this.bypassTruncation) return nothing;\n\n const noTruncationNeeded =\n (this.review?.reviewtitle?.length ?? 0) <= this.maxSubjectLength &&\n (this.review?.reviewbody?.length ?? 0) <= this.maxBodyLength;\n\n if (noTruncationNeeded) return nothing;\n\n return this.showTruncatedContent\n ? this.lessButtonTemplate\n : this.moreButtonTemplate;\n }\n\n /* More button for truncation */\n private get moreButtonTemplate(): HTMLTemplateResult {\n return html`\n <button\n class=\"simple-link more-btn\"\n @click=${() => (this.showTruncatedContent = true)}\n >\n ${msg('More...')}\n </button>\n `;\n }\n\n /* Less button for truncation */\n private get lessButtonTemplate(): HTMLTemplateResult {\n return html`<button\n class=\"simple-link less-btn\"\n @click=${() => (this.showTruncatedContent = false)}\n >\n ${msg('...Less')}\n </button>`;\n }\n\n /* Reviewer name, with hyperlink and truncation if needed */\n private get reviewerTemplate(): HTMLTemplateResult | typeof nothing {\n return !this.review\n ? nothing\n : this.review.reviewer_itemname\n ? html`\n <a\n href=\"${this.baseHost}/details/${this.review.reviewer_itemname}\"\n class=\"reviewer-link simple-link\"\n data-event-click-tracking=\"ItemReviews|ReviewerLink\"\n >\n ${truncateScreenname(this.review.reviewer)}\n </a>\n `\n : html`${truncateScreenname(this.review.reviewer)}`;\n }\n\n /* Number of stars that corresponds to patron's rating */\n private get starsTemplate(): HTMLTemplateResult | typeof nothing {\n if (!this.review || !this.review.stars) return nothing;\n return html`\n <div\n class=\"review-stars\"\n title=\"${msg(`${this.review.stars} out of 5 stars`)}\"\n >\n ${new Array(Number(this.review.stars)).fill(null).map(\n () =>\n html`<div class=\"review-star\">\n <img\n class=\"star-basic\"\n src=${starBasic}\n alt=\"\"\n aria-hidden=\"true\"\n />\n </div>`,\n )}\n </div>\n -\n `;\n }\n\n /* Formats the review's date for render, adding (edited) if needed */\n private get createDateTemplate(): string | typeof nothing {\n if (!this.review?.createdate || !this.review?.reviewdate) return nothing;\n\n const reviewDate = new Date(this.review.reviewdate);\n const createDate = new Date(this.review.createdate);\n\n const prettyDate = createDate.toLocaleString('en-us', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n\n const editedMsg =\n reviewDate.getTime() !== createDate.getTime() ? '(edited)' : '';\n\n return msg(`${prettyDate} ${editedMsg}`);\n }\n\n /**\n * Generates a unique ID for the review, using its createdate.\n *\n * @returns {string} The ID to render\n */\n private generateDomId(): string {\n if (!this.review?.createdate) return '';\n\n return `review-${Date.parse(this.review.createdate.toString())}`;\n }\n\n /** Truncates the review subject/body if needed */\n private truncateContent(original: string, maxLength: number): string {\n if (this.showTruncatedContent || this.bypassTruncation) return original;\n\n return friendlyTruncate(original, maxLength);\n }\n\n /**\n * Uses a set of utils in sequence to prepare a review for render,\n * including transforming inline links into anchor links\n * and collapsing internal spaces.\n *\n * @param {string} review The review to be prepped\n * @returns {string} The review prepped for render\n */\n private prepReview(review: string): string {\n return collapseSpace(linkUrlsInText(review));\n }\n\n /**\n * Deletes the review, following an extra confirmation.\n */\n private async deleteReview(): Promise<void> {\n if (!this.review || !this.identifier) return;\n if (!confirm(msg('Are you sure you want to delete this review?'))) return;\n\n // Screennames can contain spaces and ampersands, so the parameters are\n // encoded rather than interpolated straight into the query string.\n const params = new URLSearchParams({\n identifier: this.identifier,\n deleteReviewer: this.review.reviewer ?? '',\n deleteReviewerItemname: this.review.reviewer_itemname ?? '',\n csrf_token: this.csrfToken,\n });\n const deleteUrl = `${this.baseHost}/edit-reviews.php?${params}`;\n try {\n const response = await fetch(deleteUrl, {\n method: 'POST',\n });\n // fetch only rejects on a network error, so a 4xx or 5xx arrives here as\n // a resolved response and has to be checked before reporting success.\n if (!response.ok) throw new Error(`Delete failed: ${response.status}`);\n\n this.deleteMsg = 'This review has been queued for deletion.';\n } catch {\n this.deleteMsg = 'Sorry, we were unable to delete this review.';\n }\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n font-family: var(\n --ia-font-stack,\n 'Helvetica Neue',\n Helvetica,\n Arial,\n sans-serif\n );\n\n font-size: inherit;\n --container-bg-color: #fbfbfd;\n --container-border-color: #999999;\n }\n\n .review {\n position: relative;\n padding-right: 30px;\n }\n\n .error {\n color: var(--error-color, #cc0000);\n }\n\n .top-line {\n margin-bottom: 0.5rem;\n }\n\n .top-line > * {\n display: inline-block;\n }\n\n .review-star {\n width: 1rem;\n display: inline-block;\n }\n\n .star-basic {\n display: block;\n width: 100%;\n }\n\n .simple-link,\n .body a {\n color: var(--link-color, #4b64ff);\n text-decoration: none;\n background: transparent;\n border: none;\n padding: 0px;\n }\n\n .simple-link:hover,\n .body a:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n\n .subject {\n margin-bottom: 0.5rem;\n }\n\n .delete-btn {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0;\n background: none;\n border: 0;\n }\n\n .delete-btn:hover {\n cursor: pointer;\n }\n\n .delete-icon {\n width: 20px;\n mix-blend-mode: multiply;\n }\n `;\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { CSSResultGroup, HTMLTemplateResult, LitElement, PropertyValues } from 'lit';
2
2
  import type { Review } from '@internetarchive/metadata-service';
3
3
  import type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';
4
+ import { FetchHandlerInterface } from '@internetarchive/fetch-handler';
4
5
  import '../../elements/ia-button/ia-button.js';
5
- import type { ReviewServiceInterface } from './models.js';
6
6
  import './ia-review.js';
7
7
  import './ia-review-form.js';
8
8
  /**
@@ -20,6 +20,8 @@ export declare class IAReviews extends LitElement {
20
20
  maxBodyLength?: number;
21
21
  baseHost: string;
22
22
  /** REVIEW FORM PROPERTIES */
23
+ token: string;
24
+ endpointPath: string;
23
25
  /** Form submitter's screenname, if applicable */
24
26
  submitterScreenname: string;
25
27
  /** Form submitter's itemname, if applicable */
@@ -28,14 +30,7 @@ export declare class IAReviews extends LitElement {
28
30
  bypassRecaptcha: boolean;
29
31
  reviewSubmissionError?: string;
30
32
  reviewAddEditRequested: boolean;
31
- /**
32
- * Handles the review write and delete requests.
33
- *
34
- * Writing and deleting need one, since the service is what carries the CSRF token. Left unset,
35
- * reviews still render and the form still opens, but a submission reports a generic failure.
36
- */
37
- reviewService?: ReviewServiceInterface;
38
- private activeReviewService?;
33
+ fetchHandler: FetchHandlerInterface;
39
34
  displayReviewForm: boolean;
40
35
  private displayReviews;
41
36
  private filteredReviews;
@@ -1 +1 @@
1
- {"version":3,"file":"ia-reviews.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,kBAAkB,EAClB,UAAU,EAEV,cAAc,EACf,MAAM,KAAK,CAAC;AAKb,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,aAAa,CAAC;AACrB,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBACa,SAAU,SAAQ,UAAU;IACvC,yCAAyC;IAEb,UAAU,CAAC,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAGrB,eAAe,UAAS;IAGxB,aAAa,UAAS;IAGtB,SAAS,UAAS;IAGlB,uBAAuB,UAAS;IAGjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,QAAQ,SAAyB;IAE7D,6BAA6B;IAE7B,iDAAiD;IACrB,mBAAmB,EAAE,MAAM,CAAe;IAEtE,+CAA+C;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAG5C,eAAe,EAAE,OAAO,CAAS;IAGlC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAG9B,sBAAsB,EAAE,OAAO,CAAS;IAErE;;;;;OAKG;IACyB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IAInE,OAAO,CAAC,mBAAmB,CAAC,CAAyB;IAIrD,iBAAiB,EAAE,OAAO,CAAS;IAInC,OAAO,CAAC,cAAc,CAAkB;IAIxC,OAAO,CAAC,eAAe,CAAgB;IAIvC,OAAO,CAAC,aAAa,CAAC,CAAS;IAI/B,OAAO,CAAC,YAAY,CAAa;IAIjC,OAAO,CAAC,kBAAkB,CAAkB;IAE5C,MAAM;IAuBN,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAgCnD,OAAO,KAAK,uBAAuB,GAIlC;IAGD,OAAO,KAAK,oBAAoB,GAuB/B;IAGD,OAAO,KAAK,yBAAyB,GAiBpC;IAED;;;OAGG;IACH,OAAO,KAAK,6BAA6B,GAyBxC;IAED,oFAAoF;IACpF,OAAO,CAAC,iBAAiB;IAiBzB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAapB,oDAAoD;IACpD,OAAO,CAAC,aAAa;IAKrB,2CAA2C;IAC3C,OAAO,CAAC,kBAAkB;IAS1B,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB;IAS1B,MAAM,KAAK,MAAM,IAAI,cAAc,CAuDlC;CACF"}
1
+ {"version":3,"file":"ia-reviews.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,kBAAkB,EAClB,UAAU,EAEV,cAAc,EACf,MAAM,KAAK,CAAC;AAKb,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EACL,qBAAqB,EAEtB,MAAM,gCAAgC,CAAC;AAExC,OAAO,mCAAmC,CAAC;AAE3C,OAAO,aAAa,CAAC;AACrB,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBACa,SAAU,SAAQ,UAAU;IACvC,yCAAyC;IAEb,UAAU,CAAC,EAAE,MAAM,CAAC;IAGrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAGrB,eAAe,UAAS;IAGxB,aAAa,UAAS;IAGtB,SAAS,UAAS;IAGlB,uBAAuB,UAAS;IAGjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,QAAQ,SAAyB;IAE7D,6BAA6B;IAED,KAAK,EAAE,MAAM,CAAM;IAGnB,YAAY,EAAE,MAAM,CAAuB;IAEvE,iDAAiD;IACrB,mBAAmB,EAAE,MAAM,CAAe;IAEtE,+CAA+C;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,gBAAgB,CAAC,EAAE,yBAAyB,CAAC;IAG5C,eAAe,EAAE,OAAO,CAAS;IAGlC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAG9B,sBAAsB,EAAE,OAAO,CAAS;IAGzC,YAAY,EAAE,qBAAqB,CACxC;IAIvB,iBAAiB,EAAE,OAAO,CAAS;IAInC,OAAO,CAAC,cAAc,CAAkB;IAIxC,OAAO,CAAC,eAAe,CAAgB;IAIvC,OAAO,CAAC,aAAa,CAAC,CAAS;IAI/B,OAAO,CAAC,YAAY,CAAa;IAIjC,OAAO,CAAC,kBAAkB,CAAkB;IAE5C,MAAM;IAuBN,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAqBnD,OAAO,KAAK,uBAAuB,GAIlC;IAGD,OAAO,KAAK,oBAAoB,GAuB/B;IAGD,OAAO,KAAK,yBAAyB,GAiBpC;IAED;;;OAGG;IACH,OAAO,KAAK,6BAA6B,GA4BxC;IAED,oFAAoF;IACpF,OAAO,CAAC,iBAAiB;IAiBzB,8CAA8C;IAC9C,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAapB,oDAAoD;IACpD,OAAO,CAAC,aAAa;IAKrB,2CAA2C;IAC3C,OAAO,CAAC,kBAAkB;IAS1B,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB;IAS1B,MAAM,KAAK,MAAM,IAAI,cAAc,CAuDlC;CACF"}
@@ -3,8 +3,8 @@ import { css, html, LitElement, nothing, } from 'lit';
3
3
  import { property, state } from 'lit/decorators.js';
4
4
  import { customElement } from '../../util/custom-element.js';
5
5
  import { msg } from '@lit/localize';
6
+ import { IaFetchHandler, } from '@internetarchive/fetch-handler';
6
7
  import '../../elements/ia-button/ia-button.js';
7
- import { ReviewService } from './review-service.js';
8
8
  import './ia-review.js';
9
9
  import './ia-review-form.js';
10
10
  /**
@@ -23,15 +23,21 @@ let IAReviews = class IAReviews extends LitElement {
23
23
  this.canDelete = false;
24
24
  /* Whether we should bypass the show/hide and more/less toggles */
25
25
  this.displayReviewsByDefault = false;
26
- /* Base for URLs. Also used for the reviewer profile links. */
26
+ /* Base for URLs */
27
27
  this.baseHost = 'https://archive.org';
28
28
  /** REVIEW FORM PROPERTIES */
29
+ /* The token for the review edit */
30
+ this.token = '';
31
+ /* The path for the endpoint we're submitting to */
32
+ this.endpointPath = '/write-review.php';
29
33
  /** Form submitter's screenname, if applicable */
30
34
  this.submitterScreenname = 'Anonymous';
31
35
  /* Optionally avoid using recaptcha for the form */
32
36
  this.bypassRecaptcha = false;
33
37
  /* Whether the add/edit button has been clicked */
34
38
  this.reviewAddEditRequested = false;
39
+ /* An optional handler for form submission to pass along to the form */
40
+ this.fetchHandler = new IaFetchHandler();
35
41
  /* Whether to display the review form or the editable review */
36
42
  this.displayReviewForm = false;
37
43
  /* Whether to display the existing reviews */
@@ -65,14 +71,6 @@ let IAReviews = class IAReviews extends LitElement {
65
71
  `;
66
72
  }
67
73
  willUpdate(changed) {
68
- if (!this.activeReviewService ||
69
- changed.has('reviewService') ||
70
- changed.has('baseHost')) {
71
- // the fallback keeps rendering and the form working for a consumer that supplies no
72
- // service; it carries no CSRF token, so a submission through it fails
73
- this.activeReviewService =
74
- this.reviewService ?? new ReviewService({ baseHost: this.baseHost });
75
- }
76
74
  if (changed.has('reviews') || changed.has('submitterItemname')) {
77
75
  this.reviewsCount = this.reviews.length;
78
76
  this.sortFilterReviews();
@@ -147,12 +145,15 @@ let IAReviews = class IAReviews extends LitElement {
147
145
  : html `<ia-review-form
148
146
  .identifier=${this.identifier}
149
147
  .oldReview=${this.currentReview}
148
+ .baseHost=${this.baseHost}
149
+ .endpointPath=${this.endpointPath}
150
150
  .submitterItemname=${this.submitterItemname}
151
151
  .submitterScreenname=${this.submitterScreenname}
152
152
  .maxSubjectLength=${this.maxSubjectLength}
153
153
  .maxBodyLength=${this.maxBodyLength}
154
+ .token=${this.token}
154
155
  .unrecoverableError=${this.reviewSubmissionError}
155
- .reviewService=${this.activeReviewService}
156
+ .fetchHandler=${this.fetchHandler}
156
157
  .recaptchaManager=${this.recaptchaActivated
157
158
  ? this.recaptchaManager
158
159
  : undefined}
@@ -192,7 +193,7 @@ let IAReviews = class IAReviews extends LitElement {
192
193
  .review=${review}
193
194
  .identifier=${this.identifier}
194
195
  .baseHost=${this.baseHost}
195
- .reviewService=${this.activeReviewService}
196
+ .csrfToken=${this.token}
196
197
  ?canDelete=${this.canDelete}
197
198
  ?bypassTruncation=${this.displayReviewsByDefault}
198
199
  ></ia-review>`;
@@ -304,6 +305,12 @@ __decorate([
304
305
  __decorate([
305
306
  property({ type: String })
306
307
  ], IAReviews.prototype, "baseHost", void 0);
308
+ __decorate([
309
+ property({ type: String })
310
+ ], IAReviews.prototype, "token", void 0);
311
+ __decorate([
312
+ property({ type: String })
313
+ ], IAReviews.prototype, "endpointPath", void 0);
307
314
  __decorate([
308
315
  property({ type: String })
309
316
  ], IAReviews.prototype, "submitterScreenname", void 0);
@@ -324,10 +331,7 @@ __decorate([
324
331
  ], IAReviews.prototype, "reviewAddEditRequested", void 0);
325
332
  __decorate([
326
333
  property({ type: Object })
327
- ], IAReviews.prototype, "reviewService", void 0);
328
- __decorate([
329
- state()
330
- ], IAReviews.prototype, "activeReviewService", void 0);
334
+ ], IAReviews.prototype, "fetchHandler", void 0);
331
335
  __decorate([
332
336
  state()
333
337
  ], IAReviews.prototype, "displayReviewForm", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ia-reviews.js","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-reviews.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,GAAG,EAEH,IAAI,EAEJ,UAAU,EACV,OAAO,GAER,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAKpC,OAAO,mCAAmC,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,aAAa,CAAC;AACrB,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,UAAU;IAAlC;;QAKL,wCAAwC;QACb,YAAO,GAAa,EAAE,CAAC;QAElD,+CAA+C;QAClB,oBAAe,GAAG,KAAK,CAAC;QAErD,6CAA6C;QAChB,kBAAa,GAAG,KAAK,CAAC;QAEnD,oFAAoF;QACvD,cAAS,GAAG,KAAK,CAAC;QAE/C,kEAAkE;QACrC,4BAAuB,GAAG,KAAK,CAAC;QAQ7D,8DAA8D;QAClC,aAAQ,GAAG,qBAAqB,CAAC;QAE7D,6BAA6B;QAE7B,iDAAiD;QACrB,wBAAmB,GAAW,WAAW,CAAC;QAQtE,mDAAmD;QACtB,oBAAe,GAAY,KAAK,CAAC;QAK9D,kDAAkD;QACrB,2BAAsB,GAAY,KAAK,CAAC;QAcrE,+DAA+D;QAE/D,sBAAiB,GAAY,KAAK,CAAC;QAEnC,6CAA6C;QAErC,mBAAc,GAAY,KAAK,CAAC;QAExC,+CAA+C;QAEvC,oBAAe,GAAa,EAAE,CAAC;QAMvC,2BAA2B;QAEnB,iBAAY,GAAW,CAAC,CAAC;QAEjC,4EAA4E;QAEpE,uBAAkB,GAAY,KAAK,CAAC;IAyQ9C,CAAC;IAvQC,MAAM;QACJ,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC,uBAAuB,CAAC;QAC9D,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB;YACpD,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC,yBAAyB,CAAC;QAEhE,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,aAAa;YAClB,CAAC,CAAC,IAAI,CAAA;gBACA,GAAG,CAAC,8CAA8C,CAAC;mBAChD;YACT,CAAC,CAAC,OAAO;UACT,IAAI,CAAC,6BAA6B;UAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpC,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,iBAAiB;YACjD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAC3B,CAAC,CAAC,OAAO,CACZ;;KAEJ,CAAC;IACJ,CAAC;IAES,UAAU,CAAC,OAAuB;QAC1C,IACE,CAAC,IAAI,CAAC,mBAAmB;YACzB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EACvB,CAAC;YACD,oFAAoF;YACpF,sEAAsE;YACtE,IAAI,CAAC,mBAAmB;gBACtB,IAAI,CAAC,aAAa,IAAI,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,kBAAkB;gBACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IACE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;YACtC,IAAI,CAAC,uBAAuB,EAC5B,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAY,uBAAuB;QACjC,OAAO,IAAI,CAAA;QACP,GAAG,CAAC,2CAA2C,CAAC;WAC7C,CAAC;IACV,CAAC;IAED,gFAAgF;IAChF,IAAY,oBAAoB;QAC9B,IAAI,IAAI,CAAC,aAAa;YACpB,OAAO,IAAI,CAAA;;YAEL,GAAG,CAAC,uCAAuC,CAAC;;OAEjD,CAAC;QAEJ,OAAO,IAAI,CAAA;;UAEL,GAAG,CAAC,2BAA2B,CAAC;UAChC,GAAG,CAAC,IAAI,CAAA;;;;;qBAKG,IAAI,CAAC,aAAa;;;;SAI9B,CAAC;;KAEL,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,IAAY,yBAAyB;QACnC,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,YAAY,KAAK,CAAC;YACvB,CAAC,CAAC,GAAG,CAAC,kCAAkC,CAAC;YACzC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,YAAY,yBAAyB,CAAC;;;;mBAIrD,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;;YAEzC,GAAG,CACH,WAAW,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAC5D;;;KAGN,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,IAAY,6BAA6B;QAGvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,OAAO,CAAC;QAEnE,OAAO,IAAI,CAAA;QACP,CAAC,IAAI,CAAC,iBAAiB;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;YACvC,CAAC,CAAC,IAAI,CAAA;0BACY,IAAI,CAAC,UAAU;yBAChB,IAAI,CAAC,aAAa;iCACV,IAAI,CAAC,iBAAiB;mCACpB,IAAI,CAAC,mBAAmB;gCAC3B,IAAI,CAAC,gBAAgB;6BACxB,IAAI,CAAC,aAAa;kCACb,IAAI,CAAC,qBAAqB;6BAC/B,IAAI,CAAC,mBAAmB;gCACrB,IAAI,CAAC,kBAAkB;gBACzC,CAAC,CAAC,IAAI,CAAC,gBAAgB;gBACvB,CAAC,CAAC,SAAS;+BACM,IAAI,CAAC,eAAe;6BACtB,IAAI,CAAC,kBAAkB;kCAClB,IAAI,CAAC,kBAAkB;6BAC5B;WAClB,CAAC;IACV,CAAC;IAED,oFAAoF;IAC5E,iBAAiB;QACvB,IAAI,gBAAoC,CAAC;QACzC,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,IACE,CAAC,gBAAgB;gBACjB,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,iBAAiB,EACnD,CAAC;gBACD,gBAAgB,GAAG,MAAM,CAAC;YAC5B,CAAC;;gBAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC;IAED,8CAA8C;IACtC,WAAW,CAAC,OAAiB;QACnC,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/C,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;YAC1B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;YACrE,CAAC,CAAC,CAAC,CACN,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,6DAA6D;IACrD,YAAY,CAAC,MAAe;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC;QAE5B,OAAO,IAAI,CAAA;gBACC,MAAM;oBACF,IAAI,CAAC,UAAU;kBACjB,IAAI,CAAC,QAAQ;uBACR,IAAI,CAAC,mBAAmB;mBAC5B,IAAI,CAAC,SAAS;0BACP,IAAI,CAAC,uBAAuB;kBACpC,CAAC;IACjB,CAAC;IAED,oDAAoD;IAC5C,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,2CAA2C;IACnC,kBAAkB,CAAC,CAAsB;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAO,gBAAgB,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,0CAA0C;IAClC,kBAAkB;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAE/B,8DAA8D;QAC9D,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmDF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAzV6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAqB;AAGrB;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;0CAAwB;AAGrB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDAAyB;AAGxB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDAAuB;AAGtB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4CAAmB;AAGlB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DAAiC;AAGjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAA2B;AAG1B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAwB;AAGvB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CAAkC;AAKjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sDAA2C;AAG1C;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAA4B;AAG3B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAA8C;AAG5C;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDAAkC;AAGlC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAgC;AAG9B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;yDAAyC;AAQzC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAwC;AAI3D;IADP,KAAK,EAAE;sDAC6C;AAIrD;IADC,KAAK,EAAE;oDAC2B;AAI3B;IADP,KAAK,EAAE;iDACgC;AAIhC;IADP,KAAK,EAAE;kDAC+B;AAI/B;IADP,KAAK,EAAE;gDACuB;AAIvB;IADP,KAAK,EAAE;+CACyB;AAIzB;IADP,KAAK,EAAE;qDACoC;AAnFjC,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CA4VrB","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n HTMLTemplateResult,\n LitElement,\n nothing,\n PropertyValues,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg } from '@lit/localize';\n\nimport type { Review } from '@internetarchive/metadata-service';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\n\nimport '@src/elements/ia-button/ia-button';\n\nimport type { ReviewServiceInterface } from './models';\nimport { ReviewService } from './review-service';\nimport './ia-review';\nimport './ia-review-form';\n\n/**\n * Renders the full IA reviews piece\n */\n@customElement('ia-reviews')\nexport class IAReviews extends LitElement {\n /** GLOBAL/REVIEW-RENDERING PROPERTIES */\n /* The identifier for the item being reviewed */\n @property({ type: String }) identifier?: string;\n\n /* The list of reviews to be rendered */\n @property({ type: Array }) reviews: Review[] = [];\n\n /* Whether reviews are disabled for the item */\n @property({ type: Boolean }) reviewsDisabled = false;\n\n /* Whether reviews are frozen for the item */\n @property({ type: Boolean }) reviewsFrozen = false;\n\n /* Whether the person viewing the reviews section has the power to delete reviews */\n @property({ type: Boolean }) canDelete = false;\n\n /* Whether we should bypass the show/hide and more/less toggles */\n @property({ type: Boolean }) displayReviewsByDefault = false;\n\n /* Maximum allowable length for subject */\n @property({ type: Number }) maxSubjectLength?: number;\n\n /* Maximum allowable length for body */\n @property({ type: Number }) maxBodyLength?: number;\n\n /* Base for URLs. Also used for the reviewer profile links. */\n @property({ type: String }) baseHost = 'https://archive.org';\n\n /** REVIEW FORM PROPERTIES */\n\n /** Form submitter's screenname, if applicable */\n @property({ type: String }) submitterScreenname: string = 'Anonymous';\n\n /** Form submitter's itemname, if applicable */\n @property({ type: String }) submitterItemname?: string;\n\n /* Service for activating the recaptcha challenge */\n @property({ type: Object }) recaptchaManager?: RecaptchaManagerInterface;\n\n /* Optionally avoid using recaptcha for the form */\n @property({ type: Boolean }) bypassRecaptcha: boolean = false;\n\n /* An optional error message to be displayed instead of the review form */\n @property({ type: String }) reviewSubmissionError?: string;\n\n /* Whether the add/edit button has been clicked */\n @property({ type: Boolean }) reviewAddEditRequested: boolean = false;\n\n /**\n * Handles the review write and delete requests.\n *\n * Writing and deleting need one, since the service is what carries the CSRF token. Left unset,\n * reviews still render and the form still opens, but a submission reports a generic failure.\n */\n @property({ type: Object }) reviewService?: ReviewServiceInterface;\n\n /* The service the components actually call, whether injected or built here */\n @state()\n private activeReviewService?: ReviewServiceInterface;\n\n /* Whether to display the review form or the editable review */\n @state()\n displayReviewForm: boolean = false;\n\n /* Whether to display the existing reviews */\n @state()\n private displayReviews: boolean = false;\n\n /* The sorted and filtered reviews to render */\n @state()\n private filteredReviews: Review[] = [];\n\n /* The current version of the review */\n @state()\n private currentReview?: Review;\n\n /* The number of reviews */\n @state()\n private reviewsCount: number = 0;\n\n /* Whether recaptcha has been activated (by clicking the add/edit button) */\n @state()\n private recaptchaActivated: boolean = false;\n\n render() {\n if (this.reviewsDisabled) return this.reviewsDisabledTemplate;\n if (this.reviewsCount === 0 && !this.displayReviewForm)\n return this.noReviewsMsgTemplate;\n if (!this.displayReviews) return this.displayReviewsMsgTemplate;\n\n return html`\n <div class=\"reviews-list\">\n ${this.reviewsFrozen\n ? html`<div class=\"message\">\n ${msg('Reviews can no longer be added to this item.')}\n </div>`\n : nothing}\n ${this.editableCurrentReviewTemplate}\n ${this.filteredReviews.map((review) =>\n review.reviewer_itemname !== this.submitterItemname\n ? this.renderReview(review)\n : nothing,\n )}\n </div>\n `;\n }\n\n protected willUpdate(changed: PropertyValues): void {\n if (\n !this.activeReviewService ||\n changed.has('reviewService') ||\n changed.has('baseHost')\n ) {\n // the fallback keeps rendering and the form working for a consumer that supplies no\n // service; it carries no CSRF token, so a submission through it fails\n this.activeReviewService =\n this.reviewService ?? new ReviewService({ baseHost: this.baseHost });\n }\n\n if (changed.has('reviews') || changed.has('submitterItemname')) {\n this.reviewsCount = this.reviews.length;\n this.sortFilterReviews();\n }\n\n if (changed.has('displayReviewForm') && this.displayReviewForm === true) {\n if (!this.bypassRecaptcha && !this.recaptchaActivated)\n this.recaptchaActivated = true;\n this.displayReviews = true;\n }\n\n if (\n changed.has('displayReviewsByDefault') &&\n this.displayReviewsByDefault\n ) {\n this.displayReviews = true;\n }\n }\n\n /* Message to display if reviews are disabled */\n private get reviewsDisabledTemplate(): HTMLTemplateResult {\n return html`<div class=\"message\">\n ${msg('Reviews have been disabled for this item.')}\n </div>`;\n }\n\n /* Message to display instead of the reviews list if there are no reviews yet */\n private get noReviewsMsgTemplate(): HTMLTemplateResult {\n if (this.reviewsFrozen)\n return html`\n <div class=\"message\">\n ${msg('Reviews cannot be added to this item.')}\n </div>\n `;\n\n return html`\n <div class=\"message\">\n ${msg('There are no reviews yet.')}\n ${msg(html`\n Be the first one to\n <ia-button\n mode=\"link\"\n class=\"no-reviews-btn\"\n @click=${this.addEditReview}\n >\n write a review</ia-button\n >.\n `)}\n </div>\n `;\n }\n\n /* Message to display instead of the reviews list if reviews are hidden */\n private get displayReviewsMsgTemplate(): HTMLTemplateResult {\n return html`\n <div class=\"message\">\n ${this.reviewsCount === 1\n ? msg('There is 1 review for this item.')\n : msg(`There are ${this.reviewsCount} reviews for this item.`)}\n <ia-button\n mode=\"link\"\n class=\"display-reviews-btn\"\n @click=${() => (this.displayReviews = true)}\n >\n ${msg(\n `Display ${this.reviewsCount === 1 ? 'review' : 'reviews'}`,\n )}</ia-button\n >.\n </div>\n `;\n }\n\n /**\n * Renders the review form, passing along all necessary properties; this will also render\n * the patron's own review if applicable and/or following submission.\n */\n private get editableCurrentReviewTemplate():\n | HTMLTemplateResult\n | typeof nothing {\n if (!this.displayReviewForm && !this.currentReview) return nothing;\n\n return html`<div class=\"own-review-container\">\n ${!this.displayReviewForm\n ? this.renderReview(this.currentReview)\n : html`<ia-review-form\n .identifier=${this.identifier}\n .oldReview=${this.currentReview}\n .submitterItemname=${this.submitterItemname}\n .submitterScreenname=${this.submitterScreenname}\n .maxSubjectLength=${this.maxSubjectLength}\n .maxBodyLength=${this.maxBodyLength}\n .unrecoverableError=${this.reviewSubmissionError}\n .reviewService=${this.activeReviewService}\n .recaptchaManager=${this.recaptchaActivated\n ? this.recaptchaManager\n : undefined}\n ?bypassRecaptcha=${this.bypassRecaptcha}\n @reviewUpdated=${this.handleReviewUpdate}\n @reviewEditCanceled=${this.handleEditCanceled}\n ></ia-review-form>`}\n </div>`;\n }\n\n /** Sorts the reviews and splits the patron's own review out of the reviews array */\n private sortFilterReviews(): void {\n let patronsOwnReview: Review | undefined;\n const filteredReviews: Review[] = [];\n\n this.reviews.forEach((review) => {\n if (\n !patronsOwnReview &&\n review.reviewer_itemname === this.submitterItemname\n ) {\n patronsOwnReview = review;\n } else filteredReviews.push(review);\n });\n\n this.currentReview = patronsOwnReview;\n this.filteredReviews = this.sortReviews(filteredReviews);\n }\n\n /** Sorts reviews by create date for render */\n private sortReviews(reviews: Review[]): Review[] {\n const sortedReviews = [...reviews].sort((a, b) =>\n a.createdate && b.createdate\n ? new Date(b.createdate).getTime() - new Date(a.createdate).getTime()\n : 0,\n );\n\n return sortedReviews;\n }\n\n /* Renders the given review, using the ia-review component */\n private renderReview(review?: Review): HTMLTemplateResult | typeof nothing {\n if (!review) return nothing;\n\n return html`<ia-review\n .review=${review}\n .identifier=${this.identifier}\n .baseHost=${this.baseHost}\n .reviewService=${this.activeReviewService}\n ?canDelete=${this.canDelete}\n ?bypassTruncation=${this.displayReviewsByDefault}\n ></ia-review>`;\n }\n\n /** Prepare the review form for adding or editing */\n private addEditReview(): void {\n if (!this.bypassRecaptcha) this.recaptchaActivated = true;\n this.displayReviewForm = true;\n }\n\n /** Handles successful review submission */\n private handleReviewUpdate(e: CustomEvent<Review>): void {\n if (!this.currentReview && e.detail) {\n this.dispatchEvent(new CustomEvent<void>('newReviewAdded'));\n this.reviewsCount += 1;\n }\n this.currentReview = e.detail;\n this.displayReviewForm = false;\n }\n\n /** Closes the review form if requested */\n private handleEditCanceled(): void {\n this.displayReviewForm = false;\n\n // Display no-reviews message again if no new review was added\n if (this.reviewsCount === 0) {\n this.displayReviews = false;\n }\n }\n\n static get styles(): CSSResultGroup {\n return [\n css`\n :host {\n font-family: var(\n --ia-font-stack,\n 'Helvetica Neue',\n Helvetica,\n Arial,\n sans-serif\n );\n\n color: var(--ia-text-color, #2c2c2c);\n }\n\n .reviews-list {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n width: 100%;\n }\n\n .own-review-container {\n --error-color: var(--container-error-color, #ea0202);\n --link-color: var(--container-link-color, #4f65f5);\n --container-error-color: #ea0202;\n --container-link-color: #4f65f5;\n --container-bg-color: #fbfbfd;\n --container-border-color: #999999;\n\n border: 2px solid var(--container-border-color, #999999);\n border-radius: 5px;\n background-color: var(--container-bg-color, #fbfbfd);\n padding: 10px;\n }\n\n .message {\n font-weight: 200;\n }\n\n .message ia-button {\n display: inline;\n vertical-align: baseline;\n }\n\n /* The button inside ia-button is a flex box, which would break these\n out of the sentence they sit in. */\n .message ia-button::part(button) {\n display: inline;\n min-height: 0;\n padding: 0;\n font-weight: 600;\n }\n `,\n ];\n }\n}\n"]}
1
+ {"version":3,"file":"ia-reviews.js","sourceRoot":"","sources":["../../../../src/elements/ia-reviews/ia-reviews.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n HTMLTemplateResult,\n LitElement,\n nothing,\n PropertyValues,\n} from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\nimport { msg } from '@lit/localize';\n\nimport type { Review } from '@internetarchive/metadata-service';\nimport type { RecaptchaManagerInterface } from '@internetarchive/recaptcha-manager';\nimport {\n FetchHandlerInterface,\n IaFetchHandler,\n} from '@internetarchive/fetch-handler';\n\nimport '@src/elements/ia-button/ia-button';\n\nimport './ia-review';\nimport './ia-review-form';\n\n/**\n * Renders the full IA reviews piece\n */\n@customElement('ia-reviews')\nexport class IAReviews extends LitElement {\n /** GLOBAL/REVIEW-RENDERING PROPERTIES */\n /* The identifier for the item being reviewed */\n @property({ type: String }) identifier?: string;\n\n /* The list of reviews to be rendered */\n @property({ type: Array }) reviews: Review[] = [];\n\n /* Whether reviews are disabled for the item */\n @property({ type: Boolean }) reviewsDisabled = false;\n\n /* Whether reviews are frozen for the item */\n @property({ type: Boolean }) reviewsFrozen = false;\n\n /* Whether the person viewing the reviews section has the power to delete reviews */\n @property({ type: Boolean }) canDelete = false;\n\n /* Whether we should bypass the show/hide and more/less toggles */\n @property({ type: Boolean }) displayReviewsByDefault = false;\n\n /* Maximum allowable length for subject */\n @property({ type: Number }) maxSubjectLength?: number;\n\n /* Maximum allowable length for body */\n @property({ type: Number }) maxBodyLength?: number;\n\n /* Base for URLs */\n @property({ type: String }) baseHost = 'https://archive.org';\n\n /** REVIEW FORM PROPERTIES */\n /* The token for the review edit */\n @property({ type: String }) token: string = '';\n\n /* The path for the endpoint we're submitting to */\n @property({ type: String }) endpointPath: string = '/write-review.php';\n\n /** Form submitter's screenname, if applicable */\n @property({ type: String }) submitterScreenname: string = 'Anonymous';\n\n /** Form submitter's itemname, if applicable */\n @property({ type: String }) submitterItemname?: string;\n\n /* Service for activating the recaptcha challenge */\n @property({ type: Object }) recaptchaManager?: RecaptchaManagerInterface;\n\n /* Optionally avoid using recaptcha for the form */\n @property({ type: Boolean }) bypassRecaptcha: boolean = false;\n\n /* An optional error message to be displayed instead of the review form */\n @property({ type: String }) reviewSubmissionError?: string;\n\n /* Whether the add/edit button has been clicked */\n @property({ type: Boolean }) reviewAddEditRequested: boolean = false;\n\n /* An optional handler for form submission to pass along to the form */\n @property({ type: Object }) fetchHandler: FetchHandlerInterface =\n new IaFetchHandler();\n\n /* Whether to display the review form or the editable review */\n @state()\n displayReviewForm: boolean = false;\n\n /* Whether to display the existing reviews */\n @state()\n private displayReviews: boolean = false;\n\n /* The sorted and filtered reviews to render */\n @state()\n private filteredReviews: Review[] = [];\n\n /* The current version of the review */\n @state()\n private currentReview?: Review;\n\n /* The number of reviews */\n @state()\n private reviewsCount: number = 0;\n\n /* Whether recaptcha has been activated (by clicking the add/edit button) */\n @state()\n private recaptchaActivated: boolean = false;\n\n render() {\n if (this.reviewsDisabled) return this.reviewsDisabledTemplate;\n if (this.reviewsCount === 0 && !this.displayReviewForm)\n return this.noReviewsMsgTemplate;\n if (!this.displayReviews) return this.displayReviewsMsgTemplate;\n\n return html`\n <div class=\"reviews-list\">\n ${this.reviewsFrozen\n ? html`<div class=\"message\">\n ${msg('Reviews can no longer be added to this item.')}\n </div>`\n : nothing}\n ${this.editableCurrentReviewTemplate}\n ${this.filteredReviews.map((review) =>\n review.reviewer_itemname !== this.submitterItemname\n ? this.renderReview(review)\n : nothing,\n )}\n </div>\n `;\n }\n\n protected willUpdate(changed: PropertyValues): void {\n if (changed.has('reviews') || changed.has('submitterItemname')) {\n this.reviewsCount = this.reviews.length;\n this.sortFilterReviews();\n }\n\n if (changed.has('displayReviewForm') && this.displayReviewForm === true) {\n if (!this.bypassRecaptcha && !this.recaptchaActivated)\n this.recaptchaActivated = true;\n this.displayReviews = true;\n }\n\n if (\n changed.has('displayReviewsByDefault') &&\n this.displayReviewsByDefault\n ) {\n this.displayReviews = true;\n }\n }\n\n /* Message to display if reviews are disabled */\n private get reviewsDisabledTemplate(): HTMLTemplateResult {\n return html`<div class=\"message\">\n ${msg('Reviews have been disabled for this item.')}\n </div>`;\n }\n\n /* Message to display instead of the reviews list if there are no reviews yet */\n private get noReviewsMsgTemplate(): HTMLTemplateResult {\n if (this.reviewsFrozen)\n return html`\n <div class=\"message\">\n ${msg('Reviews cannot be added to this item.')}\n </div>\n `;\n\n return html`\n <div class=\"message\">\n ${msg('There are no reviews yet.')}\n ${msg(html`\n Be the first one to\n <ia-button\n mode=\"link\"\n class=\"no-reviews-btn\"\n @click=${this.addEditReview}\n >\n write a review</ia-button\n >.\n `)}\n </div>\n `;\n }\n\n /* Message to display instead of the reviews list if reviews are hidden */\n private get displayReviewsMsgTemplate(): HTMLTemplateResult {\n return html`\n <div class=\"message\">\n ${this.reviewsCount === 1\n ? msg('There is 1 review for this item.')\n : msg(`There are ${this.reviewsCount} reviews for this item.`)}\n <ia-button\n mode=\"link\"\n class=\"display-reviews-btn\"\n @click=${() => (this.displayReviews = true)}\n >\n ${msg(\n `Display ${this.reviewsCount === 1 ? 'review' : 'reviews'}`,\n )}</ia-button\n >.\n </div>\n `;\n }\n\n /**\n * Renders the review form, passing along all necessary properties; this will also render\n * the patron's own review if applicable and/or following submission.\n */\n private get editableCurrentReviewTemplate():\n | HTMLTemplateResult\n | typeof nothing {\n if (!this.displayReviewForm && !this.currentReview) return nothing;\n\n return html`<div class=\"own-review-container\">\n ${!this.displayReviewForm\n ? this.renderReview(this.currentReview)\n : html`<ia-review-form\n .identifier=${this.identifier}\n .oldReview=${this.currentReview}\n .baseHost=${this.baseHost}\n .endpointPath=${this.endpointPath}\n .submitterItemname=${this.submitterItemname}\n .submitterScreenname=${this.submitterScreenname}\n .maxSubjectLength=${this.maxSubjectLength}\n .maxBodyLength=${this.maxBodyLength}\n .token=${this.token}\n .unrecoverableError=${this.reviewSubmissionError}\n .fetchHandler=${this.fetchHandler}\n .recaptchaManager=${this.recaptchaActivated\n ? this.recaptchaManager\n : undefined}\n ?bypassRecaptcha=${this.bypassRecaptcha}\n @reviewUpdated=${this.handleReviewUpdate}\n @reviewEditCanceled=${this.handleEditCanceled}\n ></ia-review-form>`}\n </div>`;\n }\n\n /** Sorts the reviews and splits the patron's own review out of the reviews array */\n private sortFilterReviews(): void {\n let patronsOwnReview: Review | undefined;\n const filteredReviews: Review[] = [];\n\n this.reviews.forEach((review) => {\n if (\n !patronsOwnReview &&\n review.reviewer_itemname === this.submitterItemname\n ) {\n patronsOwnReview = review;\n } else filteredReviews.push(review);\n });\n\n this.currentReview = patronsOwnReview;\n this.filteredReviews = this.sortReviews(filteredReviews);\n }\n\n /** Sorts reviews by create date for render */\n private sortReviews(reviews: Review[]): Review[] {\n const sortedReviews = [...reviews].sort((a, b) =>\n a.createdate && b.createdate\n ? new Date(b.createdate).getTime() - new Date(a.createdate).getTime()\n : 0,\n );\n\n return sortedReviews;\n }\n\n /* Renders the given review, using the ia-review component */\n private renderReview(review?: Review): HTMLTemplateResult | typeof nothing {\n if (!review) return nothing;\n\n return html`<ia-review\n .review=${review}\n .identifier=${this.identifier}\n .baseHost=${this.baseHost}\n .csrfToken=${this.token}\n ?canDelete=${this.canDelete}\n ?bypassTruncation=${this.displayReviewsByDefault}\n ></ia-review>`;\n }\n\n /** Prepare the review form for adding or editing */\n private addEditReview(): void {\n if (!this.bypassRecaptcha) this.recaptchaActivated = true;\n this.displayReviewForm = true;\n }\n\n /** Handles successful review submission */\n private handleReviewUpdate(e: CustomEvent<Review>): void {\n if (!this.currentReview && e.detail) {\n this.dispatchEvent(new CustomEvent<void>('newReviewAdded'));\n this.reviewsCount += 1;\n }\n this.currentReview = e.detail;\n this.displayReviewForm = false;\n }\n\n /** Closes the review form if requested */\n private handleEditCanceled(): void {\n this.displayReviewForm = false;\n\n // Display no-reviews message again if no new review was added\n if (this.reviewsCount === 0) {\n this.displayReviews = false;\n }\n }\n\n static get styles(): CSSResultGroup {\n return [\n css`\n :host {\n font-family: var(\n --ia-font-stack,\n 'Helvetica Neue',\n Helvetica,\n Arial,\n sans-serif\n );\n\n color: var(--ia-text-color, #2c2c2c);\n }\n\n .reviews-list {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n width: 100%;\n }\n\n .own-review-container {\n --error-color: var(--container-error-color, #ea0202);\n --link-color: var(--container-link-color, #4f65f5);\n --container-error-color: #ea0202;\n --container-link-color: #4f65f5;\n --container-bg-color: #fbfbfd;\n --container-border-color: #999999;\n\n border: 2px solid var(--container-border-color, #999999);\n border-radius: 5px;\n background-color: var(--container-bg-color, #fbfbfd);\n padding: 10px;\n }\n\n .message {\n font-weight: 200;\n }\n\n .message ia-button {\n display: inline;\n vertical-align: baseline;\n }\n\n /* The button inside ia-button is a flex box, which would break these\n out of the sentence they sit in. */\n .message ia-button::part(button) {\n display: inline;\n min-height: 0;\n padding: 0;\n font-weight: 600;\n }\n `,\n ];\n }\n}\n"]}
@@ -1,23 +1,8 @@
1
- import type { FetchHandlerInterface, FetchOptions } from '@internetarchive/fetch-handler';
2
- /** A fetch() call the service made */
3
- export type RecordedFetch = {
4
- url: string;
5
- options?: FetchOptions;
6
- };
1
+ import type { FetchHandlerInterface } from '@internetarchive/fetch-handler';
7
2
  export declare class MockFetchHandler implements FetchHandlerInterface {
8
- /** Every fetch() the service made, in order */
9
- fetches: RecordedFetch[];
10
- /** What fetch() should hand back. Defaults to a 200 carrying `{ success: true }`. */
11
- response: () => Response;
12
3
  fetchApiResponse<T>(): Promise<T>;
13
4
  fetchApiPathResponse<T>(): Promise<T>;
14
5
  fetchIAApiResponse<T>(): Promise<T>;
15
- fetch(input: RequestInfo, options?: FetchOptions): Promise<Response>;
16
- /** The most recent fetch the service made */
17
- get lastFetch(): RecordedFetch | undefined;
18
- /** The RequestInit the service handed to the handler */
19
- get lastRequestInit(): RequestInit;
20
- /** Body of the last fetch, decoded as url-encoded form params */
21
- bodyOnLastFetch(): URLSearchParams;
6
+ fetch(): Promise<Response>;
22
7
  }
23
8
  //# sourceMappingURL=mock-fetch-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-fetch-handler.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-fetch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,gCAAgC,CAAC;AAExC,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF,qBAAa,gBAAiB,YAAW,qBAAqB;IAC5D,+CAA+C;IAC/C,OAAO,EAAE,aAAa,EAAE,CAAM;IAE9B,qFAAqF;IACrF,QAAQ,EAAE,MAAM,QAAQ,CAInB;IAEC,gBAAgB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAIjC,oBAAoB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAIrC,kBAAkB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAInC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1E,6CAA6C;IAC7C,IAAI,SAAS,IAAI,aAAa,GAAG,SAAS,CAEzC;IAED,wDAAwD;IACxD,IAAI,eAAe,IAAI,WAAW,CAEjC;IAED,iEAAiE;IACjE,eAAe,IAAI,eAAe;CAGnC"}
1
+ {"version":3,"file":"mock-fetch-handler.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-fetch-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,qBAAa,gBAAiB,YAAW,qBAAqB;IACtD,gBAAgB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAIjC,oBAAoB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAIrC,kBAAkB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;IAInC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC;CAGjC"}
@@ -1,13 +1,4 @@
1
1
  export class MockFetchHandler {
2
- constructor() {
3
- /** Every fetch() the service made, in order */
4
- this.fetches = [];
5
- /** What fetch() should hand back. Defaults to a 200 carrying `{ success: true }`. */
6
- this.response = () => new Response(JSON.stringify({ success: true }), {
7
- status: 200,
8
- headers: { 'Content-Type': 'application/json' },
9
- });
10
- }
11
2
  async fetchApiResponse() {
12
3
  return { success: true };
13
4
  }
@@ -17,21 +8,8 @@ export class MockFetchHandler {
17
8
  async fetchIAApiResponse() {
18
9
  return {};
19
10
  }
20
- async fetch(input, options) {
21
- this.fetches.push({ url: input, options });
22
- return this.response();
23
- }
24
- /** The most recent fetch the service made */
25
- get lastFetch() {
26
- return this.fetches[this.fetches.length - 1];
27
- }
28
- /** The RequestInit the service handed to the handler */
29
- get lastRequestInit() {
30
- return this.lastFetch?.options?.requestInit ?? {};
31
- }
32
- /** Body of the last fetch, decoded as url-encoded form params */
33
- bodyOnLastFetch() {
34
- return new URLSearchParams(String(this.lastRequestInit.body ?? ''));
11
+ async fetch() {
12
+ return new Response();
35
13
  }
36
14
  }
37
15
  //# sourceMappingURL=mock-fetch-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-fetch-handler.js","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-fetch-handler.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,gBAAgB;IAA7B;QACE,+CAA+C;QAC/C,YAAO,GAAoB,EAAE,CAAC;QAE9B,qFAAqF;QACrF,aAAQ,GAAmB,GAAG,EAAE,CAC9B,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;YAC9C,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CAAC;IAiCP,CAAC;IA/BC,KAAK,CAAC,gBAAgB;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,EAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkB,EAAE,OAAsB;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAe,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,6CAA6C;IAC7C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,wDAAwD;IACxD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,iEAAiE;IACjE,eAAe;QACb,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;CACF","sourcesContent":["import type {\n FetchHandlerInterface,\n FetchOptions,\n} from '@internetarchive/fetch-handler';\n\n/** A fetch() call the service made */\nexport type RecordedFetch = {\n url: string;\n options?: FetchOptions;\n};\n\nexport class MockFetchHandler implements FetchHandlerInterface {\n /** Every fetch() the service made, in order */\n fetches: RecordedFetch[] = [];\n\n /** What fetch() should hand back. Defaults to a 200 carrying `{ success: true }`. */\n response: () => Response = () =>\n new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n\n async fetchApiResponse<T>(): Promise<T> {\n return { success: true } as T;\n }\n\n async fetchApiPathResponse<T>(): Promise<T> {\n return {} as T;\n }\n\n async fetchIAApiResponse<T>(): Promise<T> {\n return {} as T;\n }\n\n async fetch(input: RequestInfo, options?: FetchOptions): Promise<Response> {\n this.fetches.push({ url: input as string, options });\n return this.response();\n }\n\n /** The most recent fetch the service made */\n get lastFetch(): RecordedFetch | undefined {\n return this.fetches[this.fetches.length - 1];\n }\n\n /** The RequestInit the service handed to the handler */\n get lastRequestInit(): RequestInit {\n return this.lastFetch?.options?.requestInit ?? {};\n }\n\n /** Body of the last fetch, decoded as url-encoded form params */\n bodyOnLastFetch(): URLSearchParams {\n return new URLSearchParams(String(this.lastRequestInit.body ?? ''));\n }\n}\n"]}
1
+ {"version":3,"file":"mock-fetch-handler.js","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-fetch-handler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IAC3B,KAAK,CAAC,gBAAgB;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,OAAO,EAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxB,CAAC;CACF","sourcesContent":["import type { FetchHandlerInterface } from '@internetarchive/fetch-handler';\n\nexport class MockFetchHandler implements FetchHandlerInterface {\n async fetchApiResponse<T>(): Promise<T> {\n return { success: true } as T;\n }\n\n async fetchApiPathResponse<T>(): Promise<T> {\n return {} as T;\n }\n\n async fetchIAApiResponse<T>(): Promise<T> {\n return {} as T;\n }\n\n async fetch(): Promise<Response> {\n return new Response();\n }\n}\n"]}
@@ -29,8 +29,6 @@ export * from './ia-radio-player/search/transcript-index.js';
29
29
  export * from './ia-reviews/ia-review.js';
30
30
  export * from './ia-reviews/ia-review-form.js';
31
31
  export * from './ia-reviews/ia-reviews.js';
32
- export * from './ia-reviews/models.js';
33
- export * from './ia-reviews/review-service.js';
34
32
  export * from './ia-scrubber-bar/ia-scrubber-bar.js';
35
33
  export * from './ia-scrubber-bar/ia-section-marker.js';
36
34
  export * from './ia-scrubber-bar/models.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC"}
@@ -29,8 +29,6 @@ export * from './ia-radio-player/search/transcript-index.js';
29
29
  export * from './ia-reviews/ia-review.js';
30
30
  export * from './ia-reviews/ia-review-form.js';
31
31
  export * from './ia-reviews/ia-reviews.js';
32
- export * from './ia-reviews/models.js';
33
- export * from './ia-reviews/review-service.js';
34
32
  export * from './ia-scrubber-bar/ia-scrubber-bar.js';
35
33
  export * from './ia-scrubber-bar/ia-section-marker.js';
36
34
  export * from './ia-scrubber-bar/models.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './ia-audio-element/ia-audio-element';\nexport * from './ia-audio-element/models';\nexport * from './ia-button/ia-button';\nexport * from './ia-combo-box/ia-combo-box';\nexport * from './ia-dropdown-search-bar/ia-dropdown-search-bar';\nexport * from './ia-expandable-search-bar/ia-expandable-search-bar';\nexport * from './ia-expandable-search-bar/ia-quick-search';\nexport * from './ia-expandable-search-bar/models';\nexport * from './ia-histogram-date-range/ia-histogram-date-range';\nexport * from './ia-histogram-date-range/models';\nexport * from './ia-image-viewer/ia-image-viewer';\nexport * from './ia-item-navigator/ia-item-navigator';\nexport * from './ia-item-navigator/menus/ia-itemnav-viewable-files-panel';\nexport * from './ia-item-navigator/menus/ia-itemnav-sort-files-button';\nexport * from './ia-item-navigator/menus/ia-itemnav-share-panel';\nexport * from './ia-playback-controls/ia-playback-controls';\nexport * from './ia-playback-controls/models';\nexport * from './ia-radio-player/ia-radio-player';\nexport * from './ia-radio-player/ia-search-results-switcher';\nexport * from './ia-radio-player/models';\nexport * from './ia-radio-player/search/backends/full-text-search-backend';\nexport * from './ia-radio-player/search/backends/full-text-search-response';\nexport * from './ia-radio-player/search/backends/local-search-backend';\nexport * from './ia-radio-player/search/backends/search-backend';\nexport * from './ia-radio-player/search/models';\nexport * from './ia-radio-player/search/search-handler';\nexport * from './ia-radio-player/search/search-helper';\nexport * from './ia-radio-player/search/transcript-index';\nexport * from './ia-reviews/ia-review';\nexport * from './ia-reviews/ia-review-form';\nexport * from './ia-reviews/ia-reviews';\nexport * from './ia-reviews/models';\nexport * from './ia-reviews/review-service';\nexport * from './ia-scrubber-bar/ia-scrubber-bar';\nexport * from './ia-scrubber-bar/ia-section-marker';\nexport * from './ia-scrubber-bar/models';\nexport * from './ia-transcript-view/duration-formatter';\nexport * from './ia-transcript-view/ia-transcript-entry';\nexport * from './ia-transcript-view/ia-transcript-view';\nexport * from './ia-transcript-view/models';\nexport * from './ia-waveform-progress/ia-waveform-progress';\nexport * from './ia-waveform-progress/models';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,mDAAmD,CAAC;AAClE,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './ia-audio-element/ia-audio-element';\nexport * from './ia-audio-element/models';\nexport * from './ia-button/ia-button';\nexport * from './ia-combo-box/ia-combo-box';\nexport * from './ia-dropdown-search-bar/ia-dropdown-search-bar';\nexport * from './ia-expandable-search-bar/ia-expandable-search-bar';\nexport * from './ia-expandable-search-bar/ia-quick-search';\nexport * from './ia-expandable-search-bar/models';\nexport * from './ia-histogram-date-range/ia-histogram-date-range';\nexport * from './ia-histogram-date-range/models';\nexport * from './ia-image-viewer/ia-image-viewer';\nexport * from './ia-item-navigator/ia-item-navigator';\nexport * from './ia-item-navigator/menus/ia-itemnav-viewable-files-panel';\nexport * from './ia-item-navigator/menus/ia-itemnav-sort-files-button';\nexport * from './ia-item-navigator/menus/ia-itemnav-share-panel';\nexport * from './ia-playback-controls/ia-playback-controls';\nexport * from './ia-playback-controls/models';\nexport * from './ia-radio-player/ia-radio-player';\nexport * from './ia-radio-player/ia-search-results-switcher';\nexport * from './ia-radio-player/models';\nexport * from './ia-radio-player/search/backends/full-text-search-backend';\nexport * from './ia-radio-player/search/backends/full-text-search-response';\nexport * from './ia-radio-player/search/backends/local-search-backend';\nexport * from './ia-radio-player/search/backends/search-backend';\nexport * from './ia-radio-player/search/models';\nexport * from './ia-radio-player/search/search-handler';\nexport * from './ia-radio-player/search/search-helper';\nexport * from './ia-radio-player/search/transcript-index';\nexport * from './ia-reviews/ia-review';\nexport * from './ia-reviews/ia-review-form';\nexport * from './ia-reviews/ia-reviews';\nexport * from './ia-scrubber-bar/ia-scrubber-bar';\nexport * from './ia-scrubber-bar/ia-section-marker';\nexport * from './ia-scrubber-bar/models';\nexport * from './ia-transcript-view/duration-formatter';\nexport * from './ia-transcript-view/ia-transcript-entry';\nexport * from './ia-transcript-view/ia-transcript-view';\nexport * from './ia-transcript-view/models';\nexport * from './ia-waveform-progress/ia-waveform-progress';\nexport * from './ia-waveform-progress/models';\n"]}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@internetarchive/elements",
3
- "version": "1.1.3-webdev-8840.0",
3
+ "version": "1.1.3-webdev-9107.0",
4
4
  "description": "A web component library from the Internet Archive.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "types": "./dist/src/elements/index.d.ts",
7
7
  "type": "module",
8
- "packageManager": "pnpm@11.22.0",
8
+ "packageManager": "pnpm@12.4.0",
9
9
  "engines": {
10
10
  "node": ">=24",
11
- "pnpm": ">=11"
11
+ "pnpm": ">=12"
12
12
  },
13
13
  "publishConfig": {
14
14
  "access": "public"
@@ -1,12 +0,0 @@
1
- import type { ReviewDeletion, ReviewServiceInterface, ReviewServiceResult, ReviewSubmission } from '../models.js';
2
- export declare class MockReviewService implements ReviewServiceInterface {
3
- /** Submissions the form handed over, in order */
4
- submissions: ReviewSubmission[];
5
- /** Deletions the review handed over, in order */
6
- deletions: ReviewDeletion[];
7
- /** What both operations report back */
8
- result: ReviewServiceResult;
9
- submitReview(submission: ReviewSubmission): Promise<ReviewServiceResult>;
10
- deleteReview(deletion: ReviewDeletion): Promise<ReviewServiceResult>;
11
- }
12
- //# sourceMappingURL=mock-review-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-review-service.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-review-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,WAAW,CAAC;AAEnB,qBAAa,iBAAkB,YAAW,sBAAsB;IAC9D,iDAAiD;IACjD,WAAW,EAAE,gBAAgB,EAAE,CAAM;IAErC,iDAAiD;IACjD,SAAS,EAAE,cAAc,EAAE,CAAM;IAEjC,uCAAuC;IACvC,MAAM,EAAE,mBAAmB,CAAqB;IAE1C,YAAY,CAChB,UAAU,EAAE,gBAAgB,GAC3B,OAAO,CAAC,mBAAmB,CAAC;IAKzB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAI3E"}
@@ -1,19 +0,0 @@
1
- export class MockReviewService {
2
- constructor() {
3
- /** Submissions the form handed over, in order */
4
- this.submissions = [];
5
- /** Deletions the review handed over, in order */
6
- this.deletions = [];
7
- /** What both operations report back */
8
- this.result = { success: true };
9
- }
10
- async submitReview(submission) {
11
- this.submissions.push(submission);
12
- return this.result;
13
- }
14
- async deleteReview(deletion) {
15
- this.deletions.push(deletion);
16
- return this.result;
17
- }
18
- }
19
- //# sourceMappingURL=mock-review-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-review-service.js","sourceRoot":"","sources":["../../../../../src/elements/ia-reviews/mocks/mock-review-service.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IAA9B;QACE,iDAAiD;QACjD,gBAAW,GAAuB,EAAE,CAAC;QAErC,iDAAiD;QACjD,cAAS,GAAqB,EAAE,CAAC;QAEjC,uCAAuC;QACvC,WAAM,GAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAalD,CAAC;IAXC,KAAK,CAAC,YAAY,CAChB,UAA4B;QAE5B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAwB;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF","sourcesContent":["import type {\n ReviewDeletion,\n ReviewServiceInterface,\n ReviewServiceResult,\n ReviewSubmission,\n} from '../models';\n\nexport class MockReviewService implements ReviewServiceInterface {\n /** Submissions the form handed over, in order */\n submissions: ReviewSubmission[] = [];\n\n /** Deletions the review handed over, in order */\n deletions: ReviewDeletion[] = [];\n\n /** What both operations report back */\n result: ReviewServiceResult = { success: true };\n\n async submitReview(\n submission: ReviewSubmission,\n ): Promise<ReviewServiceResult> {\n this.submissions.push(submission);\n return this.result;\n }\n\n async deleteReview(deletion: ReviewDeletion): Promise<ReviewServiceResult> {\n this.deletions.push(deletion);\n return this.result;\n }\n}\n"]}