zignal-stencil-library 1.1.112 → 1.1.114
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.
- package/dist/cjs/autocomplete-address_43.cjs.entry.js +165 -96
- package/dist/cjs/quick-message-app.cjs.entry.js +1 -1
- package/dist/cjs/quick-message-app.entry.cjs.js.map +1 -1
- package/dist/collection/components/autocomplete-address/autocomplete-address.css +1 -1
- package/dist/collection/components/autocomplete-multiple-select/autocomplete-multiple-select.css +1 -1
- package/dist/collection/components/autocomplete-select/autocomplete-select.css +1 -1
- package/dist/collection/components/channel-box/channel-box.css +1 -1
- package/dist/collection/components/chat-app/chat-app.css +1 -1
- package/dist/collection/components/chat-header/chat-header.css +1 -1
- package/dist/collection/components/chat-input/chat-input.css +1 -1
- package/dist/collection/components/chat-input/chat-input.js +1 -1
- package/dist/collection/components/chat-input/chat-input.js.map +1 -1
- package/dist/collection/components/checkbox-list/checkbox-list.css +1 -1
- package/dist/collection/components/dialog-bill-editor/dialog-bill-editor.css +1 -1
- package/dist/collection/components/dialog-editor/dialog-editor.css +1 -1
- package/dist/collection/components/dialog-preview-media/dialog-preview-media.css +1 -1
- package/dist/collection/components/dialog-search/dialog-search.css +1 -1
- package/dist/collection/components/menu-chat-channel/menu-chat-channel.css +1 -1
- package/dist/collection/components/menu-chat-type/menu-chat-type.css +1 -1
- package/dist/collection/components/menu-list/menu-list.css +1 -1
- package/dist/collection/components/message-box/message-box.css +1 -1
- package/dist/collection/components/message-content/message-content.css +1 -1
- package/dist/collection/components/message-item/message-item.css +1 -1
- package/dist/collection/components/message-media/message-media.css +1 -1
- package/dist/collection/components/profile-history/profile-history.css +1 -1
- package/dist/collection/components/profile-info/profile-info.css +1 -1
- package/dist/collection/components/profile-media/profile-media.css +1 -1
- package/dist/collection/components/profile-tabs/profile-tabs.css +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-add-template.css +1 -1
- package/dist/collection/components/quick-message-app/quick-message-app.css +1 -1
- package/dist/collection/components/quick-message-file/quick-message-file.css +1 -1
- package/dist/collection/components/quick-message-image/quick-message-image.css +1 -1
- package/dist/collection/components/quick-message-modal/quick-message-modal.css +1 -1
- package/dist/collection/components/quick-message-template/quick-message-template.css +1 -1
- package/dist/collection/components/search-box/search-box.css +1 -1
- package/dist/collection/components/status-badge/status-badge.css +1 -1
- package/dist/collection/components/tag-list/tag-list.css +1 -1
- package/dist/collection/components/tag-or-status-item/tag-or-status-item.css +1 -1
- package/dist/collection/components/tag-popper/tag-popper.css +1 -1
- package/dist/collection/components/typography-clamp/typography-clamp.css +1 -1
- package/dist/collection/components/z-avatar/z-avatar.css +1 -1
- package/dist/collection/components/z-dialog/z-dialog.css +1 -1
- package/dist/components/autocomplete-address.js +1 -1
- package/dist/components/autocomplete-multiple-select.js +1 -1
- package/dist/components/autocomplete-select.js +1 -1
- package/dist/components/channel-box.js +1 -1
- package/dist/components/chat-app.js +40 -40
- package/dist/components/chat-app.js.map +1 -1
- package/dist/components/chat-header.js +1 -1
- package/dist/components/chat-input.js +1 -1
- package/dist/components/checkbox-list.js +1 -1
- package/dist/components/dialog-bill-editor.js +1 -1
- package/dist/components/dialog-editor.js +1 -1
- package/dist/components/dialog-preview-media.js +1 -1
- package/dist/components/dialog-search.js +1 -1
- package/dist/components/menu-chat-channel.js +1 -1
- package/dist/components/menu-chat-type.js +1 -1
- package/dist/components/menu-list.js +1 -1
- package/dist/components/message-box.js +1 -1
- package/dist/components/message-content.js +1 -1
- package/dist/components/message-item.js +1 -1
- package/dist/components/message-media.js +1 -1
- package/dist/components/{p-BlPbmOUJ.js → p--m50OaqR.js} +11 -11
- package/dist/components/{p-BlPbmOUJ.js.map → p--m50OaqR.js.map} +1 -1
- package/dist/components/{p-Dtzhm5Pa.js → p-3t2ULKvn.js} +5 -5
- package/dist/components/{p-Dtzhm5Pa.js.map → p-3t2ULKvn.js.map} +1 -1
- package/dist/components/{p-DRC94y7I.js → p-5QPDcqLV.js} +4 -4
- package/dist/components/{p-DRC94y7I.js.map → p-5QPDcqLV.js.map} +1 -1
- package/dist/components/{p-C4fbtLks.js → p-B-DQMSNH.js} +3 -3
- package/dist/components/{p-C4fbtLks.js.map → p-B-DQMSNH.js.map} +1 -1
- package/dist/components/{p-Bt-g4GxB.js → p-B2u057C4.js} +3 -3
- package/dist/components/{p-Bt-g4GxB.js.map → p-B2u057C4.js.map} +1 -1
- package/dist/components/{p-odaejdwA.js → p-BBzb0UrZ.js} +13 -13
- package/dist/components/{p-odaejdwA.js.map → p-BBzb0UrZ.js.map} +1 -1
- package/dist/components/{p-CiMfB3dP.js → p-BLI0eD_8.js} +3 -3
- package/dist/components/{p-CiMfB3dP.js.map → p-BLI0eD_8.js.map} +1 -1
- package/dist/components/{p-DUHqYYmX.js → p-BNiehTz-.js} +8 -8
- package/dist/components/{p-DUHqYYmX.js.map → p-BNiehTz-.js.map} +1 -1
- package/dist/components/{p-L97C6UYO.js → p-BQmnx9-0.js} +3 -3
- package/dist/components/{p-L97C6UYO.js.map → p-BQmnx9-0.js.map} +1 -1
- package/dist/components/{p-DFb_40q7.js → p-Bbm_pPzb.js} +4 -4
- package/dist/components/{p-DFb_40q7.js.map → p-Bbm_pPzb.js.map} +1 -1
- package/dist/components/{p-DJ2KkdwP.js → p-BnxxvUCy.js} +5 -5
- package/dist/components/{p-DJ2KkdwP.js.map → p-BnxxvUCy.js.map} +1 -1
- package/dist/components/{p-CB09ePCJ.js → p-BqirszEW.js} +4 -4
- package/dist/components/{p-CB09ePCJ.js.map → p-BqirszEW.js.map} +1 -1
- package/dist/components/{p-l6ffmvGW.js → p-BssEwLaN.js} +3 -3
- package/dist/components/{p-l6ffmvGW.js.map → p-BssEwLaN.js.map} +1 -1
- package/dist/components/{p-BLQ37Esu.js → p-BypBSjsX.js} +5 -5
- package/dist/components/{p-BLQ37Esu.js.map → p-BypBSjsX.js.map} +1 -1
- package/dist/components/{p-DtADJshZ.js → p-CI0T9mG3.js} +3 -3
- package/dist/components/{p-DtADJshZ.js.map → p-CI0T9mG3.js.map} +1 -1
- package/dist/components/{p-5S7W_s42.js → p-CYj5eGUx.js} +4 -4
- package/dist/components/{p-5S7W_s42.js.map → p-CYj5eGUx.js.map} +1 -1
- package/dist/components/{p-KedgTCA1.js → p-CcNDN7nL.js} +4 -4
- package/dist/components/{p-KedgTCA1.js.map → p-CcNDN7nL.js.map} +1 -1
- package/dist/components/{p-BpgguOkG.js → p-CeCnJD_t.js} +3 -3
- package/dist/components/{p-BpgguOkG.js.map → p-CeCnJD_t.js.map} +1 -1
- package/dist/components/{p-Bc8NC50u.js → p-Ch0k98MI.js} +8 -8
- package/dist/components/{p-Bc8NC50u.js.map → p-Ch0k98MI.js.map} +1 -1
- package/dist/components/{p-DkfO3Url.js → p-Cr_TwfMc.js} +3 -3
- package/dist/components/{p-DkfO3Url.js.map → p-Cr_TwfMc.js.map} +1 -1
- package/dist/components/{p-HxECzi7b.js → p-CsRXWqtl.js} +7 -7
- package/dist/components/{p-HxECzi7b.js.map → p-CsRXWqtl.js.map} +1 -1
- package/dist/components/{p-C5i_qaws.js → p-DEGiGqSE.js} +5 -5
- package/dist/components/{p-C5i_qaws.js.map → p-DEGiGqSE.js.map} +1 -1
- package/dist/components/{p-CZRPZKJ-.js → p-DFGwDaxI.js} +4 -4
- package/dist/components/{p-CZRPZKJ-.js.map → p-DFGwDaxI.js.map} +1 -1
- package/dist/components/{p-CZnSKQhh.js → p-DIaQ5vRT.js} +3 -3
- package/dist/components/{p-CZnSKQhh.js.map → p-DIaQ5vRT.js.map} +1 -1
- package/dist/components/{p-DdQFGe5w.js → p-DQ8HPG_K.js} +11 -11
- package/dist/components/{p-DdQFGe5w.js.map → p-DQ8HPG_K.js.map} +1 -1
- package/dist/components/{p-C_gF8T8r.js → p-DTU4M_6s.js} +8 -8
- package/dist/components/{p-C_gF8T8r.js.map → p-DTU4M_6s.js.map} +1 -1
- package/dist/components/{p-BB1RB9Dr.js → p-DTxusuTj.js} +3 -3
- package/dist/components/{p-BB1RB9Dr.js.map → p-DTxusuTj.js.map} +1 -1
- package/dist/components/{p-2QReMzO8.js → p-DUEwD6QB.js} +6 -6
- package/dist/components/{p-2QReMzO8.js.map → p-DUEwD6QB.js.map} +1 -1
- package/dist/components/{p-CS9zOcMw.js → p-DXJv_Q_2.js} +4 -4
- package/dist/components/{p-CS9zOcMw.js.map → p-DXJv_Q_2.js.map} +1 -1
- package/dist/components/{p-Bvoo3LWo.js → p-DYCfNJWj.js} +5 -5
- package/dist/components/{p-Bvoo3LWo.js.map → p-DYCfNJWj.js.map} +1 -1
- package/dist/components/{p-sa3XE9PE.js → p-DaCqDkRK.js} +17 -17
- package/dist/components/{p-sa3XE9PE.js.map → p-DaCqDkRK.js.map} +1 -1
- package/dist/components/{p-DD6xErUJ.js → p-DaIrHgbG.js} +17 -17
- package/dist/components/{p-DD6xErUJ.js.map → p-DaIrHgbG.js.map} +1 -1
- package/dist/components/{p-BLnHiJOJ.js → p-DaxSdUIk.js} +3 -3
- package/dist/components/{p-BLnHiJOJ.js.map → p-DaxSdUIk.js.map} +1 -1
- package/dist/components/{p-CqgrsdCk.js → p-DkisMbeq.js} +3 -3
- package/dist/components/{p-CqgrsdCk.js.map → p-DkisMbeq.js.map} +1 -1
- package/dist/components/{p-BQHu9-yW.js → p-DmwNXkXf.js} +3 -3
- package/dist/components/{p-BQHu9-yW.js.map → p-DmwNXkXf.js.map} +1 -1
- package/dist/components/{p-CO0rmAnj.js → p-DoZmi5ih.js} +3 -3
- package/dist/components/{p-CO0rmAnj.js.map → p-DoZmi5ih.js.map} +1 -1
- package/dist/components/{p-DIX7oTZv.js → p-Donkg0LL.js} +3 -3
- package/dist/components/{p-DIX7oTZv.js.map → p-Donkg0LL.js.map} +1 -1
- package/dist/components/{p-CRUuP7NU.js → p-Dp3EHSUO.js} +3 -3
- package/dist/components/{p-CRUuP7NU.js.map → p-Dp3EHSUO.js.map} +1 -1
- package/dist/components/{p-DakbQEWw.js → p-DpdkqWPQ.js} +20 -20
- package/dist/components/{p-DakbQEWw.js.map → p-DpdkqWPQ.js.map} +1 -1
- package/dist/components/{p-Cbmk_g-R.js → p-DyatyKQQ.js} +3 -3
- package/dist/components/{p-Cbmk_g-R.js.map → p-DyatyKQQ.js.map} +1 -1
- package/dist/components/{p-BdEkTr1V.js → p-Fr7xN81m.js} +9 -9
- package/dist/components/{p-BdEkTr1V.js.map → p-Fr7xN81m.js.map} +1 -1
- package/dist/components/{p-C2YAe0Ke.js → p-Heeo8D4P.js} +128 -59
- package/dist/components/p-Heeo8D4P.js.map +1 -0
- package/dist/components/{p-DXwuZde7.js → p-aEvNkqAt.js} +5 -5
- package/dist/components/{p-DXwuZde7.js.map → p-aEvNkqAt.js.map} +1 -1
- package/dist/components/profile-history.js +1 -1
- package/dist/components/profile-info.js +1 -1
- package/dist/components/profile-media.js +1 -1
- package/dist/components/profile-tabs.js +1 -1
- package/dist/components/quick-message-add-template.js +1 -1
- package/dist/components/quick-message-app.js +6 -6
- package/dist/components/quick-message-app.js.map +1 -1
- package/dist/components/quick-message-file.js +1 -1
- package/dist/components/quick-message-image.js +1 -1
- package/dist/components/quick-message-modal.js +1 -1
- package/dist/components/quick-message-template.js +1 -1
- package/dist/components/search-box.js +1 -1
- package/dist/components/status-badge.js +1 -1
- package/dist/components/summarize-message-section.js +1 -1
- package/dist/components/tag-list.js +1 -1
- package/dist/components/tag-or-status-item.js +1 -1
- package/dist/components/tag-popper.js +1 -1
- package/dist/components/typography-clamp.js +1 -1
- package/dist/components/user-info-section.js +1 -1
- package/dist/components/z-avatar.js +1 -1
- package/dist/components/z-dialog.js +1 -1
- package/dist/esm/autocomplete-address_43.entry.js +165 -96
- package/dist/esm/quick-message-app.entry.js +1 -1
- package/dist/esm/quick-message-app.entry.js.map +1 -1
- package/dist/zignal-stencil-library/p-1a660578.entry.js +2 -0
- package/dist/zignal-stencil-library/{p-4b0cf474.entry.js.map → p-1a660578.entry.js.map} +1 -1
- package/dist/zignal-stencil-library/{p-2fcff9fe.entry.js → p-548e9d88.entry.js} +3 -3
- package/dist/zignal-stencil-library/p-548e9d88.entry.js.map +1 -0
- package/dist/zignal-stencil-library/quick-message-app.entry.esm.js.map +1 -1
- package/dist/zignal-stencil-library/zignal-stencil-library.esm.js +1 -1
- package/package.json +3 -3
- package/dist/components/p-C2YAe0Ke.js.map +0 -1
- package/dist/zignal-stencil-library/p-2fcff9fe.entry.js.map +0 -1
- package/dist/zignal-stencil-library/p-4b0cf474.entry.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"p-Dtzhm5Pa.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement","showErrorDialog"],"sources":["src/components/quick-message-file/quick-message-file.css?tag=quick-message-file","src/components/quick-message-file/quick-message-file.tsx"],"sourcesContent":[":host {\n position: relative;\n}\n\n.quick-message-file__icon {\n background: var(--quick-modal-primary-ghost);\n color: var(--quick-modal-primary);\n}\n\n.quick-message-file__action-button {\n border: 1px solid rgba(148, 163, 184, 0.4);\n background: transparent;\n}\n\n.quick-message-file__send {\n background: var(--quick-modal-primary);\n color: #fff;\n border: none;\n}\n\n.quick-message-file__list-more-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n border-radius: 0.5rem;\n border: none;\n background: transparent;\n color: inherit;\n cursor: pointer;\n margin-left: auto;\n}\n\n.quick-message-file__list-more-button:hover {\n background: rgba(148, 163, 184, 0.12);\n}\n\n.quick-message-file__menu-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n}\n\n.quick-message-file__menu {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n display: flex;\n flex-direction: column;\n min-width: 8rem;\n padding: 0.25rem 0;\n border-radius: 0.75rem;\n border: 1px solid rgba(148, 163, 184, 0.18);\n box-shadow: 0 16px 30px rgba(15, 23, 42, 0.2);\n z-index: 40;\n overflow: hidden;\n}\n\n.quick-message-file__menu-item {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 0.9rem;\n border: none;\n background: transparent;\n color: inherit;\n font-size: 0.8125rem;\n line-height: 1.2;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.2s ease;\n}\n\n.quick-message-file__menu-item:hover {\n background: rgba(148, 163, 184, 0.14);\n}\n\n.quick-message-file__menu-item--danger {\n color: #ef4444;\n}\n\n.quick-message-file__menu-item--danger:hover {\n background: rgba(239, 68, 68, 0.12);\n}\n\n.quick-message-file__rename-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(15, 23, 42, 0.45);\n padding: 1.5rem;\n z-index: 20;\n}\n\n.quick-message-file__rename-modal {\n width: 100%;\n max-width: 22rem;\n border-radius: 0.75rem;\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.25);\n padding: 1.5rem;\n}\n\n.quick-message-file__rename-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n\n.quick-message-file__rename-close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: inherit;\n border-radius: 0.5rem;\n padding: 0.25rem;\n cursor: pointer;\n}\n\n.quick-message-file__rename-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.quick-message-file__rename-cancel,\n.quick-message-file__rename-save {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 0.35rem 0.9rem;\n border: none;\n cursor: pointer;\n transition: opacity 0.2s ease;\n}\n\n.quick-message-file__rename-cancel {\n background: transparent;\n color: inherit;\n border: 1px solid rgba(148, 163, 184, 0.4);\n}\n\n.quick-message-file__rename-save {\n background: var(--quick-modal-primary);\n color: #fff;\n}\n\n.quick-message-file__rename-save:disabled,\n.quick-message-file__rename-cancel:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.quick-message-file__rename-input-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n border-radius: 0.75rem;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.quick-message-file__rename-input-row:focus-within {\n border-color: var(--quick-modal-primary);\n box-shadow: 0 0 0 1px var(--quick-modal-primary);\n}\n\n.quick-message-file__rename-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.35rem 0;\n font-size: 0.875rem;\n color: inherit;\n}\n\n.quick-message-file__rename-input:focus {\n outline: none;\n}\n\n.quick-message-file__rename-extension {\n font-size: 0.875rem;\n font-weight: 500;\n color: inherit;\n opacity: 0.75;\n white-space: nowrap;\n}\n","import { Component, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport dayjs from 'dayjs';\nimport { createQuickMessageLibraryFiles, deleteQuickMessageLibraryFile, getQuickMessageLibraryFiles, updateQuickMessageLibraryFileName } from '../../api/quick-message';\nimport type { QuickMessageLibraryFilePayload } from '../../api/type';\nimport { QuickMessageLibraryFile } from '../../store/type';\nimport { configStore } from '../../store/store';\nimport { useTranslation } from '../../utils/utils';\nimport { Icon } from '../internal-component/icon';\nimport { uploadFile } from '../../utils/upload';\nimport { DIALOG_TYPE, handleError as showErrorDialog, openDialog } from '../../store/dialog';\n\n@Component({\n tag: 'quick-message-file',\n styleUrl: 'quick-message-file.css',\n})\nexport class QuickMessageFileComponent {\n @Prop() handleClose?: () => void;\n @Prop() value?: string | QuickMessageLibraryFile[];\n @Prop() isMaster: boolean = false;\n\n @State() private searchFile = '';\n @State() private files: QuickMessageLibraryFile[] = [];\n @State() private isLoading = false;\n @State() private isLoadingMore = false;\n @State() private isUploading = false;\n @State() private isDeleting = false;\n @State() private totalFiles = 0;\n @State() private totalPages = 0;\n @State() private renameTargetId: string | null = null;\n @State() private renameName = '';\n @State() private renameExtension = '';\n @State() private isRenaming = false;\n @State() private openMenuId: string | null = null;\n\n private readonly allowedFileExtensions = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'csv', 'zip', 'rar', '7z'];\n private readonly pageSize = 15;\n private readonly localUploadPrefix = 'uploaded-file-';\n private page = 1;\n private currentSearch = '';\n\n private fileInput?: HTMLInputElement;\n @Event({ bubbles: true, composed: true }) filesChange!: EventEmitter<QuickMessageLibraryFile[]>;\n @Event({ bubbles: true, composed: true }) sendFiles!: EventEmitter<QuickMessageLibraryFile[]>;\n\n private pendingDeleteFileIds: string[] = [];\n\n // Memoization cache for filtered files\n private cachedFilteredFiles: QuickMessageLibraryFile[] | null = null;\n private cachedSearchTerm: string = '';\n private cachedFilesLength: number = 0;\n\n @Listen('click', { target: 'document' })\n protected handleDocumentClick(event: Event) {\n const target = event.target as HTMLElement | null;\n\n if (target?.closest('[data-quick-message-file-menu-root]')) {\n return;\n }\n\n this.openMenuId = null;\n }\n\n componentWillLoad() {\n this.syncFilesFromProp(this.value);\n }\n\n async componentDidLoad() {\n await this.fetchFiles({ reset: true });\n }\n\n @Watch('value')\n protected handleValueChange(newValue?: string | QuickMessageLibraryFile[]) {\n this.syncFilesFromProp(newValue);\n }\n\n private syncFilesFromProp(value?: string | QuickMessageLibraryFile[]) {\n if (value === undefined || value === null) {\n this.setFiles([], false);\n return;\n }\n\n const parsed = this.parseFilesValue(value);\n this.setFiles(parsed, false);\n }\n\n private parseFilesValue(value: string | QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n if (typeof value === 'string') {\n try {\n const deserialized = JSON.parse(value) as QuickMessageLibraryFile[];\n return this.cloneFiles(deserialized);\n } catch (error: unknown) {\n console.warn('[quick-message-file] Failed to parse files value', error);\n return [];\n }\n }\n\n return this.cloneFiles(value);\n }\n\n private cloneFiles(files: QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n return (files || []).map(file => ({\n ...file,\n isSelected: file.isSelected ?? false,\n }));\n }\n\n private setFiles(next: QuickMessageLibraryFile[], shouldEmit = true) {\n this.files = next;\n if (shouldEmit) {\n const payload = this.cloneFiles(next);\n this.filesChange.emit(payload);\n }\n }\n\n private isLocalUpload(file: QuickMessageLibraryFile): boolean {\n return file.id.startsWith(this.localUploadPrefix);\n }\n\n private getRemoteFileCount(): number {\n return this.files.filter(file => !this.isLocalUpload(file)).length;\n }\n\n private mergeFetchedFiles(fetched: QuickMessageLibraryFile[], reset: boolean): QuickMessageLibraryFile[] {\n const localUploads = this.files.filter(file => this.isLocalUpload(file));\n const selectionMap = new Map(this.files.map(file => [file.id, file.isSelected ?? false]));\n\n const normalizedFetched = fetched.map(file => ({\n ...file,\n isSelected: selectionMap.get(file.id) ?? file.isSelected ?? false,\n }));\n\n if (reset) {\n return [...localUploads, ...normalizedFetched];\n }\n\n const existingRemote = this.files.filter(file => !this.isLocalUpload(file));\n const remoteIndexMap = new Map<string, number>();\n existingRemote.forEach((file, index) => {\n remoteIndexMap.set(file.id, index);\n });\n\n const nextRemote = [...existingRemote];\n normalizedFetched.forEach(file => {\n const existingIndex = remoteIndexMap.get(file.id);\n if (existingIndex !== undefined) {\n nextRemote[existingIndex] = file;\n } else {\n remoteIndexMap.set(file.id, nextRemote.length);\n nextRemote.push(file);\n }\n });\n\n return [...localUploads, ...nextRemote];\n }\n\n /**\n * Memoized file filtering - only recalculates when search term or files change\n * Performance: Reduces operations from 60fps to only when user types\n */\n private filterFiles(): QuickMessageLibraryFile[] {\n const search = this.searchFile.trim().toLowerCase();\n\n // Quick return for no search\n if (!search) return this.files;\n\n // Check if we can use cached results\n if (this.cachedFilteredFiles && search === this.cachedSearchTerm && this.files.length === this.cachedFilesLength) {\n return this.cachedFilteredFiles;\n }\n\n // Recalculate filtered results\n const filtered = this.files.filter(file => file.name.toLowerCase().includes(search));\n\n // Update cache\n this.cachedFilteredFiles = filtered;\n this.cachedSearchTerm = search;\n this.cachedFilesLength = this.files.length;\n\n return filtered;\n }\n\n private splitFileName(name: string): { base: string; extension: string } {\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex <= 0 || lastDotIndex === name.length - 1) {\n return { base: name, extension: '' };\n }\n\n return {\n base: name.slice(0, lastDotIndex),\n extension: name.slice(lastDotIndex),\n };\n }\n\n private getRenameTarget(): QuickMessageLibraryFile | undefined {\n if (!this.renameTargetId) {\n return undefined;\n }\n\n return this.files.find(file => file.id === this.renameTargetId);\n }\n\n private openRenameModal(file: QuickMessageLibraryFile, event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n\n const { base, extension } = this.splitFileName(file.name);\n this.renameTargetId = file.id;\n this.renameName = base;\n this.renameExtension = extension;\n }\n\n private closeRenameModal(force = false) {\n if (this.isRenaming && !force) {\n return;\n }\n\n this.renameTargetId = null;\n this.renameName = '';\n this.renameExtension = '';\n }\n\n private toggleMenu(fileId: string, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.openMenuId = this.openMenuId === fileId ? null : fileId;\n }\n\n private closeMenu() {\n this.openMenuId = null;\n }\n\n private handleMenuRename(file: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.closeMenu();\n this.openRenameModal(file, event);\n }\n\n private requestDeleteFile(file: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isDeleting) {\n return;\n }\n\n this.pendingDeleteFileIds = [file.id];\n this.closeMenu();\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_item_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedFiles();\n },\n onCloseDialog: () => {\n this.pendingDeleteFileIds = [];\n },\n });\n }\n\n private handleRenameInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n\n if (this.renameExtension && value.toLowerCase().endsWith(this.renameExtension.toLowerCase())) {\n this.renameName = value.slice(0, -this.renameExtension.length);\n return;\n }\n\n this.renameName = value;\n }\n\n private async handleRenameSubmit(event: Event) {\n event.preventDefault();\n\n const target = this.getRenameTarget();\n\n if (!target) {\n return;\n }\n\n const trimmedBase = this.renameName.trim();\n\n if (!trimmedBase) {\n return;\n }\n\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n\n if (nextName === target.name) {\n this.closeRenameModal(true);\n return;\n }\n\n if (this.isLocalUpload(target)) {\n this.setFiles(\n this.files.map(file =>\n file.id === target.id\n ? {\n ...file,\n name: nextName,\n }\n : file,\n ),\n );\n\n this.closeRenameModal(true);\n return;\n }\n\n this.isRenaming = true;\n\n try {\n const updated = await updateQuickMessageLibraryFileName({ id: target.id, name: nextName });\n this.setFiles(\n this.files.map(file =>\n file.id === target.id\n ? {\n ...file,\n name: updated.name,\n last_updated_at: updated.last_updated_at,\n last_updated_by: updated.last_updated_by,\n }\n : file,\n ),\n );\n this.closeRenameModal(true);\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to rename file');\n } finally {\n this.isRenaming = false;\n }\n }\n\n private toggleFileSelection(id: string) {\n this.setFiles(this.files.map(file => (file.id === id ? { ...file, isSelected: !file.isSelected } : file)));\n }\n\n private toggleSelectAllFiles() {\n const isAllSelected = this.files.length > 0 && this.files.every(file => file.isSelected);\n this.setFiles(this.files.map(file => ({ ...file, isSelected: !isAllSelected })));\n }\n\n private triggerFileUpload() {\n this.fileInput?.click();\n }\n\n private handleFileSelection(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const validFiles = Array.from(input.files).filter(file => {\n const extension = file.name.split('.').pop()?.toLowerCase();\n return extension && this.allowedFileExtensions.includes(extension);\n });\n\n input.value = '';\n\n if (validFiles.length === 0) {\n return;\n }\n\n void this.uploadAndCreateFiles(validFiles);\n }\n\n private async uploadAndCreateFiles(files: File[]) {\n if (files.length === 0) {\n return;\n }\n\n this.isUploading = true;\n\n try {\n const payload: QuickMessageLibraryFilePayload[] = [];\n\n for (const file of files) {\n const uploadUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-library/file',\n });\n\n if (!uploadUrl) {\n continue;\n }\n\n payload.push({\n file_type: 'file',\n name: file.name,\n url: uploadUrl,\n size: file.size,\n });\n }\n\n if (payload.length > 0) {\n await createQuickMessageLibraryFiles({ files: payload });\n await this.fetchFiles({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to upload files');\n } finally {\n this.isUploading = false;\n }\n }\n\n private renderFileMeta(size: number, createdAt: string, t: (key: string, values?: Record<string, string>) => string) {\n const sizeKb = Math.round(size / 1024);\n return `${sizeKb} KB · ${t('quick_message.created_at').replace('{date}', dayjs(createdAt).tz().format('DD/MM/YYYY HH:mm'))}`;\n }\n\n private handleSendFiles() {\n const selected = this.files.filter(file => file.isSelected);\n if (selected.length === 0) return;\n const payload = this.cloneFiles(selected);\n this.sendFiles.emit(payload);\n this.handleClose?.();\n }\n\n private requestDeleteSelectedFiles() {\n if (this.isDeleting) {\n return;\n }\n\n const selectedIds = this.files.filter(file => file.isSelected).map(file => file.id);\n\n if (selectedIds.length === 0) {\n return;\n }\n\n this.pendingDeleteFileIds = selectedIds;\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_selected_items_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedFiles();\n },\n onCloseDialog: () => {\n this.pendingDeleteFileIds = [];\n },\n });\n }\n\n private async confirmDeleteSelectedFiles() {\n if (this.isDeleting) {\n return;\n }\n\n const pendingIds = [...this.pendingDeleteFileIds];\n this.pendingDeleteFileIds = [];\n\n if (pendingIds.length === 0) {\n return;\n }\n\n const pendingSet = new Set(pendingIds);\n const remoteIds = this.files.filter(file => pendingSet.has(file.id) && !this.isLocalUpload(file)).map(file => file.id);\n\n this.isDeleting = true;\n\n try {\n if (remoteIds.length > 0) {\n await deleteQuickMessageLibraryFile({ ids: remoteIds });\n }\n\n const remaining = this.files.filter(file => !pendingSet.has(file.id));\n this.setFiles(remaining);\n\n if (remoteIds.length > 0) {\n this.totalFiles = Math.max(0, this.totalFiles - remoteIds.length);\n await this.fetchFiles({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to delete files');\n } finally {\n this.isDeleting = false;\n }\n }\n\n private async fetchFiles({ search, reset = true }: { search?: string; reset?: boolean } = {}) {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n return;\n }\n\n if (reset ? this.isLoading : this.isLoadingMore) {\n return;\n }\n\n const searchSource = search !== undefined ? search : reset ? this.searchFile : this.currentSearch;\n const trimmedSearch = searchSource?.trim() ?? '';\n const nextPage = reset ? 1 : this.page + 1;\n\n if (search !== undefined) {\n this.searchFile = searchSource ?? '';\n }\n\n if (reset) {\n this.isLoading = true;\n } else {\n this.isLoadingMore = true;\n }\n\n try {\n const response = await getQuickMessageLibraryFiles({\n fileType: 'file',\n search: trimmedSearch ? trimmedSearch : undefined,\n page: nextPage,\n limit: this.pageSize,\n });\n\n const fetched = this.cloneFiles(response.files || []);\n const merged = this.mergeFetchedFiles(fetched, reset);\n\n this.page = response.page > 0 ? response.page : nextPage;\n const resolvedTotalPages = response.total_pages > 0 ? response.total_pages : fetched.length > 0 ? 1 : 0;\n this.totalPages = resolvedTotalPages;\n this.totalFiles = typeof response.total === 'number' ? response.total : fetched.length;\n this.currentSearch = trimmedSearch;\n\n this.setFiles(merged);\n } catch (error: unknown) {\n console.error('[quick-message-file] Failed to fetch files', error);\n } finally {\n if (reset) {\n this.isLoading = false;\n } else {\n this.isLoadingMore = false;\n }\n }\n }\n\n private async loadMoreFiles() {\n if (this.isLoading || this.isLoadingMore) {\n return;\n }\n\n if (this.totalPages === 0 || this.page >= this.totalPages) {\n return;\n }\n\n if (this.totalFiles > 0) {\n const remoteCount = this.getRemoteFileCount();\n if (remoteCount >= this.totalFiles) {\n return;\n }\n }\n\n await this.fetchFiles({ reset: false });\n }\n\n private handleScroll(event: Event) {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return;\n }\n\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining < 160) {\n void this.loadMoreFiles();\n }\n }\n\n private handleSearchInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n this.searchFile = value;\n\n if (!value.trim() && this.currentSearch && !this.isLoading && !this.isLoadingMore) {\n void this.fetchFiles({ search: '', reset: true });\n }\n }\n\n private async handleSearchSubmit(event?: Event) {\n event?.preventDefault();\n await this.fetchFiles({ search: this.searchFile, reset: true });\n }\n\n private clearSearch() {\n if (!this.searchFile) {\n return;\n }\n\n this.searchFile = '';\n if (this.currentSearch) {\n void this.fetchFiles({ search: '', reset: true });\n }\n }\n\n private renderRenameModal(theme: string, labels: { renameLabel: string; nameLabel: string; saveLabel: string; cancelLabel: string; closeLabel: string }) {\n const target = this.getRenameTarget();\n\n if (!this.renameTargetId || !target) {\n return null;\n }\n\n const trimmedBase = this.renameName.trim();\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n const isSaveDisabled = this.isRenaming || trimmedBase.length === 0 || nextName === target.name;\n const inputId = `quick-message-file-rename-${target.id}`;\n\n return (\n <div class=\"quick-message-file__rename-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"quick-message-file-rename-title\" onClick={() => this.closeRenameModal()}>\n <div class={`quick-message-file__rename-modal z-background-${theme} z-text-${theme}`} onClick={event => event.stopPropagation()}>\n <div class=\"quick-message-file__rename-header\">\n <h3 id=\"quick-message-file-rename-title\" class=\"text-base font-semibold\">\n {labels.renameLabel}\n </h3>\n <button type=\"button\" class=\"quick-message-file__rename-close\" onClick={() => this.closeRenameModal()} aria-label={labels.closeLabel} disabled={this.isRenaming}>\n <Icon name=\"X\" />\n </button>\n </div>\n <form class=\"flex flex-col gap-4\" onSubmit={event => this.handleRenameSubmit(event)}>\n <label class=\"flex flex-col gap-2 text-sm\" htmlFor={inputId}>\n <span class=\"font-medium\">{labels.nameLabel}</span>\n <div class={`quick-message-file__rename-input-row border z-border-divider-${theme} z-background-${theme}`}>\n <input\n id={inputId}\n type=\"text\"\n class={`quick-message-file__rename-input z-text-${theme}`}\n value={this.renameName}\n onInput={event => this.handleRenameInput(event)}\n />\n {this.renameExtension && <span class=\"quick-message-file__rename-extension\">{this.renameExtension}</span>}\n </div>\n </label>\n <div class=\"flex justify-end gap-2 text-sm\">\n <button type=\"button\" class=\"quick-message-file__rename-cancel\" onClick={() => this.closeRenameModal()} disabled={this.isRenaming}>\n {labels.cancelLabel}\n </button>\n <button type=\"submit\" class=\"quick-message-file__rename-save\" disabled={isSaveDisabled}>\n {this.isRenaming ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : labels.saveLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n }\n\n disconnectedCallback() {\n // this.objectUrls.forEach((url) => URL.revokeObjectURL(url));\n // this.objectUrls = [];\n }\n\n render() {\n const theme = configStore.get('theme');\n const t = useTranslation();\n const filteredFiles = this.filterFiles();\n const isInitialLoading = this.isLoading && this.files.length === 0;\n const hasSelection = this.files.some(file => file.isSelected);\n const renameLabel = t('quick_message.rename_item');\n const deleteLabel = t('remove');\n const nameLabel = t('quick_message.name');\n const saveLabel = t('save');\n const cancelLabel = t('cancel');\n const closeLabel = t('close');\n\n return (\n <Host class=\"flex min-h-0 flex-1 flex-col gap-4\">\n <form class=\"w-full\" onSubmit={event => this.handleSearchSubmit(event)}>\n <div class=\"relative\">\n <input\n type=\"text\"\n class={`w-full border z-border-divider-${theme} text-sm px-4 py-2 pr-9 rounded-lg ring-primary focus:outline-none focus:border-primary z-background-${theme} z-text-${theme}`}\n placeholder={t('quick_message.search_file')}\n value={this.searchFile}\n onInput={event => this.handleSearchInput(event)}\n />\n {this.searchFile && (\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 hover:text-gray-600\"\n onClick={() => this.clearSearch()}\n aria-label={t('clear') || 'Clear'}\n >\n <Icon name=\"X\" />\n </button>\n )}\n </div>\n </form>\n\n <div class=\"flex items-center justify-between\">\n {this.files.length > 0 ? (\n <label class=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={this.files.length > 0 && this.files.every(file => file.isSelected)} onChange={() => this.toggleSelectAllFiles()} />\n <span>{t('select_all')}</span>\n </label>\n ) : (\n <span />\n )}\n <div class=\"flex items-center gap-2\">\n <input\n class=\"hidden\"\n type=\"file\"\n multiple\n accept={this.allowedFileExtensions.map(extension => `.${extension}`).join(',')}\n ref={el => (this.fileInput = el as HTMLInputElement)}\n onChange={event => this.handleFileSelection(event)}\n />\n <button\n type=\"button\"\n class=\"quick-message-file__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n onClick={() => !this.isUploading && this.triggerFileUpload()}\n aria-label={t('quick_message.add_file')}\n disabled={this.isUploading}\n >\n {this.isUploading ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Plus\" />}\n </button>\n </div>\n </div>\n\n {this.isUploading && (\n <div class={`flex items-center gap-2 text-xs z-text-primary-${theme}`}>\n <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" />\n <span>{t('quick_message.uploading') || 'Uploading...'}</span>\n </div>\n )}\n\n {isInitialLoading ? (\n <div class={`flex flex-1 items-center justify-center text-sm z-text-gray-${theme}`}>Loading...</div>\n ) : filteredFiles.length === 0 ? (\n <div class={`flex flex-1 items-center justify-center text-sm z-text-gray-${theme}`}>{t('quick_message.file_empty')}</div>\n ) : (\n <div class=\"flex flex-1 flex-col gap-2.5 overflow-y-auto\" onScroll={event => this.handleScroll(event)}>\n {filteredFiles.map(file => (\n <label class=\"flex items-center gap-3 rounded-xl px-3 py-2.5\" key={file.id}>\n <input type=\"checkbox\" checked={!!file.isSelected} onChange={() => this.toggleFileSelection(file.id)} />\n <div class=\"quick-message-file__icon flex h-10 w-10 items-center justify-center rounded-xl\">\n <Icon name=\"File\" />\n </div>\n <div class=\"flex flex-1 items-center gap-3 min-w-0\">\n <div class=\"flex min-w-0 flex-col gap-1\">\n <div class=\"text-sm font-semibold line-clamp-2 break-words\">{file.name}</div>\n <div class={`text-xs z-text-gray-${theme}`}>{this.renderFileMeta(file.size, file.created_at, t)}</div>\n </div>\n <div class=\"quick-message-file__menu-wrapper\" data-quick-message-file-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-file__list-more-button\"\n onClick={event => this.toggleMenu(file.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === file.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-file-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === file.id && (\n <div class={`quick-message-file__menu z-background-${theme} z-text-${theme}`} role=\"menu\" data-quick-message-file-menu-root=\"\">\n <button type=\"button\" class=\"quick-message-file__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(file, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-file__menu-item quick-message-file__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteFile(file, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n </label>\n ))}\n {this.isLoadingMore && <div class={`py-3 text-center text-xs z-text-gray-${theme}`}>Loading...</div>}\n </div>\n )}\n\n <div class={`mt-auto flex items-center gap-2 pt-2`}>\n {hasSelection && (\n <button\n type=\"button\"\n class={`quick-message-file__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer disabled:cursor-not-allowed disabled:opacity-40`}\n onClick={() => this.requestDeleteSelectedFiles()}\n aria-label={t('remove')}\n disabled={this.isDeleting}\n >\n {this.isDeleting ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Trash2\" />}\n </button>\n )}\n {!this.isMaster && (\n <button\n type=\"button\"\n disabled={!hasSelection}\n class={`quick-message-file__send ml-auto inline-flex items-center justify-center rounded-full px-4 py-2 text-xs font-semibold z-background-primary-${theme} text-white disabled:cursor-not-allowed disabled:opacity-40 cursor-pointer`}\n onClick={() => this.handleSendFiles()}\n >\n {t('quick_message.send_files')}\n </button>\n )}\n </div>\n {this.renderRenameModal(theme, { renameLabel, nameLabel, saveLabel, cancelLabel, closeLabel })}\n </Host>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"p-3t2ULKvn.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement","showErrorDialog"],"sources":["src/components/quick-message-file/quick-message-file.css?tag=quick-message-file","src/components/quick-message-file/quick-message-file.tsx"],"sourcesContent":[":host {\n position: relative;\n}\n\n.quick-message-file__icon {\n background: var(--quick-modal-primary-ghost);\n color: var(--quick-modal-primary);\n}\n\n.quick-message-file__action-button {\n border: 1px solid rgba(148, 163, 184, 0.4);\n background: transparent;\n}\n\n.quick-message-file__send {\n background: var(--quick-modal-primary);\n color: #fff;\n border: none;\n}\n\n.quick-message-file__list-more-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n border-radius: 0.5rem;\n border: none;\n background: transparent;\n color: inherit;\n cursor: pointer;\n margin-left: auto;\n}\n\n.quick-message-file__list-more-button:hover {\n background: rgba(148, 163, 184, 0.12);\n}\n\n.quick-message-file__menu-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n}\n\n.quick-message-file__menu {\n position: absolute;\n top: calc(100% + 0.5rem);\n right: 0;\n display: flex;\n flex-direction: column;\n min-width: 8rem;\n padding: 0.25rem 0;\n border-radius: 0.75rem;\n border: 1px solid rgba(148, 163, 184, 0.18);\n box-shadow: 0 16px 30px rgba(15, 23, 42, 0.2);\n z-index: 40;\n overflow: hidden;\n}\n\n.quick-message-file__menu-item {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: flex-start;\n gap: 0.5rem;\n padding: 0.5rem 0.9rem;\n border: none;\n background: transparent;\n color: inherit;\n font-size: 0.8125rem;\n line-height: 1.2;\n cursor: pointer;\n text-align: left;\n transition: background-color 0.2s ease;\n}\n\n.quick-message-file__menu-item:hover {\n background: rgba(148, 163, 184, 0.14);\n}\n\n.quick-message-file__menu-item--danger {\n color: #ef4444;\n}\n\n.quick-message-file__menu-item--danger:hover {\n background: rgba(239, 68, 68, 0.12);\n}\n\n.quick-message-file__rename-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(15, 23, 42, 0.45);\n padding: 1.5rem;\n z-index: 20;\n}\n\n.quick-message-file__rename-modal {\n width: 100%;\n max-width: 22rem;\n border-radius: 0.75rem;\n box-shadow: 0 20px 45px rgba(15, 23, 42, 0.25);\n padding: 1.5rem;\n}\n\n.quick-message-file__rename-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 1rem;\n}\n\n.quick-message-file__rename-close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: inherit;\n border-radius: 0.5rem;\n padding: 0.25rem;\n cursor: pointer;\n}\n\n.quick-message-file__rename-close:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.quick-message-file__rename-cancel,\n.quick-message-file__rename-save {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n padding: 0.35rem 0.9rem;\n border: none;\n cursor: pointer;\n transition: opacity 0.2s ease;\n}\n\n.quick-message-file__rename-cancel {\n background: transparent;\n color: inherit;\n border: 1px solid rgba(148, 163, 184, 0.4);\n}\n\n.quick-message-file__rename-save {\n background: var(--quick-modal-primary);\n color: #fff;\n}\n\n.quick-message-file__rename-save:disabled,\n.quick-message-file__rename-cancel:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.quick-message-file__rename-input-row {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n border-radius: 0.75rem;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease;\n}\n\n.quick-message-file__rename-input-row:focus-within {\n border-color: var(--quick-modal-primary);\n box-shadow: 0 0 0 1px var(--quick-modal-primary);\n}\n\n.quick-message-file__rename-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.35rem 0;\n font-size: 0.875rem;\n color: inherit;\n}\n\n.quick-message-file__rename-input:focus {\n outline: none;\n}\n\n.quick-message-file__rename-extension {\n font-size: 0.875rem;\n font-weight: 500;\n color: inherit;\n opacity: 0.75;\n white-space: nowrap;\n}\n","import { Component, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport dayjs from 'dayjs';\nimport { createQuickMessageLibraryFiles, deleteQuickMessageLibraryFile, getQuickMessageLibraryFiles, updateQuickMessageLibraryFileName } from '../../api/quick-message';\nimport type { QuickMessageLibraryFilePayload } from '../../api/type';\nimport { QuickMessageLibraryFile } from '../../store/type';\nimport { configStore } from '../../store/store';\nimport { useTranslation } from '../../utils/utils';\nimport { Icon } from '../internal-component/icon';\nimport { uploadFile } from '../../utils/upload';\nimport { DIALOG_TYPE, handleError as showErrorDialog, openDialog } from '../../store/dialog';\n\n@Component({\n tag: 'quick-message-file',\n styleUrl: 'quick-message-file.css',\n})\nexport class QuickMessageFileComponent {\n @Prop() handleClose?: () => void;\n @Prop() value?: string | QuickMessageLibraryFile[];\n @Prop() isMaster: boolean = false;\n\n @State() private searchFile = '';\n @State() private files: QuickMessageLibraryFile[] = [];\n @State() private isLoading = false;\n @State() private isLoadingMore = false;\n @State() private isUploading = false;\n @State() private isDeleting = false;\n @State() private totalFiles = 0;\n @State() private totalPages = 0;\n @State() private renameTargetId: string | null = null;\n @State() private renameName = '';\n @State() private renameExtension = '';\n @State() private isRenaming = false;\n @State() private openMenuId: string | null = null;\n\n private readonly allowedFileExtensions = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'csv', 'zip', 'rar', '7z'];\n private readonly pageSize = 15;\n private readonly localUploadPrefix = 'uploaded-file-';\n private page = 1;\n private currentSearch = '';\n\n private fileInput?: HTMLInputElement;\n @Event({ bubbles: true, composed: true }) filesChange!: EventEmitter<QuickMessageLibraryFile[]>;\n @Event({ bubbles: true, composed: true }) sendFiles!: EventEmitter<QuickMessageLibraryFile[]>;\n\n private pendingDeleteFileIds: string[] = [];\n\n // Memoization cache for filtered files\n private cachedFilteredFiles: QuickMessageLibraryFile[] | null = null;\n private cachedSearchTerm: string = '';\n private cachedFilesLength: number = 0;\n\n @Listen('click', { target: 'document' })\n protected handleDocumentClick(event: Event) {\n const target = event.target as HTMLElement | null;\n\n if (target?.closest('[data-quick-message-file-menu-root]')) {\n return;\n }\n\n this.openMenuId = null;\n }\n\n componentWillLoad() {\n this.syncFilesFromProp(this.value);\n }\n\n async componentDidLoad() {\n await this.fetchFiles({ reset: true });\n }\n\n @Watch('value')\n protected handleValueChange(newValue?: string | QuickMessageLibraryFile[]) {\n this.syncFilesFromProp(newValue);\n }\n\n private syncFilesFromProp(value?: string | QuickMessageLibraryFile[]) {\n if (value === undefined || value === null) {\n this.setFiles([], false);\n return;\n }\n\n const parsed = this.parseFilesValue(value);\n this.setFiles(parsed, false);\n }\n\n private parseFilesValue(value: string | QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n if (typeof value === 'string') {\n try {\n const deserialized = JSON.parse(value) as QuickMessageLibraryFile[];\n return this.cloneFiles(deserialized);\n } catch (error: unknown) {\n console.warn('[quick-message-file] Failed to parse files value', error);\n return [];\n }\n }\n\n return this.cloneFiles(value);\n }\n\n private cloneFiles(files: QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n return (files || []).map(file => ({\n ...file,\n isSelected: file.isSelected ?? false,\n }));\n }\n\n private setFiles(next: QuickMessageLibraryFile[], shouldEmit = true) {\n this.files = next;\n if (shouldEmit) {\n const payload = this.cloneFiles(next);\n this.filesChange.emit(payload);\n }\n }\n\n private isLocalUpload(file: QuickMessageLibraryFile): boolean {\n return file.id.startsWith(this.localUploadPrefix);\n }\n\n private getRemoteFileCount(): number {\n return this.files.filter(file => !this.isLocalUpload(file)).length;\n }\n\n private mergeFetchedFiles(fetched: QuickMessageLibraryFile[], reset: boolean): QuickMessageLibraryFile[] {\n const localUploads = this.files.filter(file => this.isLocalUpload(file));\n const selectionMap = new Map(this.files.map(file => [file.id, file.isSelected ?? false]));\n\n const normalizedFetched = fetched.map(file => ({\n ...file,\n isSelected: selectionMap.get(file.id) ?? file.isSelected ?? false,\n }));\n\n if (reset) {\n return [...localUploads, ...normalizedFetched];\n }\n\n const existingRemote = this.files.filter(file => !this.isLocalUpload(file));\n const remoteIndexMap = new Map<string, number>();\n existingRemote.forEach((file, index) => {\n remoteIndexMap.set(file.id, index);\n });\n\n const nextRemote = [...existingRemote];\n normalizedFetched.forEach(file => {\n const existingIndex = remoteIndexMap.get(file.id);\n if (existingIndex !== undefined) {\n nextRemote[existingIndex] = file;\n } else {\n remoteIndexMap.set(file.id, nextRemote.length);\n nextRemote.push(file);\n }\n });\n\n return [...localUploads, ...nextRemote];\n }\n\n /**\n * Memoized file filtering - only recalculates when search term or files change\n * Performance: Reduces operations from 60fps to only when user types\n */\n private filterFiles(): QuickMessageLibraryFile[] {\n const search = this.searchFile.trim().toLowerCase();\n\n // Quick return for no search\n if (!search) return this.files;\n\n // Check if we can use cached results\n if (this.cachedFilteredFiles && search === this.cachedSearchTerm && this.files.length === this.cachedFilesLength) {\n return this.cachedFilteredFiles;\n }\n\n // Recalculate filtered results\n const filtered = this.files.filter(file => file.name.toLowerCase().includes(search));\n\n // Update cache\n this.cachedFilteredFiles = filtered;\n this.cachedSearchTerm = search;\n this.cachedFilesLength = this.files.length;\n\n return filtered;\n }\n\n private splitFileName(name: string): { base: string; extension: string } {\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex <= 0 || lastDotIndex === name.length - 1) {\n return { base: name, extension: '' };\n }\n\n return {\n base: name.slice(0, lastDotIndex),\n extension: name.slice(lastDotIndex),\n };\n }\n\n private getRenameTarget(): QuickMessageLibraryFile | undefined {\n if (!this.renameTargetId) {\n return undefined;\n }\n\n return this.files.find(file => file.id === this.renameTargetId);\n }\n\n private openRenameModal(file: QuickMessageLibraryFile, event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n\n const { base, extension } = this.splitFileName(file.name);\n this.renameTargetId = file.id;\n this.renameName = base;\n this.renameExtension = extension;\n }\n\n private closeRenameModal(force = false) {\n if (this.isRenaming && !force) {\n return;\n }\n\n this.renameTargetId = null;\n this.renameName = '';\n this.renameExtension = '';\n }\n\n private toggleMenu(fileId: string, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.openMenuId = this.openMenuId === fileId ? null : fileId;\n }\n\n private closeMenu() {\n this.openMenuId = null;\n }\n\n private handleMenuRename(file: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.closeMenu();\n this.openRenameModal(file, event);\n }\n\n private requestDeleteFile(file: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isDeleting) {\n return;\n }\n\n this.pendingDeleteFileIds = [file.id];\n this.closeMenu();\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_item_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedFiles();\n },\n onCloseDialog: () => {\n this.pendingDeleteFileIds = [];\n },\n });\n }\n\n private handleRenameInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n\n if (this.renameExtension && value.toLowerCase().endsWith(this.renameExtension.toLowerCase())) {\n this.renameName = value.slice(0, -this.renameExtension.length);\n return;\n }\n\n this.renameName = value;\n }\n\n private async handleRenameSubmit(event: Event) {\n event.preventDefault();\n\n const target = this.getRenameTarget();\n\n if (!target) {\n return;\n }\n\n const trimmedBase = this.renameName.trim();\n\n if (!trimmedBase) {\n return;\n }\n\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n\n if (nextName === target.name) {\n this.closeRenameModal(true);\n return;\n }\n\n if (this.isLocalUpload(target)) {\n this.setFiles(\n this.files.map(file =>\n file.id === target.id\n ? {\n ...file,\n name: nextName,\n }\n : file,\n ),\n );\n\n this.closeRenameModal(true);\n return;\n }\n\n this.isRenaming = true;\n\n try {\n const updated = await updateQuickMessageLibraryFileName({ id: target.id, name: nextName });\n this.setFiles(\n this.files.map(file =>\n file.id === target.id\n ? {\n ...file,\n name: updated.name,\n last_updated_at: updated.last_updated_at,\n last_updated_by: updated.last_updated_by,\n }\n : file,\n ),\n );\n this.closeRenameModal(true);\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to rename file');\n } finally {\n this.isRenaming = false;\n }\n }\n\n private toggleFileSelection(id: string) {\n this.setFiles(this.files.map(file => (file.id === id ? { ...file, isSelected: !file.isSelected } : file)));\n }\n\n private toggleSelectAllFiles() {\n const isAllSelected = this.files.length > 0 && this.files.every(file => file.isSelected);\n this.setFiles(this.files.map(file => ({ ...file, isSelected: !isAllSelected })));\n }\n\n private triggerFileUpload() {\n this.fileInput?.click();\n }\n\n private handleFileSelection(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const validFiles = Array.from(input.files).filter(file => {\n const extension = file.name.split('.').pop()?.toLowerCase();\n return extension && this.allowedFileExtensions.includes(extension);\n });\n\n input.value = '';\n\n if (validFiles.length === 0) {\n return;\n }\n\n void this.uploadAndCreateFiles(validFiles);\n }\n\n private async uploadAndCreateFiles(files: File[]) {\n if (files.length === 0) {\n return;\n }\n\n this.isUploading = true;\n\n try {\n const payload: QuickMessageLibraryFilePayload[] = [];\n\n for (const file of files) {\n const uploadUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-library/file',\n });\n\n if (!uploadUrl) {\n continue;\n }\n\n payload.push({\n file_type: 'file',\n name: file.name,\n url: uploadUrl,\n size: file.size,\n });\n }\n\n if (payload.length > 0) {\n await createQuickMessageLibraryFiles({ files: payload });\n await this.fetchFiles({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to upload files');\n } finally {\n this.isUploading = false;\n }\n }\n\n private renderFileMeta(size: number, createdAt: string, t: (key: string, values?: Record<string, string>) => string) {\n const sizeKb = Math.round(size / 1024);\n return `${sizeKb} KB · ${t('quick_message.created_at').replace('{date}', dayjs(createdAt).tz().format('DD/MM/YYYY HH:mm'))}`;\n }\n\n private handleSendFiles() {\n const selected = this.files.filter(file => file.isSelected);\n if (selected.length === 0) return;\n const payload = this.cloneFiles(selected);\n this.sendFiles.emit(payload);\n this.handleClose?.();\n }\n\n private requestDeleteSelectedFiles() {\n if (this.isDeleting) {\n return;\n }\n\n const selectedIds = this.files.filter(file => file.isSelected).map(file => file.id);\n\n if (selectedIds.length === 0) {\n return;\n }\n\n this.pendingDeleteFileIds = selectedIds;\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_selected_items_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedFiles();\n },\n onCloseDialog: () => {\n this.pendingDeleteFileIds = [];\n },\n });\n }\n\n private async confirmDeleteSelectedFiles() {\n if (this.isDeleting) {\n return;\n }\n\n const pendingIds = [...this.pendingDeleteFileIds];\n this.pendingDeleteFileIds = [];\n\n if (pendingIds.length === 0) {\n return;\n }\n\n const pendingSet = new Set(pendingIds);\n const remoteIds = this.files.filter(file => pendingSet.has(file.id) && !this.isLocalUpload(file)).map(file => file.id);\n\n this.isDeleting = true;\n\n try {\n if (remoteIds.length > 0) {\n await deleteQuickMessageLibraryFile({ ids: remoteIds });\n }\n\n const remaining = this.files.filter(file => !pendingSet.has(file.id));\n this.setFiles(remaining);\n\n if (remoteIds.length > 0) {\n this.totalFiles = Math.max(0, this.totalFiles - remoteIds.length);\n await this.fetchFiles({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-file] Failed to delete files');\n } finally {\n this.isDeleting = false;\n }\n }\n\n private async fetchFiles({ search, reset = true }: { search?: string; reset?: boolean } = {}) {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n return;\n }\n\n if (reset ? this.isLoading : this.isLoadingMore) {\n return;\n }\n\n const searchSource = search !== undefined ? search : reset ? this.searchFile : this.currentSearch;\n const trimmedSearch = searchSource?.trim() ?? '';\n const nextPage = reset ? 1 : this.page + 1;\n\n if (search !== undefined) {\n this.searchFile = searchSource ?? '';\n }\n\n if (reset) {\n this.isLoading = true;\n } else {\n this.isLoadingMore = true;\n }\n\n try {\n const response = await getQuickMessageLibraryFiles({\n fileType: 'file',\n search: trimmedSearch ? trimmedSearch : undefined,\n page: nextPage,\n limit: this.pageSize,\n });\n\n const fetched = this.cloneFiles(response.files || []);\n const merged = this.mergeFetchedFiles(fetched, reset);\n\n this.page = response.page > 0 ? response.page : nextPage;\n const resolvedTotalPages = response.total_pages > 0 ? response.total_pages : fetched.length > 0 ? 1 : 0;\n this.totalPages = resolvedTotalPages;\n this.totalFiles = typeof response.total === 'number' ? response.total : fetched.length;\n this.currentSearch = trimmedSearch;\n\n this.setFiles(merged);\n } catch (error: unknown) {\n console.error('[quick-message-file] Failed to fetch files', error);\n } finally {\n if (reset) {\n this.isLoading = false;\n } else {\n this.isLoadingMore = false;\n }\n }\n }\n\n private async loadMoreFiles() {\n if (this.isLoading || this.isLoadingMore) {\n return;\n }\n\n if (this.totalPages === 0 || this.page >= this.totalPages) {\n return;\n }\n\n if (this.totalFiles > 0) {\n const remoteCount = this.getRemoteFileCount();\n if (remoteCount >= this.totalFiles) {\n return;\n }\n }\n\n await this.fetchFiles({ reset: false });\n }\n\n private handleScroll(event: Event) {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return;\n }\n\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining < 160) {\n void this.loadMoreFiles();\n }\n }\n\n private handleSearchInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n this.searchFile = value;\n\n if (!value.trim() && this.currentSearch && !this.isLoading && !this.isLoadingMore) {\n void this.fetchFiles({ search: '', reset: true });\n }\n }\n\n private async handleSearchSubmit(event?: Event) {\n event?.preventDefault();\n await this.fetchFiles({ search: this.searchFile, reset: true });\n }\n\n private clearSearch() {\n if (!this.searchFile) {\n return;\n }\n\n this.searchFile = '';\n if (this.currentSearch) {\n void this.fetchFiles({ search: '', reset: true });\n }\n }\n\n private renderRenameModal(theme: string, labels: { renameLabel: string; nameLabel: string; saveLabel: string; cancelLabel: string; closeLabel: string }) {\n const target = this.getRenameTarget();\n\n if (!this.renameTargetId || !target) {\n return null;\n }\n\n const trimmedBase = this.renameName.trim();\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n const isSaveDisabled = this.isRenaming || trimmedBase.length === 0 || nextName === target.name;\n const inputId = `quick-message-file-rename-${target.id}`;\n\n return (\n <div class=\"quick-message-file__rename-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"quick-message-file-rename-title\" onClick={() => this.closeRenameModal()}>\n <div class={`quick-message-file__rename-modal z-background-${theme} z-text-${theme}`} onClick={event => event.stopPropagation()}>\n <div class=\"quick-message-file__rename-header\">\n <h3 id=\"quick-message-file-rename-title\" class=\"text-base font-semibold\">\n {labels.renameLabel}\n </h3>\n <button type=\"button\" class=\"quick-message-file__rename-close\" onClick={() => this.closeRenameModal()} aria-label={labels.closeLabel} disabled={this.isRenaming}>\n <Icon name=\"X\" />\n </button>\n </div>\n <form class=\"flex flex-col gap-4\" onSubmit={event => this.handleRenameSubmit(event)}>\n <label class=\"flex flex-col gap-2 text-sm\" htmlFor={inputId}>\n <span class=\"font-medium\">{labels.nameLabel}</span>\n <div class={`quick-message-file__rename-input-row border z-border-divider-${theme} z-background-${theme}`}>\n <input\n id={inputId}\n type=\"text\"\n class={`quick-message-file__rename-input z-text-${theme}`}\n value={this.renameName}\n onInput={event => this.handleRenameInput(event)}\n />\n {this.renameExtension && <span class=\"quick-message-file__rename-extension\">{this.renameExtension}</span>}\n </div>\n </label>\n <div class=\"flex justify-end gap-2 text-sm\">\n <button type=\"button\" class=\"quick-message-file__rename-cancel\" onClick={() => this.closeRenameModal()} disabled={this.isRenaming}>\n {labels.cancelLabel}\n </button>\n <button type=\"submit\" class=\"quick-message-file__rename-save\" disabled={isSaveDisabled}>\n {this.isRenaming ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : labels.saveLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n }\n\n disconnectedCallback() {\n // this.objectUrls.forEach((url) => URL.revokeObjectURL(url));\n // this.objectUrls = [];\n }\n\n render() {\n const theme = configStore.get('theme');\n const t = useTranslation();\n const filteredFiles = this.filterFiles();\n const isInitialLoading = this.isLoading && this.files.length === 0;\n const hasSelection = this.files.some(file => file.isSelected);\n const renameLabel = t('quick_message.rename_item');\n const deleteLabel = t('remove');\n const nameLabel = t('quick_message.name');\n const saveLabel = t('save');\n const cancelLabel = t('cancel');\n const closeLabel = t('close');\n\n return (\n <Host class=\"flex min-h-0 flex-1 flex-col gap-4\">\n <form class=\"w-full\" onSubmit={event => this.handleSearchSubmit(event)}>\n <div class=\"relative\">\n <input\n type=\"text\"\n class={`w-full border z-border-divider-${theme} text-sm px-4 py-2 pr-9 rounded-lg ring-primary focus:outline-none focus:border-primary z-background-${theme} z-text-${theme}`}\n placeholder={t('quick_message.search_file')}\n value={this.searchFile}\n onInput={event => this.handleSearchInput(event)}\n />\n {this.searchFile && (\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 hover:text-gray-600\"\n onClick={() => this.clearSearch()}\n aria-label={t('clear') || 'Clear'}\n >\n <Icon name=\"X\" />\n </button>\n )}\n </div>\n </form>\n\n <div class=\"flex items-center justify-between\">\n {this.files.length > 0 ? (\n <label class=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={this.files.length > 0 && this.files.every(file => file.isSelected)} onChange={() => this.toggleSelectAllFiles()} />\n <span>{t('select_all')}</span>\n </label>\n ) : (\n <span />\n )}\n <div class=\"flex items-center gap-2\">\n <input\n class=\"hidden\"\n type=\"file\"\n multiple\n accept={this.allowedFileExtensions.map(extension => `.${extension}`).join(',')}\n ref={el => (this.fileInput = el as HTMLInputElement)}\n onChange={event => this.handleFileSelection(event)}\n />\n <button\n type=\"button\"\n class=\"quick-message-file__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n onClick={() => !this.isUploading && this.triggerFileUpload()}\n aria-label={t('quick_message.add_file')}\n disabled={this.isUploading}\n >\n {this.isUploading ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Plus\" />}\n </button>\n </div>\n </div>\n\n {this.isUploading && (\n <div class={`flex items-center gap-2 text-xs z-text-primary-${theme}`}>\n <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" />\n <span>{t('quick_message.uploading') || 'Uploading...'}</span>\n </div>\n )}\n\n {isInitialLoading ? (\n <div class={`flex flex-1 items-center justify-center text-sm z-text-gray-${theme}`}>Loading...</div>\n ) : filteredFiles.length === 0 ? (\n <div class={`flex flex-1 items-center justify-center text-sm z-text-gray-${theme}`}>{t('quick_message.file_empty')}</div>\n ) : (\n <div class=\"flex flex-1 flex-col gap-2.5 overflow-y-auto\" onScroll={event => this.handleScroll(event)}>\n {filteredFiles.map(file => (\n <label class=\"flex items-center gap-3 rounded-xl px-3 py-2.5\" key={file.id}>\n <input type=\"checkbox\" checked={!!file.isSelected} onChange={() => this.toggleFileSelection(file.id)} />\n <div class=\"quick-message-file__icon flex h-10 w-10 items-center justify-center rounded-xl\">\n <Icon name=\"File\" />\n </div>\n <div class=\"flex flex-1 items-center gap-3 min-w-0\">\n <div class=\"flex min-w-0 flex-col gap-1\">\n <div class=\"text-sm font-semibold line-clamp-2 break-words\">{file.name}</div>\n <div class={`text-xs z-text-gray-${theme}`}>{this.renderFileMeta(file.size, file.created_at, t)}</div>\n </div>\n <div class=\"quick-message-file__menu-wrapper\" data-quick-message-file-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-file__list-more-button\"\n onClick={event => this.toggleMenu(file.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === file.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-file-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === file.id && (\n <div class={`quick-message-file__menu z-background-${theme} z-text-${theme}`} role=\"menu\" data-quick-message-file-menu-root=\"\">\n <button type=\"button\" class=\"quick-message-file__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(file, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-file__menu-item quick-message-file__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteFile(file, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n </label>\n ))}\n {this.isLoadingMore && <div class={`py-3 text-center text-xs z-text-gray-${theme}`}>Loading...</div>}\n </div>\n )}\n\n <div class={`mt-auto flex items-center gap-2 pt-2`}>\n {hasSelection && (\n <button\n type=\"button\"\n class={`quick-message-file__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer disabled:cursor-not-allowed disabled:opacity-40`}\n onClick={() => this.requestDeleteSelectedFiles()}\n aria-label={t('remove')}\n disabled={this.isDeleting}\n >\n {this.isDeleting ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Trash2\" />}\n </button>\n )}\n {!this.isMaster && (\n <button\n type=\"button\"\n disabled={!hasSelection}\n class={`quick-message-file__send ml-auto inline-flex items-center justify-center rounded-full px-4 py-2 text-xs font-semibold z-background-primary-${theme} text-white disabled:cursor-not-allowed disabled:opacity-40 cursor-pointer`}\n onClick={() => this.handleSendFiles()}\n >\n {t('quick_message.send_files')}\n </button>\n )}\n </div>\n {this.renderRenameModal(theme, { renameLabel, nameLabel, saveLabel, cancelLabel, closeLabel })}\n </Host>\n );\n }\n}\n"],"version":3}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as configStore } from './p-x8gJGTdZ.js';
|
|
2
|
-
import { g as getSignedS3Request, a as apiService } from './p-
|
|
3
|
-
import { h as handleError } from './p-
|
|
2
|
+
import { g as getSignedS3Request, a as apiService } from './p-BssEwLaN.js';
|
|
3
|
+
import { h as handleError } from './p-Heeo8D4P.js';
|
|
4
4
|
|
|
5
5
|
const uploadFile = async ({ file, filename = 'untitled', folder }) => {
|
|
6
6
|
const businessId = configStore.get('businessId');
|
|
@@ -375,6 +375,6 @@ const getQuickMessageLibraryFiles = async (params = {}) => {
|
|
|
375
375
|
};
|
|
376
376
|
|
|
377
377
|
export { updateQuickMessageLibraryFileName as a, getQuickMessageTemplates as b, createQuickMessageLibraryFiles as c, deleteQuickMessageLibraryFile as d, updateQuickMessageTemplate as e, createQuickMessageTemplate as f, getQuickMessageLibraryFiles as g, deleteQuickMessageTemplate as h, uploadFile as u };
|
|
378
|
-
//# sourceMappingURL=p-
|
|
378
|
+
//# sourceMappingURL=p-5QPDcqLV.js.map
|
|
379
379
|
|
|
380
|
-
//# sourceMappingURL=p-
|
|
380
|
+
//# sourceMappingURL=p-5QPDcqLV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"p-DRC94y7I.js","mappings":"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","names":[],"sources":["src/utils/upload.ts","src/api/quick-message.ts"],"sourcesContent":["import { GetSignedS3Params, GetSignedS3Response, IUploadFieldToS3 } from '../api/type';\nimport { handleError } from '../store/dialog';\nimport { configStore } from '../store/store';\nimport { getSignedS3Request } from './axios';\n\nexport const uploadFile = async ({ file, filename = 'untitled', folder }: IUploadFieldToS3) => {\n const businessId = configStore.get('businessId');\n const data: GetSignedS3Params = {\n 'file-name': `${businessId}_${Date.now()}_${filename.replaceAll(' ', '-')}.${file?.name?.split('.')?.pop() || ''}`,\n 'file-type': file.type ?? 'application/octet-stream',\n 'folder-name': folder,\n };\n try {\n let url = await getSignedRequest(data, file);\n url = encodeURI(url || '');\n\n if (typeof url !== 'undefined') {\n return url;\n }\n } catch (error: unknown) {\n handleError(error);\n }\n};\n\nconst getSignedRequest = async (value: GetSignedS3Params, file: File) => {\n try {\n const response = await getSignedS3Request(value);\n if (response) {\n const uploadedResponse = await uploadfile(response, file);\n return uploadedResponse;\n }\n } catch (error: unknown) {\n handleError(error);\n }\n};\n\nconst uploadfile = async ({ result }: GetSignedS3Response, file: File) => {\n return new Promise<string>((resolve, reject) => {\n const signedRequest = result.signedRequest;\n const formData = new FormData();\n formData.append('acl', 'public-read');\n Object.keys(signedRequest.fields).forEach(key => {\n formData.append(key, signedRequest.fields[key]);\n });\n\n formData.append('file', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', signedRequest.url, true);\n\n xhr.send(formData);\n xhr.onload = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200 || xhr.status === 204) {\n resolve(`${result.url}`);\n } else {\n reject('Could not upload file.');\n }\n }\n };\n });\n};\n\nexport const useResizeImage = (file: File, maxWidth: number = 500, maxHeight: number = 500): Promise<File> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = event => {\n const img = new Image();\n img.src = event.target?.result as string;\n\n img.onload = () => {\n const { width, height } = img;\n let newWidth = width;\n let newHeight = height;\n\n if (width > maxWidth) {\n newWidth = maxWidth;\n newHeight = (height / width) * maxWidth;\n }\n\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n newWidth = (width / height) * maxHeight;\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = newWidth;\n canvas.height = newHeight;\n\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0, newWidth, newHeight);\n\n canvas.toBlob(blob => {\n if (blob) {\n const resizedFile = new File([blob], file.name, {\n type: file.type,\n lastModified: file.lastModified,\n });\n resolve(resizedFile);\n } else {\n reject(new Error('Failed to resize the image.'));\n }\n }, file.type);\n };\n };\n\n reader.onerror = event => {\n console.log('error', event);\n reject(new Error('Failed to read the image.'));\n };\n\n reader.readAsDataURL(file);\n });\n};\n","import { configStore } from '../store/store';\nimport { apiService } from '../utils/axios';\nimport { uploadFile } from '../utils/upload';\nimport * as Types from './type';\nimport type { QuickMessageTemplateButton, QuickMessageTemplateContent } from '../store/type';\n\nconst normalizeQuickMessageTemplateString = (value?: string | null): string | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n};\n\nconst isDataUrl = (value: string): boolean => value.startsWith('data:');\n\nconst dataUrlToFile = (dataUrl: string): File | null => {\n const matches = dataUrl.match(/^data:(.*?);base64,(.*)$/);\n if (!matches) {\n return null;\n }\n\n const mime = matches[1] || 'application/octet-stream';\n const base64Data = matches[2];\n\n try {\n const binaryString = atob(base64Data);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const extension = mime.split('/')[1] || 'bin';\n const fileName = `quick-message-${Date.now()}.${extension}`;\n return new File([bytes], fileName, { type: mime });\n } catch (error: unknown) {\n console.error('[quick-message-template] Failed to convert data URL to file', error);\n return null;\n }\n};\n\nconst resolveFileUrl = async (value?: string | null): Promise<string | undefined> => {\n const normalized = normalizeQuickMessageTemplateString(value);\n\n if (!normalized) {\n return undefined;\n }\n\n if (isHttpUrl(normalized)) {\n return normalized;\n }\n\n if (isDataUrl(normalized)) {\n const file = dataUrlToFile(normalized);\n if (!file) {\n return normalized;\n }\n\n try {\n const uploadedUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-template',\n });\n\n return normalizeQuickMessageTemplateString(uploadedUrl) ?? normalized;\n } catch (error: unknown) {\n console.error('[quick-message-template] Failed to upload file for template', error);\n return normalized;\n }\n }\n\n return normalized;\n};\n\ntype QuickMessageTemplateButtonPayload = {\n action_type: QuickMessageTemplateButton['action_type'];\n text: string;\n action?: string;\n};\n\ntype QuickMessageTemplateMenuListPayload = {\n file_url?: string;\n title?: string;\n description?: string;\n buttons?: QuickMessageTemplateButtonPayload[];\n};\n\ntype QuickMessageTemplateContentPayload = {\n type: QuickMessageTemplateContent['type'];\n text?: string;\n file_url?: string;\n buttons?: QuickMessageTemplateButtonPayload[];\n menu_list?: QuickMessageTemplateMenuListPayload[];\n};\n\ntype CreateQuickMessageTemplateRequestBody = {\n title: string;\n contents: QuickMessageTemplateContentPayload[];\n};\n\nconst buildQuickMessageTemplateRequestBody = async (template: Types.CreateQuickMessageTemplateParams): Promise<CreateQuickMessageTemplateRequestBody> => {\n const title = template.title?.trim() ?? '';\n\n const contents = await Promise.all(\n (template.contents ?? []).map(async content => {\n const text = normalizeQuickMessageTemplateString(content.text);\n const fileUrl = await resolveFileUrl(content.file_url);\n\n const buttons = (content.buttons ?? [])\n .map<QuickMessageTemplateButtonPayload | null>(button => {\n const buttonText = normalizeQuickMessageTemplateString(button.text);\n if (!buttonText) {\n return null;\n }\n\n const payload: QuickMessageTemplateButtonPayload = {\n action_type: button.action_type,\n text: buttonText,\n };\n\n const action = normalizeQuickMessageTemplateString(button.action);\n if (action) {\n payload.action = action;\n }\n\n return payload;\n })\n .filter((button): button is QuickMessageTemplateButtonPayload => Boolean(button));\n\n const menuListRaw = await Promise.all(\n (content.menu_list ?? []).map(async menu => {\n const fileUrlMenu = await resolveFileUrl(menu.file_url);\n const titleMenu = normalizeQuickMessageTemplateString(menu.title);\n const descriptionMenu = normalizeQuickMessageTemplateString(menu.description);\n\n const menuButtons = (menu.buttons ?? [])\n .map<QuickMessageTemplateButtonPayload | null>(button => {\n const buttonText = normalizeQuickMessageTemplateString(button.text);\n if (!buttonText) {\n return null;\n }\n\n const payload: QuickMessageTemplateButtonPayload = {\n action_type: button.action_type,\n text: buttonText,\n };\n\n const action = normalizeQuickMessageTemplateString(button.action);\n if (action) {\n payload.action = action;\n }\n\n return payload;\n })\n .filter((button): button is QuickMessageTemplateButtonPayload => Boolean(button));\n\n if (!fileUrlMenu && !titleMenu && !descriptionMenu && menuButtons.length === 0) {\n return null;\n }\n\n const payload: QuickMessageTemplateMenuListPayload = {};\n\n if (fileUrlMenu) {\n payload.file_url = fileUrlMenu;\n }\n if (titleMenu) {\n payload.title = titleMenu;\n }\n if (descriptionMenu) {\n payload.description = descriptionMenu;\n }\n if (menuButtons.length > 0) {\n payload.buttons = menuButtons;\n }\n\n return payload;\n }),\n );\n\n const menuList = menuListRaw.filter((menu): menu is QuickMessageTemplateMenuListPayload => Boolean(menu));\n\n if (!text && !fileUrl && buttons.length === 0 && menuList.length === 0) {\n return null;\n }\n\n const payload: QuickMessageTemplateContentPayload = {\n type: content.type,\n };\n\n if (text) {\n payload.text = text;\n }\n if (fileUrl) {\n payload.file_url = fileUrl;\n }\n if (buttons.length > 0) {\n payload.buttons = buttons;\n }\n if (menuList.length > 0) {\n payload.menu_list = menuList;\n }\n\n return payload;\n }),\n );\n\n const filteredContents = contents.filter((content): content is QuickMessageTemplateContentPayload => Boolean(content));\n\n return {\n title,\n contents: filteredContents,\n };\n};\n\nconst normalizeLibraryFilesResponse = (data: unknown): Types.CreateQuickMessageLibraryFileResponse => {\n if (Array.isArray(data)) {\n return data as Types.CreateQuickMessageLibraryFileResponse;\n }\n\n if (data && typeof data === 'object' && Array.isArray((data as { files?: unknown }).files)) {\n return (data as { files: Types.CreateQuickMessageLibraryFileResponse }).files;\n }\n\n return [];\n};\n\nexport const getQuickMessageTemplates = async (params: Types.GetQuickMessageTemplatesParams = {}) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const { page = 1, limit = 20, search } = params;\n const requestParams: Record<string, string | number | undefined> = {\n page,\n limit,\n search: search?.trim() ? search.trim() : undefined,\n };\n\n const { data, status } = await apiService().get<Types.GetQuickMessageTemplatesResponse>(`api/${businessId}/${shopId}/quick-message-template`, {\n params: requestParams,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to getQuickMessageTemplates');\n};\n\nexport const createQuickMessageTemplate = async (template: Types.CreateQuickMessageTemplateParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const payload = await buildQuickMessageTemplateRequestBody(template);\n\n const { data, status } = await apiService().post<Types.CreateQuickMessageTemplateResponse>(`api/${businessId}/${shopId}/quick-message-template`, payload);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to createQuickMessageTemplate');\n};\n\nexport const updateQuickMessageTemplate = async (template: Types.CreateQuickMessageTemplateParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n if (!template.id) {\n throw new Error('[quick-message] Missing template id');\n }\n\n const payload = await buildQuickMessageTemplateRequestBody(template);\n\n const { data, status } = await apiService().patch<Types.CreateQuickMessageTemplateResponse>(`api/${businessId}/${shopId}/quick-message-template/${template.id}`, payload);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to updateQuickMessageTemplate');\n};\n\nexport const deleteQuickMessageTemplate = async (templateId: string) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n if (!templateId) {\n throw new Error('[quick-message] Missing template id');\n }\n\n const { data, status } = await apiService().delete<Types.BaseResponse>(`api/${businessId}/${shopId}/quick-message-template/${templateId}`);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to deleteQuickMessageTemplate');\n};\n\nexport const createQuickMessageLibraryFiles = async (params: Types.CreateQuickMessageLibraryFileParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const files = params.files ?? [];\n\n if (files.length === 0) {\n return [];\n }\n\n const requestPayload = {\n files: files.map(file => ({\n file_type: file.file_type,\n name: file.name.trim(),\n url: file.url.trim(),\n size: file.size,\n })),\n };\n\n const { data, status } = await apiService().post<Types.CreateQuickMessageLibraryFileResponse | { files: Types.CreateQuickMessageLibraryFileResponse }>(\n `api/${businessId}/${shopId}/quick-message-library-file`,\n requestPayload,\n );\n\n if (status === 200) {\n return normalizeLibraryFilesResponse(data);\n }\n\n throw new Error('Failed to createQuickMessageLibraryFiles');\n};\n\nexport const deleteQuickMessageLibraryFile = async (params: Types.DeleteQuickMessageLibraryFileParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const normalizedIds = Array.from(new Set((params.ids ?? []).map(id => (typeof id === 'string' ? id.trim() : '')).filter(id => id.length > 0)));\n\n if (normalizedIds.length === 0) {\n throw new Error('[quick-message] Missing file ids to delete');\n }\n\n const { data, status } = await apiService().delete<Types.DeleteQuickMessageLibraryFileResponse>(`api/${businessId}/${shopId}/quick-message-library-file`, {\n data: {\n file_ids: normalizedIds,\n },\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to deleteQuickMessageLibraryFile');\n};\n\nexport const updateQuickMessageLibraryFileName = async (params: Types.UpdateQuickMessageLibraryFileNameParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const trimmedId = params.id.trim();\n const trimmedName = params.name.trim();\n\n if (!trimmedId) {\n throw new Error('[quick-message] Missing file id to update');\n }\n\n if (!trimmedName) {\n throw new Error('[quick-message] Missing file name to update');\n }\n\n const { data, status } = await apiService().patch<Types.UpdateQuickMessageLibraryFileNameResponse>(`api/${businessId}/${shopId}/quick-message-library-file/${trimmedId}`, {\n name: trimmedName,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to updateQuickMessageLibraryFileName');\n};\n\nexport const getQuickMessageLibraryFiles = async (params: Types.GetQuickMessageLibraryFilesParams = {}) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const { page = 1, limit = 20, search, fileType } = params;\n const requestParams: Record<string, string | number | undefined> = {\n page,\n limit,\n search: search?.trim() ? search.trim() : undefined,\n file_type: fileType,\n };\n\n const { data, status } = await apiService().get<Types.GetQuickMessageLibraryFilesResponse>(`api/${businessId}/${shopId}/quick-message-library-file`, {\n params: requestParams,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to getQuickMessageLibraryFiles');\n};\n"],"version":3}
|
|
1
|
+
{"file":"p-5QPDcqLV.js","mappings":"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","names":[],"sources":["src/utils/upload.ts","src/api/quick-message.ts"],"sourcesContent":["import { GetSignedS3Params, GetSignedS3Response, IUploadFieldToS3 } from '../api/type';\nimport { handleError } from '../store/dialog';\nimport { configStore } from '../store/store';\nimport { getSignedS3Request } from './axios';\n\nexport const uploadFile = async ({ file, filename = 'untitled', folder }: IUploadFieldToS3) => {\n const businessId = configStore.get('businessId');\n const data: GetSignedS3Params = {\n 'file-name': `${businessId}_${Date.now()}_${filename.replaceAll(' ', '-')}.${file?.name?.split('.')?.pop() || ''}`,\n 'file-type': file.type ?? 'application/octet-stream',\n 'folder-name': folder,\n };\n try {\n let url = await getSignedRequest(data, file);\n url = encodeURI(url || '');\n\n if (typeof url !== 'undefined') {\n return url;\n }\n } catch (error: unknown) {\n handleError(error);\n }\n};\n\nconst getSignedRequest = async (value: GetSignedS3Params, file: File) => {\n try {\n const response = await getSignedS3Request(value);\n if (response) {\n const uploadedResponse = await uploadfile(response, file);\n return uploadedResponse;\n }\n } catch (error: unknown) {\n handleError(error);\n }\n};\n\nconst uploadfile = async ({ result }: GetSignedS3Response, file: File) => {\n return new Promise<string>((resolve, reject) => {\n const signedRequest = result.signedRequest;\n const formData = new FormData();\n formData.append('acl', 'public-read');\n Object.keys(signedRequest.fields).forEach(key => {\n formData.append(key, signedRequest.fields[key]);\n });\n\n formData.append('file', file);\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', signedRequest.url, true);\n\n xhr.send(formData);\n xhr.onload = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200 || xhr.status === 204) {\n resolve(`${result.url}`);\n } else {\n reject('Could not upload file.');\n }\n }\n };\n });\n};\n\nexport const useResizeImage = (file: File, maxWidth: number = 500, maxHeight: number = 500): Promise<File> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = event => {\n const img = new Image();\n img.src = event.target?.result as string;\n\n img.onload = () => {\n const { width, height } = img;\n let newWidth = width;\n let newHeight = height;\n\n if (width > maxWidth) {\n newWidth = maxWidth;\n newHeight = (height / width) * maxWidth;\n }\n\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n newWidth = (width / height) * maxHeight;\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = newWidth;\n canvas.height = newHeight;\n\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0, newWidth, newHeight);\n\n canvas.toBlob(blob => {\n if (blob) {\n const resizedFile = new File([blob], file.name, {\n type: file.type,\n lastModified: file.lastModified,\n });\n resolve(resizedFile);\n } else {\n reject(new Error('Failed to resize the image.'));\n }\n }, file.type);\n };\n };\n\n reader.onerror = event => {\n console.log('error', event);\n reject(new Error('Failed to read the image.'));\n };\n\n reader.readAsDataURL(file);\n });\n};\n","import { configStore } from '../store/store';\nimport { apiService } from '../utils/axios';\nimport { uploadFile } from '../utils/upload';\nimport * as Types from './type';\nimport type { QuickMessageTemplateButton, QuickMessageTemplateContent } from '../store/type';\n\nconst normalizeQuickMessageTemplateString = (value?: string | null): string | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n};\n\nconst isDataUrl = (value: string): boolean => value.startsWith('data:');\n\nconst dataUrlToFile = (dataUrl: string): File | null => {\n const matches = dataUrl.match(/^data:(.*?);base64,(.*)$/);\n if (!matches) {\n return null;\n }\n\n const mime = matches[1] || 'application/octet-stream';\n const base64Data = matches[2];\n\n try {\n const binaryString = atob(base64Data);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const extension = mime.split('/')[1] || 'bin';\n const fileName = `quick-message-${Date.now()}.${extension}`;\n return new File([bytes], fileName, { type: mime });\n } catch (error: unknown) {\n console.error('[quick-message-template] Failed to convert data URL to file', error);\n return null;\n }\n};\n\nconst resolveFileUrl = async (value?: string | null): Promise<string | undefined> => {\n const normalized = normalizeQuickMessageTemplateString(value);\n\n if (!normalized) {\n return undefined;\n }\n\n if (isHttpUrl(normalized)) {\n return normalized;\n }\n\n if (isDataUrl(normalized)) {\n const file = dataUrlToFile(normalized);\n if (!file) {\n return normalized;\n }\n\n try {\n const uploadedUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-template',\n });\n\n return normalizeQuickMessageTemplateString(uploadedUrl) ?? normalized;\n } catch (error: unknown) {\n console.error('[quick-message-template] Failed to upload file for template', error);\n return normalized;\n }\n }\n\n return normalized;\n};\n\ntype QuickMessageTemplateButtonPayload = {\n action_type: QuickMessageTemplateButton['action_type'];\n text: string;\n action?: string;\n};\n\ntype QuickMessageTemplateMenuListPayload = {\n file_url?: string;\n title?: string;\n description?: string;\n buttons?: QuickMessageTemplateButtonPayload[];\n};\n\ntype QuickMessageTemplateContentPayload = {\n type: QuickMessageTemplateContent['type'];\n text?: string;\n file_url?: string;\n buttons?: QuickMessageTemplateButtonPayload[];\n menu_list?: QuickMessageTemplateMenuListPayload[];\n};\n\ntype CreateQuickMessageTemplateRequestBody = {\n title: string;\n contents: QuickMessageTemplateContentPayload[];\n};\n\nconst buildQuickMessageTemplateRequestBody = async (template: Types.CreateQuickMessageTemplateParams): Promise<CreateQuickMessageTemplateRequestBody> => {\n const title = template.title?.trim() ?? '';\n\n const contents = await Promise.all(\n (template.contents ?? []).map(async content => {\n const text = normalizeQuickMessageTemplateString(content.text);\n const fileUrl = await resolveFileUrl(content.file_url);\n\n const buttons = (content.buttons ?? [])\n .map<QuickMessageTemplateButtonPayload | null>(button => {\n const buttonText = normalizeQuickMessageTemplateString(button.text);\n if (!buttonText) {\n return null;\n }\n\n const payload: QuickMessageTemplateButtonPayload = {\n action_type: button.action_type,\n text: buttonText,\n };\n\n const action = normalizeQuickMessageTemplateString(button.action);\n if (action) {\n payload.action = action;\n }\n\n return payload;\n })\n .filter((button): button is QuickMessageTemplateButtonPayload => Boolean(button));\n\n const menuListRaw = await Promise.all(\n (content.menu_list ?? []).map(async menu => {\n const fileUrlMenu = await resolveFileUrl(menu.file_url);\n const titleMenu = normalizeQuickMessageTemplateString(menu.title);\n const descriptionMenu = normalizeQuickMessageTemplateString(menu.description);\n\n const menuButtons = (menu.buttons ?? [])\n .map<QuickMessageTemplateButtonPayload | null>(button => {\n const buttonText = normalizeQuickMessageTemplateString(button.text);\n if (!buttonText) {\n return null;\n }\n\n const payload: QuickMessageTemplateButtonPayload = {\n action_type: button.action_type,\n text: buttonText,\n };\n\n const action = normalizeQuickMessageTemplateString(button.action);\n if (action) {\n payload.action = action;\n }\n\n return payload;\n })\n .filter((button): button is QuickMessageTemplateButtonPayload => Boolean(button));\n\n if (!fileUrlMenu && !titleMenu && !descriptionMenu && menuButtons.length === 0) {\n return null;\n }\n\n const payload: QuickMessageTemplateMenuListPayload = {};\n\n if (fileUrlMenu) {\n payload.file_url = fileUrlMenu;\n }\n if (titleMenu) {\n payload.title = titleMenu;\n }\n if (descriptionMenu) {\n payload.description = descriptionMenu;\n }\n if (menuButtons.length > 0) {\n payload.buttons = menuButtons;\n }\n\n return payload;\n }),\n );\n\n const menuList = menuListRaw.filter((menu): menu is QuickMessageTemplateMenuListPayload => Boolean(menu));\n\n if (!text && !fileUrl && buttons.length === 0 && menuList.length === 0) {\n return null;\n }\n\n const payload: QuickMessageTemplateContentPayload = {\n type: content.type,\n };\n\n if (text) {\n payload.text = text;\n }\n if (fileUrl) {\n payload.file_url = fileUrl;\n }\n if (buttons.length > 0) {\n payload.buttons = buttons;\n }\n if (menuList.length > 0) {\n payload.menu_list = menuList;\n }\n\n return payload;\n }),\n );\n\n const filteredContents = contents.filter((content): content is QuickMessageTemplateContentPayload => Boolean(content));\n\n return {\n title,\n contents: filteredContents,\n };\n};\n\nconst normalizeLibraryFilesResponse = (data: unknown): Types.CreateQuickMessageLibraryFileResponse => {\n if (Array.isArray(data)) {\n return data as Types.CreateQuickMessageLibraryFileResponse;\n }\n\n if (data && typeof data === 'object' && Array.isArray((data as { files?: unknown }).files)) {\n return (data as { files: Types.CreateQuickMessageLibraryFileResponse }).files;\n }\n\n return [];\n};\n\nexport const getQuickMessageTemplates = async (params: Types.GetQuickMessageTemplatesParams = {}) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const { page = 1, limit = 20, search } = params;\n const requestParams: Record<string, string | number | undefined> = {\n page,\n limit,\n search: search?.trim() ? search.trim() : undefined,\n };\n\n const { data, status } = await apiService().get<Types.GetQuickMessageTemplatesResponse>(`api/${businessId}/${shopId}/quick-message-template`, {\n params: requestParams,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to getQuickMessageTemplates');\n};\n\nexport const createQuickMessageTemplate = async (template: Types.CreateQuickMessageTemplateParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const payload = await buildQuickMessageTemplateRequestBody(template);\n\n const { data, status } = await apiService().post<Types.CreateQuickMessageTemplateResponse>(`api/${businessId}/${shopId}/quick-message-template`, payload);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to createQuickMessageTemplate');\n};\n\nexport const updateQuickMessageTemplate = async (template: Types.CreateQuickMessageTemplateParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n if (!template.id) {\n throw new Error('[quick-message] Missing template id');\n }\n\n const payload = await buildQuickMessageTemplateRequestBody(template);\n\n const { data, status } = await apiService().patch<Types.CreateQuickMessageTemplateResponse>(`api/${businessId}/${shopId}/quick-message-template/${template.id}`, payload);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to updateQuickMessageTemplate');\n};\n\nexport const deleteQuickMessageTemplate = async (templateId: string) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n if (!templateId) {\n throw new Error('[quick-message] Missing template id');\n }\n\n const { data, status } = await apiService().delete<Types.BaseResponse>(`api/${businessId}/${shopId}/quick-message-template/${templateId}`);\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to deleteQuickMessageTemplate');\n};\n\nexport const createQuickMessageLibraryFiles = async (params: Types.CreateQuickMessageLibraryFileParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const files = params.files ?? [];\n\n if (files.length === 0) {\n return [];\n }\n\n const requestPayload = {\n files: files.map(file => ({\n file_type: file.file_type,\n name: file.name.trim(),\n url: file.url.trim(),\n size: file.size,\n })),\n };\n\n const { data, status } = await apiService().post<Types.CreateQuickMessageLibraryFileResponse | { files: Types.CreateQuickMessageLibraryFileResponse }>(\n `api/${businessId}/${shopId}/quick-message-library-file`,\n requestPayload,\n );\n\n if (status === 200) {\n return normalizeLibraryFilesResponse(data);\n }\n\n throw new Error('Failed to createQuickMessageLibraryFiles');\n};\n\nexport const deleteQuickMessageLibraryFile = async (params: Types.DeleteQuickMessageLibraryFileParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const normalizedIds = Array.from(new Set((params.ids ?? []).map(id => (typeof id === 'string' ? id.trim() : '')).filter(id => id.length > 0)));\n\n if (normalizedIds.length === 0) {\n throw new Error('[quick-message] Missing file ids to delete');\n }\n\n const { data, status } = await apiService().delete<Types.DeleteQuickMessageLibraryFileResponse>(`api/${businessId}/${shopId}/quick-message-library-file`, {\n data: {\n file_ids: normalizedIds,\n },\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to deleteQuickMessageLibraryFile');\n};\n\nexport const updateQuickMessageLibraryFileName = async (params: Types.UpdateQuickMessageLibraryFileNameParams) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const trimmedId = params.id.trim();\n const trimmedName = params.name.trim();\n\n if (!trimmedId) {\n throw new Error('[quick-message] Missing file id to update');\n }\n\n if (!trimmedName) {\n throw new Error('[quick-message] Missing file name to update');\n }\n\n const { data, status } = await apiService().patch<Types.UpdateQuickMessageLibraryFileNameResponse>(`api/${businessId}/${shopId}/quick-message-library-file/${trimmedId}`, {\n name: trimmedName,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to updateQuickMessageLibraryFileName');\n};\n\nexport const getQuickMessageLibraryFiles = async (params: Types.GetQuickMessageLibraryFilesParams = {}) => {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n throw new Error('[quick-message] Missing businessId or shopId');\n }\n\n const { page = 1, limit = 20, search, fileType } = params;\n const requestParams: Record<string, string | number | undefined> = {\n page,\n limit,\n search: search?.trim() ? search.trim() : undefined,\n file_type: fileType,\n };\n\n const { data, status } = await apiService().get<Types.GetQuickMessageLibraryFilesResponse>(`api/${businessId}/${shopId}/quick-message-library-file`, {\n params: requestParams,\n });\n\n if (status === 200) {\n return data;\n }\n\n throw new Error('Failed to getQuickMessageLibraryFiles');\n};\n"],"version":3}
|