web/elements: fix token copy error in safari
closes #1219 Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -7,12 +7,11 @@ import { SpinnerButton } from "./SpinnerButton"; | |||||||
| @customElement("ak-action-button") | @customElement("ak-action-button") | ||||||
| export class ActionButton extends SpinnerButton { | export class ActionButton extends SpinnerButton { | ||||||
|     @property({ attribute: false }) |     @property({ attribute: false }) | ||||||
|     // eslint-disable-next-line @typescript-eslint/no-explicit-any |     apiRequest: () => Promise<unknown> = () => { | ||||||
|     apiRequest: () => Promise<any> = () => { |  | ||||||
|         throw new Error(); |         throw new Error(); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     callAction = (): Promise<void> => { |     callAction = (): Promise<unknown> => { | ||||||
|         this.setLoading(); |         this.setLoading(); | ||||||
|         return this.apiRequest().catch((e: Error | Response) => { |         return this.apiRequest().catch((e: Error | Response) => { | ||||||
|             if (e instanceof Error) { |             if (e instanceof Error) { | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ export class SpinnerButton extends LitElement { | |||||||
|     isRunning = false; |     isRunning = false; | ||||||
|  |  | ||||||
|     @property() |     @property() | ||||||
|     callAction?: () => Promise<void>; |     callAction?: () => Promise<unknown>; | ||||||
|  |  | ||||||
|     static get styles(): CSSResult[] { |     static get styles(): CSSResult[] { | ||||||
|         return [ |         return [ | ||||||
|  | |||||||
| @ -1,9 +1,11 @@ | |||||||
|  | import { html, TemplateResult } from "lit"; | ||||||
| import { customElement, property } from "lit/decorators"; | import { customElement, property } from "lit/decorators"; | ||||||
|  |  | ||||||
| import { CoreApi } from "@goauthentik/api"; | import { CoreApi } from "@goauthentik/api"; | ||||||
|  |  | ||||||
| import { DEFAULT_CONFIG } from "../../api/Config"; | import { DEFAULT_CONFIG } from "../../api/Config"; | ||||||
| import { ERROR_CLASS, SECONDARY_CLASS, SUCCESS_CLASS } from "../../constants"; | import { ERROR_CLASS, SECONDARY_CLASS, SUCCESS_CLASS } from "../../constants"; | ||||||
|  | import { PFSize } from "../Spinner"; | ||||||
| import { ActionButton } from "./ActionButton"; | import { ActionButton } from "./ActionButton"; | ||||||
|  |  | ||||||
| @customElement("ak-token-copy-button") | @customElement("ak-token-copy-button") | ||||||
| @ -27,21 +29,58 @@ export class TokenCopyButton extends ActionButton { | |||||||
|                 if (!token.key) { |                 if (!token.key) { | ||||||
|                     return Promise.reject(); |                     return Promise.reject(); | ||||||
|                 } |                 } | ||||||
|                 return navigator.clipboard.writeText(token.key).then(() => { |                 setTimeout(() => { | ||||||
|                     this.buttonClass = SUCCESS_CLASS; |                     this.buttonClass = SECONDARY_CLASS; | ||||||
|                     setTimeout(() => { |                 }, 1500); | ||||||
|                         this.buttonClass = SECONDARY_CLASS; |                 this.buttonClass = SUCCESS_CLASS; | ||||||
|                     }, 1500); |                 return token.key; | ||||||
|                 }); |  | ||||||
|             }) |             }) | ||||||
|             .catch((err: Response | undefined) => { |             .catch((err: Error | Response | undefined) => { | ||||||
|                 this.buttonClass = ERROR_CLASS; |                 this.buttonClass = ERROR_CLASS; | ||||||
|                 return err?.json().then((errResp) => { |                 if (err instanceof Error) { | ||||||
|                     throw new Error(errResp["detail"]); |  | ||||||
|                     setTimeout(() => { |                     setTimeout(() => { | ||||||
|                         this.buttonClass = SECONDARY_CLASS; |                         this.buttonClass = SECONDARY_CLASS; | ||||||
|                     }, 1500); |                     }, 1500); | ||||||
|  |                     throw err; | ||||||
|  |                 } | ||||||
|  |                 return err?.json().then((errResp) => { | ||||||
|  |                     setTimeout(() => { | ||||||
|  |                         this.buttonClass = SECONDARY_CLASS; | ||||||
|  |                     }, 1500); | ||||||
|  |                     throw new Error(errResp["detail"]); | ||||||
|                 }); |                 }); | ||||||
|             }); |             }); | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     render(): TemplateResult { | ||||||
|  |         return html`<button | ||||||
|  |             class="pf-c-button pf-m-progress ${this.classList.toString()}" | ||||||
|  |             @click=${() => { | ||||||
|  |                 if (this.isRunning === true) { | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 this.setLoading(); | ||||||
|  |                 navigator.clipboard.write([ | ||||||
|  |                     new ClipboardItem({ | ||||||
|  |                         "text/plain": (this.callAction() as Promise<string>) | ||||||
|  |                             .then((key: string) => { | ||||||
|  |                                 this.setDone(SUCCESS_CLASS); | ||||||
|  |                                 return key; | ||||||
|  |                             }) | ||||||
|  |                             .catch((err: Error) => { | ||||||
|  |                                 this.setDone(ERROR_CLASS); | ||||||
|  |                                 throw err; | ||||||
|  |                             }), | ||||||
|  |                     }), | ||||||
|  |                 ]); | ||||||
|  |             }} | ||||||
|  |         > | ||||||
|  |             ${this.isRunning | ||||||
|  |                 ? html`<span class="pf-c-button__progress"> | ||||||
|  |                       <ak-spinner size=${PFSize.Medium}></ak-spinner> | ||||||
|  |                   </span>` | ||||||
|  |                 : ""} | ||||||
|  |             <slot></slot> | ||||||
|  |         </button>`; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer