From 493e51fd14343141fdba2ed0a40a8acc9e66a337 Mon Sep 17 00:00:00 2001 From: Yunji Kim Date: Mon, 9 May 2022 10:29:18 +0900 Subject: [PATCH 1/3] Improve dynamic loading of script --- src/loadPostcode.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/loadPostcode.ts b/src/loadPostcode.ts index dfd4026..e6e6bcf 100644 --- a/src/loadPostcode.ts +++ b/src/loadPostcode.ts @@ -121,11 +121,12 @@ export interface Postcode { const loadPostcode = (function () { const scriptId = 'daum_postcode_script'; + let promise: Promise | null = null; + return function (url: string): Promise { - const isScriptExist = !!document.getElementById(scriptId); - if (isScriptExist) return Promise.resolve(window.daum.Postcode); + if( promise ) return promise; - return new Promise((resolve, reject) => { + promise = new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = url; script.onload = () => { @@ -138,7 +139,9 @@ const loadPostcode = (function () { script.onerror = (error) => reject(error); script.id = scriptId; document.body.appendChild(script); - }); + }) + + return promise; }; })(); From ae30f913586a4caf5d9a2ac619063cb5840e2704 Mon Sep 17 00:00:00 2001 From: Yunji Kim Date: Mon, 9 May 2022 13:43:46 +0900 Subject: [PATCH 2/3] Add console.error when error occured during mount --- src/DaumPostcode.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/DaumPostcode.tsx b/src/DaumPostcode.tsx index 85a6cbd..78d85d3 100644 --- a/src/DaumPostcode.tsx +++ b/src/DaumPostcode.tsx @@ -82,7 +82,8 @@ class DaumPostcode extends Component { postcode.embed(this.wrap.current, { q: defaultQuery, autoClose: autoClose }); }; - onError = () => { + onError = (e: unknown) => { + console.error(e); this.setState({ hasError: true }); }; From 9eadc0b762b26915dda1c80b5dc97f82a7db9276 Mon Sep 17 00:00:00 2001 From: Yunji Kim Date: Sat, 14 May 2022 20:18:42 +0900 Subject: [PATCH 3/3] Fix Postcode type definitions to optional in window --- src/DaumPostcode.tsx | 4 ++-- src/loadPostcode.ts | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/DaumPostcode.tsx b/src/DaumPostcode.tsx index 78d85d3..5012468 100644 --- a/src/DaumPostcode.tsx +++ b/src/DaumPostcode.tsx @@ -1,5 +1,5 @@ import React, { Component, createRef, CSSProperties } from 'react'; -import loadPostcode, { PostcodeOptions } from './loadPostcode'; +import loadPostcode, { PostcodeConstructor, PostcodeOptions } from './loadPostcode'; export interface DaumPostcodeProps extends Omit { onComplete?: PostcodeOptions['oncomplete']; @@ -48,7 +48,7 @@ class DaumPostcode extends Component { loadPostcode(scriptUrl).then(initiate).catch(onError); } - initiate = (Postcode: typeof window.daum.Postcode) => { + initiate = (Postcode: PostcodeConstructor) => { if (!this.wrap.current) return; const { scriptUrl, diff --git a/src/loadPostcode.ts b/src/loadPostcode.ts index e6e6bcf..eeb092e 100644 --- a/src/loadPostcode.ts +++ b/src/loadPostcode.ts @@ -1,14 +1,12 @@ declare global { interface Window { - daum: { - postcode: { + daum?: { + postcode?: { load: (fn: () => void) => void; version: string; _validParam_: boolean; }; - Postcode: { - new (postcodeOptions: PostcodeOptions): Postcode; - }; + Postcode?: PostcodeConstructor; }; } } @@ -114,6 +112,10 @@ export interface EmbedOptions { autoClose?: boolean; } +export interface PostcodeConstructor { + new (postcodeOptions: PostcodeOptions): Postcode; +} + export interface Postcode { open(openOptions?: OpenOptions): void; embed(element: HTMLElement, embedOptions?: EmbedOptions): void; @@ -121,20 +123,19 @@ export interface Postcode { const loadPostcode = (function () { const scriptId = 'daum_postcode_script'; - let promise: Promise | null = null; + let promise: Promise | null = null; - return function (url: string): Promise { + return function (url: string): Promise { if( promise ) return promise; promise = new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = url; script.onload = () => { - try { - resolve(window.daum.Postcode); - } catch (e) { - reject(e); + if( window?.daum?.Postcode ) { + return resolve(window.daum.Postcode); } + reject(new Error('Script is loaded successfully, but cannot find Postcode module. Check your scriptURL property.')) }; script.onerror = (error) => reject(error); script.id = scriptId;