m2m-components 5.1.4-alpha-1725852045986-c9ff28f.0 → 5.1.4-alpha-0-9ac30bf.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MenuBaseElement.js.map +1 -1
- package/MenuBaseElement.mjs +1 -1
- package/{chunk-RIKI6TTQ.mjs → chunk-2F7MVYJV.mjs} +5 -5
- package/chunk-2F7MVYJV.mjs.map +1 -0
- package/chunk-32NVR4HG.mjs +18 -0
- package/chunk-32NVR4HG.mjs.map +1 -0
- package/chunk-34OP4R54.mjs +114 -0
- package/chunk-34OP4R54.mjs.map +1 -0
- package/{chunk-YXPSTKYY.mjs → chunk-3LXMUAGW.mjs} +4 -4
- package/chunk-3LXMUAGW.mjs.map +1 -0
- package/chunk-3X5MOATG.mjs +9 -0
- package/chunk-3X5MOATG.mjs.map +1 -0
- package/{chunk-B6FEFIYC.mjs → chunk-4WYT3ILE.mjs} +2 -2
- package/chunk-4WYT3ILE.mjs.map +1 -0
- package/chunk-5DZIFMOT.mjs +96 -0
- package/chunk-5DZIFMOT.mjs.map +1 -0
- package/chunk-5MCHUEWC.mjs +40 -0
- package/chunk-5MCHUEWC.mjs.map +1 -0
- package/{chunk-HI2D4CLX.mjs → chunk-6YUMRFSL.mjs} +1 -1
- package/chunk-6YUMRFSL.mjs.map +1 -0
- package/chunk-7UFH6ALM.mjs +24 -0
- package/chunk-7UFH6ALM.mjs.map +1 -0
- package/chunk-AYYVMRUA.mjs +94 -0
- package/chunk-AYYVMRUA.mjs.map +1 -0
- package/chunk-BUSDHSUG.mjs +61 -0
- package/chunk-BUSDHSUG.mjs.map +1 -0
- package/{chunk-RDG67OF7.mjs → chunk-DJMCUABY.mjs} +4 -4
- package/chunk-F4UMH2JS.mjs +74 -0
- package/chunk-F4UMH2JS.mjs.map +1 -0
- package/chunk-FDRD4YS4.mjs +34 -0
- package/chunk-FDRD4YS4.mjs.map +1 -0
- package/{chunk-CR2KP7D3.mjs → chunk-FK5456TR.mjs} +2 -2
- package/{chunk-YZIPEODC.mjs → chunk-H6D6RG6X.mjs} +1 -1
- package/chunk-H6D6RG6X.mjs.map +1 -0
- package/chunk-IYTHV2XJ.mjs +22 -0
- package/chunk-IYTHV2XJ.mjs.map +1 -0
- package/chunk-JTHAKXEH.mjs +8992 -0
- package/chunk-JTHAKXEH.mjs.map +1 -0
- package/chunk-KE76CQSA.mjs +41 -0
- package/chunk-KE76CQSA.mjs.map +1 -0
- package/chunk-KEFPOQJ5.mjs +83 -0
- package/chunk-KEFPOQJ5.mjs.map +1 -0
- package/chunk-LUTUMV2M.mjs +166 -0
- package/chunk-LUTUMV2M.mjs.map +1 -0
- package/chunk-MHR3UXOP.mjs +154 -0
- package/{chunk-HI2D4CLX.mjs.map → chunk-MHR3UXOP.mjs.map} +1 -1
- package/chunk-OB2SVLHW.mjs +289 -0
- package/chunk-OB2SVLHW.mjs.map +1 -0
- package/chunk-P4FPJRVQ.mjs +17 -0
- package/{chunk-S7FCKJZP.mjs → chunk-RUMO4IC5.mjs} +1 -1
- package/chunk-RUMO4IC5.mjs.map +1 -0
- package/{chunk-LAH6LOT7.mjs → chunk-UIR5V5YH.mjs} +5 -5
- package/chunk-UXYQOQLC.mjs +28 -0
- package/chunk-UXYQOQLC.mjs.map +1 -0
- package/chunk-V74QQNBA.mjs +21 -0
- package/chunk-V74QQNBA.mjs.map +1 -0
- package/chunk-WLLFVGUS.mjs +441 -0
- package/chunk-WLLFVGUS.mjs.map +1 -0
- package/chunk-YMWGGIJ6.mjs +19 -0
- package/chunk-YMWGGIJ6.mjs.map +1 -0
- package/chunk-YSF5KXHA.mjs +54 -0
- package/chunk-YSF5KXHA.mjs.map +1 -0
- package/chunk-ZJKAXJ7Z.mjs +78 -0
- package/chunk-ZJKAXJ7Z.mjs.map +1 -0
- package/feedback/index.mjs +2 -2
- package/global.d.d.mts +5 -1
- package/global.d.d.ts +5 -1
- package/global.d.js.map +1 -1
- package/index.js +2 -3
- package/index.js.map +1 -1
- package/index.mjs +10 -10
- package/initM2mComponents.js +4 -5
- package/initM2mComponents.js.map +1 -1
- package/initM2mComponents.mjs +2 -2
- package/m2m-apps-menu.js.map +1 -1
- package/m2m-apps-menu.mjs +2 -2
- package/m2m-notifications.v1-OgnhtmrU.d.mts +64 -0
- package/m2m-notifications.v1-OgnhtmrU.d.ts +64 -0
- package/m2m-releases-link.js.map +1 -1
- package/m2m-releases-link.mjs +1 -1
- package/m2m-user-menu.js +2 -3
- package/m2m-user-menu.js.map +1 -1
- package/m2m-user-menu.mjs +3 -3
- package/m2m-users.v1-kKGcXd92.d.mts +271 -0
- package/m2m-users.v1-kKGcXd92.d.ts +271 -0
- package/matsuri-forms.v1-lw-XWLjX.d.mts +203 -0
- package/matsuri-forms.v1-lw-XWLjX.d.ts +203 -0
- package/notification/index.mjs +6 -6
- package/package.json +57 -57
- package/releases/t.js.map +1 -1
- package/releases/t.mjs +1 -1
- package/storage/client.js +4 -5
- package/storage/client.js.map +1 -1
- package/storage/client.mjs +1 -1
- package/storage/hub.js.map +1 -1
- package/storage/hub.mjs +1 -1
- package/storage/refreshAuth.js +2 -3
- package/storage/refreshAuth.js.map +1 -1
- package/storage/refreshAuth.mjs +3 -3
- package/storage/useM2mAuth.js +2 -3
- package/storage/useM2mAuth.js.map +1 -1
- package/storage/useM2mAuth.mjs +6 -6
- package/storage/useM2mAuth.mjs.map +1 -1
- package/chunk-B6FEFIYC.mjs.map +0 -1
- package/chunk-RIKI6TTQ.mjs.map +0 -1
- package/chunk-S7FCKJZP.mjs.map +0 -1
- package/chunk-YXPSTKYY.mjs.map +0 -1
- /package/{chunk-RDG67OF7.mjs.map → chunk-DJMCUABY.mjs.map} +0 -0
- /package/{chunk-CR2KP7D3.mjs.map → chunk-FK5456TR.mjs.map} +0 -0
- /package/{chunk-YZIPEODC.mjs.map → chunk-P4FPJRVQ.mjs.map} +0 -0
- /package/{chunk-LAH6LOT7.mjs.map → chunk-UIR5V5YH.mjs.map} +0 -0
package/feedback/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import {
|
|
3
3
|
FeedbackProvider
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-IH72EYIB.mjs";
|
|
4
|
+
} from "../chunk-DJMCUABY.mjs";
|
|
6
5
|
import "../chunk-SXIYWN76.mjs";
|
|
7
6
|
import "../chunk-CTGSJWXT.mjs";
|
|
7
|
+
import "../chunk-IH72EYIB.mjs";
|
|
8
8
|
import "../chunk-QH5I6YL2.mjs";
|
|
9
9
|
export {
|
|
10
10
|
FeedbackProvider
|
package/global.d.d.mts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { M2mStorageClient } from './storage/client.mjs';
|
|
2
|
+
import './storage/lib/client.mjs';
|
|
3
|
+
|
|
4
|
+
/* eslint-disable no-var */
|
|
1
5
|
declare global {
|
|
2
|
-
// eslint-disable-next-line no-var
|
|
3
6
|
var M2M_COMPONENTS_ENV: string;
|
|
7
|
+
var M2M_STORAGE: M2mStorageClient | undefined;
|
|
4
8
|
}
|
package/global.d.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { M2mStorageClient } from './storage/client.js';
|
|
2
|
+
import './storage/lib/client.js';
|
|
3
|
+
|
|
4
|
+
/* eslint-disable no-var */
|
|
1
5
|
declare global {
|
|
2
|
-
// eslint-disable-next-line no-var
|
|
3
6
|
var M2M_COMPONENTS_ENV: string;
|
|
7
|
+
var M2M_STORAGE: M2mStorageClient | undefined;
|
|
4
8
|
}
|
package/global.d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/global.d.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../src/global.d.ts"],"sourcesContent":["/* eslint-disable no-var */\ndeclare global {\n var M2M_COMPONENTS_ENV: string;\n var M2M_STORAGE: import(\"./storage/client\").M2mStorageClient | undefined;\n}\n\nexport {};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/index.js
CHANGED
|
@@ -78,7 +78,6 @@ var FeedbackIcon = normalizeIcon(import_Feedback.default);
|
|
|
78
78
|
var TextQuestionContext = (0, import_react.createContext)({});
|
|
79
79
|
|
|
80
80
|
// src/storage/client.ts
|
|
81
|
-
var context = {};
|
|
82
81
|
var getStorage = async (timeout = 5e3) => {
|
|
83
82
|
const storage = await new Promise((resolve, reject) => {
|
|
84
83
|
const rejectTimer = globalThis.setTimeout(function() {
|
|
@@ -88,13 +87,13 @@ var getStorage = async (timeout = 5e3) => {
|
|
|
88
87
|
)
|
|
89
88
|
);
|
|
90
89
|
}, timeout);
|
|
91
|
-
const storage2 =
|
|
90
|
+
const storage2 = globalThis.M2M_STORAGE;
|
|
92
91
|
if (storage2) {
|
|
93
92
|
globalThis.clearTimeout(rejectTimer);
|
|
94
93
|
resolve(storage2);
|
|
95
94
|
}
|
|
96
95
|
const timer = globalThis.setInterval(() => {
|
|
97
|
-
const storage3 =
|
|
96
|
+
const storage3 = globalThis.M2M_STORAGE;
|
|
98
97
|
if (storage3) {
|
|
99
98
|
globalThis.clearTimeout(rejectTimer);
|
|
100
99
|
globalThis.clearInterval(timer);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/domains.ts","../src/feedback/index.tsx","../src/feedback/MultipleTextQuestion.tsx","../src/feedback/SelectQuestion.tsx","../src/storage/client.ts","../src/MenuBaseElement.ts","../src/m2m-apps-menu.ts","../src/m2m-user-menu.ts","../src/notification/api.ts","../src/notification/ServiceIdProvider.tsx","../src/notification/NotificationProvider.tsx"],"sourcesContent":["export const getDomains = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? {\n core: \"https://core.m2msystems.cloud\",\n sumyca: \"https://manage.sumyca.com\",\n cleaning: \"https://manager-cleaning.m2msystems.cloud\",\n users: \"https://manage-users.m2msystems.cloud\",\n inspection: \"https://inspection.m2msystems.cloud\",\n checkin: \"https://manage.checkin.m2msystems.cloud\",\n systems: \"https://m2msystems.cloud/\",\n }\n : {\n core: \"https://dev--m2m-core-manager-front.netlify.app\",\n sumyca: \"https://dev--sumyca-manager-front.netlify.app\",\n cleaning: \"https://dev--m2m-cleaning-manager-front.netlify.app\",\n users: \"https://dev--manage-users.netlify.app\",\n inspection: \"https://dev--m2m-inspection-manager-front.netlify.app\",\n checkin: \"https://manage.dev.checkin.m2msystems.cloud\",\n systems: \"https://dev.m2msystems.cloud\",\n };\n};\n","import {\n Button,\n Modal,\n ModalProps,\n Portal,\n Typography,\n useAlert,\n useModal,\n} from \"matsuri-ui\";\nimport { type Logger } from \"@datadog/browser-logs\";\nimport {\n MatsuriFormsQuestion,\n MatsuriFormsQuestionProvider,\n MatsuriFormsTextQuestionProps,\n useMatsuriForms,\n} from \"matsuri-forms-sdk\";\nimport { MultipleTextQuestion } from \"./MultipleTextQuestion\";\nimport { PropsWithChildren, createContext, useContext, useState } from \"react\";\nimport { SelectQuestion } from \"./SelectQuestion\";\nimport { getRandomId } from \"./getRandomId\";\nimport FeedbackIconBase from \"@mui/icons-material/Feedback\";\n\n/**\n * これはワークアラウンドです。\n * これを行わずに、MuiIconをそのまま使うと、トランスパイル後のコードで次のようなエラーが発生し、コンポーネントを描画できなくなります。\n * `Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.`\n * 関連リンク:\n * https://stackoverflow.com/questions/72008357/mui-icons-used-in-shared-react-component-library-wont-render-error-element-ty\n * https://github.com/mui/material-ui/issues/35535\n */\nconst normalizeIcon = <T,>(Icon: T): T => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n return ((Icon as any).default ? (Icon as any).default : Icon) as T;\n};\nconst FeedbackIcon = normalizeIcon(FeedbackIconBase);\n\nconst getFormId = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? \"01GWRQ1MRS7PE29XGRETFZ6D7Y\"\n : \"01GTBSYMGPMX91E96P007SXEMH\";\n};\n\ninterface TextQuestionContextValue {\n userId?: string;\n userName?: string;\n serviceName?: string;\n url?: string;\n id?: string;\n}\n\nconst TextQuestionContext = createContext<TextQuestionContextValue>({});\n\nconst TextQuestion = (props: MatsuriFormsTextQuestionProps) => {\n const context = useContext(TextQuestionContext);\n return (\n <input\n value={context[props.title as keyof TextQuestionContextValue]}\n type=\"hidden\"\n name={props.name}\n />\n );\n};\n\ninterface FeedbackProviderModalProps\n extends Partial<ModalProps>,\n FeedbackProviderProps {}\n\nconst FeedbackProviderModal = (props: FeedbackProviderModalProps) => {\n const { questions, submit } = useMatsuriForms(getFormId(), {\n dev: globalThis.M2M_COMPONENTS_ENV !== \"production\",\n });\n\n const { throwAlert } = useAlert();\n\n const [status, setStatus] = useState<\"started\" | \"sending\" | \"completed\">(\n \"started\",\n );\n\n const id = getRandomId();\n\n return (\n <Modal\n backdrop\n width={600}\n maxWidth={600}\n header={<Typography variant=\"h3\">フィードバックを送信</Typography>}\n body={\n status === \"completed\" ? (\n <div\n style={{\n display: \"grid\",\n gap: 32,\n }}\n >\n <Typography>\n レポートを送信しました。ありがとうございます。\n </Typography>\n <Typography color=\"textSecondary\" variant=\"caption\" as=\"p\">\n お送りいただいたフィードバックは、問題の解決とサービスの改善に役立てさせていただきます。\n </Typography>\n <Button\n color=\"primary\"\n variant=\"filled\"\n onClick={() => {\n props.onClose?.();\n }}\n >\n 閉じる\n </Button>\n </div>\n ) : (\n <form\n style={{\n display: \"grid\",\n gap: 24,\n }}\n onSubmit={async (event) => {\n event.preventDefault();\n setStatus(\"sending\");\n const { error } = await submit(event.currentTarget);\n\n /**\n * 以下、対応が行われるまでは取れる値だけ送る\n * https://github.com/matsuri-tech/matsuri-forms-manager-front/issues/265\n */\n const input = {\n id,\n userId: props.userId,\n userName: props.userName,\n serviceName: props.serviceName,\n url: window.location.href,\n };\n throwAlert(error, {\n ignoreSuccess: true,\n errorMessage: {\n reason: \"サーバー側のエラーの可能性があります。\",\n action:\n \"しばらく時間を空けて試すか、開発チームへお問い合わせください。\",\n happend: \"フィードバックの送信に失敗しました。\",\n },\n onSuccess: () => {\n props.datadogLogs?.logger?.info?.(\n `Feedback: ${id} by ${props.userId}`,\n {\n input,\n },\n );\n\n window.setTimeout(() => {\n setStatus(\"completed\");\n }, 2000);\n },\n onError: () => {\n props.datadogLogs?.logger?.error?.(\n `Failed Feedback: ${input.id} by ${input.userId}`,\n { input, error },\n );\n\n window.setTimeout(() => {\n setStatus(\"started\");\n }, 2000);\n },\n });\n }}\n >\n <TextQuestionContext.Provider\n value={{\n userId: props.userId,\n userName: props.userName,\n serviceName: props.serviceName,\n url: window.location.href,\n id,\n }}\n >\n <MatsuriFormsQuestionProvider\n renderSelect={SelectQuestion}\n renderMultilineText={MultipleTextQuestion}\n renderText={TextQuestion}\n >\n {questions.map((question) => {\n return (\n <MatsuriFormsQuestion {...question} key={question.id} />\n );\n })}\n </MatsuriFormsQuestionProvider>\n </TextQuestionContext.Provider>\n <div>\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"filled\"\n disabled={status === \"sending\"}\n fullWidth\n >\n 送信\n </Button>\n <Typography\n variant=\"caption\"\n style={{\n float: \"right\",\n }}\n >\n {status === \"sending\" ? \"送信中...\" : undefined}\n \n </Typography>\n </div>\n </form>\n )\n }\n {...props}\n />\n );\n};\n\ninterface FeedbackProviderProps {\n userId?: string;\n userName?: string;\n serviceName: string;\n datadogLogs?: {\n logger: Logger;\n };\n}\n\nexport const FeedbackProvider = ({\n children,\n ...modalProps\n}: PropsWithChildren<FeedbackProviderProps>) => {\n const [open] = useModal(FeedbackProviderModal, {\n enableClickOutside: true,\n disableClose: false,\n });\n return (\n <div>\n {children}\n <Portal>\n <Button\n style={{\n position: \"fixed\",\n bottom: 16,\n right: 16,\n }}\n onClick={() => {\n open(modalProps);\n }}\n type=\"button\"\n icon={<FeedbackIcon />}\n color=\"secondary\"\n variant=\"filled\"\n rounded\n />\n </Portal>\n </div>\n );\n};\n","import { MatsuriFormsMultilineTextQuestionProps } from \"matsuri-forms-sdk\";\nimport { MultipleTextField } from \"matsuri-ui\";\n\nexport const MultipleTextQuestion = (\n props: MatsuriFormsMultilineTextQuestionProps,\n) => {\n return (\n <MultipleTextField\n label=\"問題や提案について説明してください\"\n required={props.required}\n name={props.name}\n rows={6}\n helperText=\"現在開いているページのURLは自動的に送信されるため記載不要です\"\n />\n );\n};\n","import { Checkbox } from \"matsuri-ui\";\nimport { MatsuriFormsSelectQuestionProps } from \"matsuri-forms-sdk\";\n\nexport const SelectQuestion = (props: MatsuriFormsSelectQuestionProps) => {\n return (\n <div\n style={{\n display: \"flex\",\n gap: 16,\n }}\n >\n {props.options.map((option) => {\n return (\n <Checkbox\n defaultChecked\n type=\"radio\"\n name={props.name}\n value={option.value}\n key={option.value}\n >\n {option.label}\n </Checkbox>\n );\n })}\n </div>\n );\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\nconst context: {\n storage?: M2mStorageClient;\n} = {};\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = context.storage;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = context.storage;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (context.storage) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n context.storage = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { LitElement, css } from \"lit\";\nimport { Ref, createRef } from \"lit/directives/ref.js\";\nimport { property } from \"lit/decorators.js\";\n\nexport interface MenuAdditionalItem {\n label: string;\n href: string;\n}\n\nexport interface MenuBaseElementProps {\n expanded: boolean;\n additinalItems: MenuAdditionalItem[];\n}\n\nexport class MenuBaseElement extends LitElement {\n static styles = css`\n nav {\n position: relative;\n display: flex;\n }\n .navigation-drawer-controll-button {\n display: flex;\n align-items: center;\n justify-content: center;\n\n height: 42px;\n padding: 0;\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: background-color 0.2s;\n appearance: none;\n }\n .navigation-drawer-controll-button.navigation-drawer-controll-button--icon {\n width: 42px;\n }\n .navigation-drawer-controll-button:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n .navigation-drawer-controll-button:active {\n background-color: rgba(0, 0, 0, 0.075);\n }\n\n .navigation-drawer {\n position: absolute;\n top: 100%;\n right: 0px;\n z-index: 1100;\n box-sizing: border-box;\n min-width: 200px;\n padding: 0px;\n margin: 0px;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.87);\n white-space: nowrap;\n list-style: none;\n background-color: #fff;\n border-radius: 5px;\n box-shadow:\n 0px 1px 3px 0px rgb(0 0 0 / 20%),\n 0px 1px 1px 0px rgb(0 0 0 / 14%),\n 0px 2px 1px -1px rgb(0 0 0 / 12%);\n }\n .navigation-drawer-controll-button[aria-expanded=\"false\"]\n ~ .navigation-drawer {\n display: none;\n }\n\n .navigation-drawer li {\n border-bottom: 1px solid #eeeeee;\n }\n .navigation-drawer li:last-of-type {\n border-bottom: none;\n }\n .navigation-drawer li > a,\n .navigation-drawer li > button {\n box-sizing: border-box;\n display: block;\n width: 100%;\n padding: 0;\n padding: 0.6em 1em;\n font: inherit;\n color: inherit;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: 0.2s;\n appearance: none;\n }\n .navigation-drawer li > a:hover,\n .navigation-drawer li > button:hover {\n background-color: #ededed;\n }\n .navigation-drawer li > a:active,\n .navigation-drawer li > button:active {\n background-color: #dadada;\n }\n\n .navigation-drawer li ul {\n padding: 0;\n list-style: none;\n }\n .navigation-drawer li:has(> ul) li > a {\n padding-left: 2em;\n }\n\n .navigation-drawer li:has(> ul) > span {\n display: block;\n padding: 0.6em 1em;\n border-bottom: 1px solid #eeeeee;\n }\n `;\n\n handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (\n !this.listRef.value ||\n this.listRef.value.contains(event.composedPath()[0] as Node)\n ) {\n return;\n }\n this.expanded = false;\n };\n\n @property({\n type: Object,\n attribute: \"additional-items\",\n })\n additinalItems: MenuBaseElementProps[\"additinalItems\"] = [];\n\n @property()\n expanded?: boolean = false;\n\n handleToggleDrawer = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n this.expanded = !this.expanded;\n if (this.expanded) {\n window.addEventListener(\"click\", this.handleClickOutside, false);\n }\n };\n\n protected updated() {\n if (this.expanded === false) {\n window.removeEventListener(\"click\", this.handleClickOutside, false);\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this.handleClickOutside, false);\n }\n\n listRef: Ref = createRef();\n}\n","import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\nimport { customElement } from \"lit/decorators.js\";\nimport { getDomains } from \"./domains\";\nimport { html } from \"lit\";\nimport { ref } from \"lit/directives/ref.js\";\n\nexport type M2MAppsMenuProps = MenuBaseElementProps;\n\n@customElement(\"m2m-apps-menu\")\nexport class M2MAppsMenu extends MenuBaseElement {\n render() {\n const domains = getDomains();\n const additionalItems = this.additinalItems?.map((item) => {\n return html`\n <li>\n <a href=\"${item.href}\">${item.label}</a>\n </li>\n `;\n });\n const isHidden = this.expanded === false || this.expanded === undefined;\n return html`<nav>\n <button\n type=\"button\"\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\n aria-controls=\"m2m-apps-menu__navigation-drawer\"\n aria-expanded=${this.expanded}\n @click=${this.handleToggleDrawer}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"38px\"\n height=\"38px\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"\n />\n </svg>\n </button>\n <ul\n ${ref(this.listRef)}\n id=\"m2m-apps-menu__navigation-drawer\"\n aria-hidden=${isHidden}\n class=\"navigation-drawer\"\n >\n <li>\n <span>m2m Series</span>\n <ul>\n <li><a href=\"${domains.core}\">Core 施設管理</a></li>\n <li><a href=\"${domains.checkin}\">Checkin ゲストチェックイン</a></li>\n <li><a href=\"${domains.systems}\">Systems Airbnb連携</a></li>\n <li><a href=\"${domains.cleaning}\">Cleaning 清掃管理</a></li>\n <li><a href=\"${domains.inspection}\">Inspection 内見チェック</a></li>\n <li><a href=\"${domains.users}\">Users アカウント管理</a></li>\n </ul>\n </li>\n <li>\n <a href=\"${domains.sumyca}\">Sumyca マンスリープラットフォーム</a>\n </li>\n ${additionalItems}\n </ul>\n </nav>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"m2m-apps-menu\": M2MAppsMenu;\n }\n}\n","import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\nimport { customElement } from \"lit/decorators.js\";\nimport { getDomains } from \"./domains\";\nimport { html } from \"lit\";\nimport { m2mAuthTokenApi } from \"./storage/client\";\nimport { ref } from \"lit/directives/ref.js\";\n\nexport type M2MUserMenuProps = MenuBaseElementProps;\n\n@customElement(\"m2m-user-menu\")\nexport class M2MUserMenu extends MenuBaseElement {\n handleLogout = () => {\n void m2mAuthTokenApi.clear();\n window.location.reload();\n };\n\n render() {\n const domains = getDomains();\n const additionalItems = this.additinalItems?.map((item) => {\n return html`\n <li>\n <a href=\"${item.href}\">${item.label}</a>\n </li>\n `;\n });\n const isHidden = this.expanded === false || this.expanded === undefined;\n return html`<nav>\n <button\n type=\"button\"\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\n aria-controls=\"m2m-user-menu__navigation-drawer\"\n aria-expanded=${this.expanded}\n @click=${this.handleToggleDrawer}\n >\n <svg viewBox=\"0 0 24 24\" width=\"38px\" height=\"38px\" fill=\"#000000\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"\n />\n </svg>\n </button>\n <ul\n ${ref(this.listRef)}\n id=\"m2m-user-menu__navigation-drawer\"\n aria-hidden=${isHidden}\n class=\"navigation-drawer\"\n >\n <li><a href=\"${domains.users}\">アカウント情報</a></li>\n <li @click=${this.handleLogout}>\n <button type=\"button\">ログアウト</button>\n </li>\n ${additionalItems}\n </ul>\n </nav>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"m2m-user-menu\": M2MUserMenu;\n }\n}\n","import { Subscription } from \"./domain\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { m2mNotifications_v1 } from \"../endpoints/m2m-notifications.v1\";\n\nexport const requestUpdateNotificationStatusToRead = async (\n token: string,\n id: string,\n) => {\n await fetcher(\n m2mNotifications_v1.updateNotificationStatus({\n id,\n }),\n {\n method: \"PUT\",\n token,\n body: JSON.stringify({ status: \"read\" }),\n },\n );\n};\n\nexport const requestSubscribe = async (\n token: string,\n serviceId: string,\n input: Pick<Subscription, \"notificationType\" | \"resourceSubscription\">,\n) => {\n const { error } = await fetcher(m2mNotifications_v1.saveSubscription(), {\n method: \"POST\",\n token,\n body: JSON.stringify({\n ...input,\n serviceId,\n status: \"subscribed\",\n }),\n });\n if (error) {\n console.error(error);\n }\n};\n\nexport const requestUnSubscribe = async (\n token: string,\n serviceId: string,\n input: Pick<Subscription, \"notificationType\" | \"resourceSubscription\">,\n) => {\n const { error } = await fetcher(m2mNotifications_v1.saveSubscription(), {\n method: \"POST\",\n token,\n body: JSON.stringify({\n ...input,\n serviceId,\n status: \"denied\",\n }),\n });\n if (error) {\n console.error(error);\n }\n};\n","import React, { createContext, useMemo } from \"react\";\n\ninterface ServiceIdContextState {\n serviceId: string;\n}\n\nconst ServiceIdContext = createContext<ServiceIdContextState | undefined>(\n undefined,\n);\n\nexport const ServiceIdProvider = ({\n serviceId,\n children,\n}: {\n serviceId: string;\n children: React.ReactNode;\n}) => {\n const state = useMemo(() => ({ serviceId }), [serviceId]);\n\n return (\n <ServiceIdContext.Provider value={state}>\n {children}\n </ServiceIdContext.Provider>\n );\n};\n\nexport const useServiceId = () => {\n const context = React.useContext(ServiceIdContext);\n if (context === undefined) {\n throw new Error(\"useServiceId must be used within a ServiceIdProvider\");\n }\n return context.serviceId;\n};\n","import { Notification, Subscription, SubscriptionStatus } from \"./domain\";\nimport {\n PropsWithChildren,\n createContext,\n useCallback,\n useContext,\n} from \"react\";\nimport { m2mNotifications_v1 } from \"../endpoints/m2m-notifications.v1\";\nimport { useAuthFetch } from \"matsuri-hooks\";\nimport { useMemo } from \"react\";\nimport { useServiceId } from \"./ServiceIdProvider\";\n\nconst NotificationPermissionContext = createContext<\n | {\n checkPermission: (\n notificationType: string,\n ) => SubscriptionStatus | undefined;\n refetch: () => void;\n }\n | undefined\n>(undefined);\n\nconst NotificationsContext = createContext<\n | { notifications: Notification[]; isAllRead: boolean; refetch: () => void }\n | undefined\n>(undefined);\n\n// ServiceIdProviderの中で使うこと\nexport const NotificationsProvider = ({\n token,\n children,\n}: PropsWithChildren<{ token: string }>) => {\n const serviceId = useServiceId();\n\n const { data: subscriptions, refetch: refetchSubscriptions } = useAuthFetch<\n Subscription[]\n >(token, m2mNotifications_v1.findMySubscriptions(), {});\n const checkPermission = useCallback(\n (notificationType: string) => {\n const subscription = subscriptions?.find((item) => {\n return (\n item.serviceId === serviceId &&\n item.notificationType === notificationType &&\n item.resourceSubscription.resourceSelectType === \"any\"\n );\n });\n\n return subscription?.status;\n },\n [serviceId, subscriptions],\n );\n\n const {\n data: notifications,\n error,\n refetch: refetchNotifications,\n } = useAuthFetch<{ data: Notification[] }>(\n token,\n m2mNotifications_v1.findNotificationsByServiceId({ id: serviceId }),\n { swrConfig: { refreshInterval: 1000 * 60 * 5 } },\n );\n if (error) {\n // エラーが出てもユーザーは特に困らないので、ユーザーに伝える必要はないが、監視は必要。\n console.error(error);\n }\n\n const permissionContextState = useMemo(() => {\n return {\n checkPermission,\n refetch: refetchSubscriptions,\n };\n }, [checkPermission, refetchSubscriptions]);\n\n const notificationsContextState = useMemo(() => {\n return {\n notifications: notifications?.data ?? [],\n isAllRead: notifications?.data.every((n) => n.status === \"read\") ?? true,\n refetch: refetchNotifications,\n };\n }, [refetchNotifications, notifications?.data]);\n\n return (\n <NotificationPermissionContext.Provider value={permissionContextState}>\n <NotificationsContext.Provider value={notificationsContextState}>\n {children}\n </NotificationsContext.Provider>\n </NotificationPermissionContext.Provider>\n );\n};\n\nexport const useNotifications = () => {\n const ctx = useContext(NotificationsContext);\n if (!ctx) {\n throw new Error(\"NotificatoinProvider is not found\");\n }\n\n return ctx;\n};\n\nexport const useNotificationPermission = () => {\n const ctx = useContext(NotificationPermissionContext);\n if (!ctx) {\n throw new Error(\"NotificatoinProvider is not found\");\n }\n\n return ctx;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,aAAa,MAAM;AAC9B,SAAO,WAAW,uBAAuB,eACrC;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,EACX,IACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACN;;;ACpBA,IAAAA,qBAQO;AAEP,+BAKO;;;ACdP,wBAAkC;AAM9B;;;ADUJ,mBAAuE;;;AEjBvE,IAAAC,qBAAyB;AAaf,IAAAC,sBAAA;;;AFOV,sBAA6B;AAmCzB,IAAAC,sBAAA;AA8HgB,IAAAC,gBAAA;AAvJpB,IAAM,gBAAgB,CAAK,SAAe;AAExC,SAAS,KAAa,UAAW,KAAa,UAAU;AAC1D;AACA,IAAM,eAAe,cAAc,gBAAAC,OAAgB;AAgBnD,IAAM,0BAAsB,4BAAwC,CAAC,CAAC;;;AG5CtE,IAAM,UAEF,CAAC;AAOL,IAAM,aAAa,OAAO,UAAU,QAAS;AAC3C,QAAM,UAAU,MAAM,IAAI,QAA0B,CAAC,SAAS,WAAW;AACvE,UAAM,cAAc,WAAW,WAAW,WAAY;AACpD;AAAA,QACE,IAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,OAAO;AAEV,UAAMC,WAAU,QAAQ;AACxB,QAAIA,UAAS;AACX,iBAAW,aAAa,WAAW;AACnC,cAAQA,QAAO;AAAA,IACjB;AAEA,UAAM,QAAQ,WAAW,YAAY,MAAM;AACzC,YAAMA,WAAU,QAAQ;AACxB,UAAIA,UAAS;AACX,mBAAW,aAAa,WAAW;AACnC,mBAAW,cAAc,KAAK;AAC9B,gBAAQA,QAAO;AAAA,MACjB;AAAA,IACF,GAAG,GAAG;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,UAAU;AAExB,SAAO;AACT;AA4BO,IAAM,qBAAqB;AAElC,IAAM,oBAAoB,MAAM;AAC9B,SAAO,WAAW,aAAa,QAAQ,kBAAkB;AAC3D;AAEA,IAAM,eAAe,YAAY;AAC/B,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YAAa,MAAM,QAAQ,IAAI,kBAAkB;AACvD,WAAO,aAAa,kBAAkB;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAClB,WAAO,kBAAkB;AAAA,EAC3B;AACF;AAEA,IAAM,eAAe,OAAO,UAAkB;AAC5C,aAAW,aAAa,QAAQ,oBAAoB,KAAK;AACzD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,oBAAoB,KAAK;AAAA,EAC7C,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEA,IAAM,iBAAiB,YAAY;AACjC,aAAW,aAAa,WAAW,kBAAkB;AACrD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AACT;;;AClHA,iBAAgC;AAChC,iBAA+B;AAC/B,wBAAyB;AAYlB,IAAM,kBAAN,cAA8B,sBAAW;AAAA,EAAzC;AAAA;AAsGL,8BAAqB,CAAC,UAAmC;AACvD,UACE,CAAC,KAAK,QAAQ,SACd,KAAK,QAAQ,MAAM,SAAS,MAAM,aAAa,EAAE,CAAC,CAAS,GAC3D;AACA;AAAA,MACF;AACA,WAAK,WAAW;AAAA,IAClB;AAMA,0BAAyD,CAAC;AAG1D,oBAAqB;AAErB,8BAAqB,CAAC,UAAiB;AACrC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAGtB,WAAK,WAAW,CAAC,KAAK;AACtB,UAAI,KAAK,UAAU;AACjB,eAAO,iBAAiB,SAAS,KAAK,oBAAoB,KAAK;AAAA,MACjE;AAAA,IACF;AAaA,uBAAe,sBAAU;AAAA;AAAA,EAXf,UAAU;AAClB,QAAI,KAAK,aAAa,OAAO;AAC3B,aAAO,oBAAoB,SAAS,KAAK,oBAAoB,KAAK;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAqB;AAC3B,WAAO,oBAAoB,SAAS,KAAK,oBAAoB,KAAK;AAAA,EACpE;AAGF;AAhJa,gBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmHhB;AAAA,MAJC,4BAAS;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,EACb,CAAC;AAAA,GAnHU,gBAoHX;AAGA;AAAA,MADC,4BAAS;AAAA,GAtHC,gBAuHX;;;ACpIF,IAAAC,qBAA8B;AAE9B,IAAAC,cAAqB;AACrB,IAAAC,cAAoB;AAKb,IAAM,cAAN,cAA0B,gBAAgB;AAAA,EAC/C,SAAS;AAVX;AAWI,UAAM,UAAU,WAAW;AAC3B,UAAM,mBAAkB,UAAK,mBAAL,mBAAqB,IAAI,CAAC,SAAS;AACzD,aAAO;AAAA;AAAA,qBAEQ,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA;AAAA;AAAA,IAGzC;AACA,UAAM,WAAW,KAAK,aAAa,SAAS,KAAK,aAAa;AAC9D,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKa,KAAK,QAAQ;AAAA,iBACpB,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAc9B,iBAAI,KAAK,OAAO,CAAC;AAAA;AAAA,sBAEL,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAMH,QAAQ,IAAI;AAAA,2BACZ,QAAQ,OAAO;AAAA,2BACf,QAAQ,OAAO;AAAA,2BACf,QAAQ,QAAQ;AAAA,2BAChB,QAAQ,UAAU;AAAA,2BAClB,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,qBAInB,QAAQ,MAAM;AAAA;AAAA,UAEzB,eAAe;AAAA;AAAA;AAAA,EAGvB;AACF;AAtDa,cAAN;AAAA,MADN,kCAAc,eAAe;AAAA,GACjB;;;ACRb,IAAAC,qBAA8B;AAE9B,IAAAC,cAAqB;AAErB,IAAAC,cAAoB;AAKb,IAAM,cAAN,cAA0B,gBAAgB;AAAA,EAA1C;AAAA;AACL,wBAAe,MAAM;AACnB,WAAK,gBAAgB,MAAM;AAC3B,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA;AAAA,EAEA,SAAS;AAhBX;AAiBI,UAAM,UAAU,WAAW;AAC3B,UAAM,mBAAkB,UAAK,mBAAL,mBAAqB,IAAI,CAAC,SAAS;AACzD,aAAO;AAAA;AAAA,qBAEQ,KAAK,IAAI,KAAK,KAAK,KAAK;AAAA;AAAA;AAAA,IAGzC;AACA,UAAM,WAAW,KAAK,aAAa,SAAS,KAAK,aAAa;AAC9D,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKa,KAAK,QAAQ;AAAA,iBACpB,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAU9B,iBAAI,KAAK,OAAO,CAAC;AAAA;AAAA,sBAEL,QAAQ;AAAA;AAAA;AAAA,uBAGP,QAAQ,KAAK;AAAA,qBACf,KAAK,YAAY;AAAA;AAAA;AAAA,UAG5B,eAAe;AAAA;AAAA;AAAA,EAGvB;AACF;AA7Ca,cAAN;AAAA,MADN,kCAAc,eAAe;AAAA,GACjB;;;ACTb,2BAAwB;;;ACDxB,IAAAC,gBAA8C;AAoB1C,IAAAC,sBAAA;AAdJ,IAAM,uBAAmB;AAAA,EACvB;AACF;;;ACPA,IAAAC,gBAKO;AAEP,IAAAC,wBAA6B;AAC7B,IAAAC,gBAAwB;AA0ElB,IAAAC,sBAAA;AAvEN,IAAM,oCAAgC,6BAQpC,MAAS;AAEX,IAAM,2BAAuB,6BAG3B,MAAS;","names":["import_matsuri_ui","import_matsuri_ui","import_jsx_runtime","import_jsx_runtime","import_react","FeedbackIconBase","storage","import_decorators","import_lit","import_ref","import_decorators","import_lit","import_ref","import_react","import_jsx_runtime","import_react","import_matsuri_hooks","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/domains.ts","../src/feedback/index.tsx","../src/feedback/MultipleTextQuestion.tsx","../src/feedback/SelectQuestion.tsx","../src/storage/client.ts","../src/MenuBaseElement.ts","../src/m2m-apps-menu.ts","../src/m2m-user-menu.ts","../src/notification/api.ts","../src/notification/ServiceIdProvider.tsx","../src/notification/NotificationProvider.tsx"],"sourcesContent":["export const getDomains = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? {\n core: \"https://core.m2msystems.cloud\",\n sumyca: \"https://manage.sumyca.com\",\n cleaning: \"https://manager-cleaning.m2msystems.cloud\",\n users: \"https://manage-users.m2msystems.cloud\",\n inspection: \"https://inspection.m2msystems.cloud\",\n checkin: \"https://manage.checkin.m2msystems.cloud\",\n systems: \"https://m2msystems.cloud/\",\n }\n : {\n core: \"https://dev--m2m-core-manager-front.netlify.app\",\n sumyca: \"https://dev--sumyca-manager-front.netlify.app\",\n cleaning: \"https://dev--m2m-cleaning-manager-front.netlify.app\",\n users: \"https://dev--manage-users.netlify.app\",\n inspection: \"https://dev--m2m-inspection-manager-front.netlify.app\",\n checkin: \"https://manage.dev.checkin.m2msystems.cloud\",\n systems: \"https://dev.m2msystems.cloud\",\n };\n};\n","import {\n Button,\n Modal,\n ModalProps,\n Portal,\n Typography,\n useAlert,\n useModal,\n} from \"matsuri-ui\";\nimport { type Logger } from \"@datadog/browser-logs\";\nimport {\n MatsuriFormsQuestion,\n MatsuriFormsQuestionProvider,\n MatsuriFormsTextQuestionProps,\n useMatsuriForms,\n} from \"matsuri-forms-sdk\";\nimport { MultipleTextQuestion } from \"./MultipleTextQuestion\";\nimport { PropsWithChildren, createContext, useContext, useState } from \"react\";\nimport { SelectQuestion } from \"./SelectQuestion\";\nimport { getRandomId } from \"./getRandomId\";\nimport FeedbackIconBase from \"@mui/icons-material/Feedback\";\n\n/**\n * これはワークアラウンドです。\n * これを行わずに、MuiIconをそのまま使うと、トランスパイル後のコードで次のようなエラーが発生し、コンポーネントを描画できなくなります。\n * `Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.`\n * 関連リンク:\n * https://stackoverflow.com/questions/72008357/mui-icons-used-in-shared-react-component-library-wont-render-error-element-ty\n * https://github.com/mui/material-ui/issues/35535\n */\nconst normalizeIcon = <T,>(Icon: T): T => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n return ((Icon as any).default ? (Icon as any).default : Icon) as T;\n};\nconst FeedbackIcon = normalizeIcon(FeedbackIconBase);\n\nconst getFormId = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? \"01GWRQ1MRS7PE29XGRETFZ6D7Y\"\n : \"01GTBSYMGPMX91E96P007SXEMH\";\n};\n\ninterface TextQuestionContextValue {\n userId?: string;\n userName?: string;\n serviceName?: string;\n url?: string;\n id?: string;\n}\n\nconst TextQuestionContext = createContext<TextQuestionContextValue>({});\n\nconst TextQuestion = (props: MatsuriFormsTextQuestionProps) => {\n const context = useContext(TextQuestionContext);\n return (\n <input\n value={context[props.title as keyof TextQuestionContextValue]}\n type=\"hidden\"\n name={props.name}\n />\n );\n};\n\ninterface FeedbackProviderModalProps\n extends Partial<ModalProps>,\n FeedbackProviderProps {}\n\nconst FeedbackProviderModal = (props: FeedbackProviderModalProps) => {\n const { questions, submit } = useMatsuriForms(getFormId(), {\n dev: globalThis.M2M_COMPONENTS_ENV !== \"production\",\n });\n\n const { throwAlert } = useAlert();\n\n const [status, setStatus] = useState<\"started\" | \"sending\" | \"completed\">(\n \"started\",\n );\n\n const id = getRandomId();\n\n return (\n <Modal\n backdrop\n width={600}\n maxWidth={600}\n header={<Typography variant=\"h3\">フィードバックを送信</Typography>}\n body={\n status === \"completed\" ? (\n <div\n style={{\n display: \"grid\",\n gap: 32,\n }}\n >\n <Typography>\n レポートを送信しました。ありがとうございます。\n </Typography>\n <Typography color=\"textSecondary\" variant=\"caption\" as=\"p\">\n お送りいただいたフィードバックは、問題の解決とサービスの改善に役立てさせていただきます。\n </Typography>\n <Button\n color=\"primary\"\n variant=\"filled\"\n onClick={() => {\n props.onClose?.();\n }}\n >\n 閉じる\n </Button>\n </div>\n ) : (\n <form\n style={{\n display: \"grid\",\n gap: 24,\n }}\n onSubmit={async (event) => {\n event.preventDefault();\n setStatus(\"sending\");\n const { error } = await submit(event.currentTarget);\n\n /**\n * 以下、対応が行われるまでは取れる値だけ送る\n * https://github.com/matsuri-tech/matsuri-forms-manager-front/issues/265\n */\n const input = {\n id,\n userId: props.userId,\n userName: props.userName,\n serviceName: props.serviceName,\n url: window.location.href,\n };\n throwAlert(error, {\n ignoreSuccess: true,\n errorMessage: {\n reason: \"サーバー側のエラーの可能性があります。\",\n action:\n \"しばらく時間を空けて試すか、開発チームへお問い合わせください。\",\n happend: \"フィードバックの送信に失敗しました。\",\n },\n onSuccess: () => {\n props.datadogLogs?.logger?.info?.(\n `Feedback: ${id} by ${props.userId}`,\n {\n input,\n },\n );\n\n window.setTimeout(() => {\n setStatus(\"completed\");\n }, 2000);\n },\n onError: () => {\n props.datadogLogs?.logger?.error?.(\n `Failed Feedback: ${input.id} by ${input.userId}`,\n { input, error },\n );\n\n window.setTimeout(() => {\n setStatus(\"started\");\n }, 2000);\n },\n });\n }}\n >\n <TextQuestionContext.Provider\n value={{\n userId: props.userId,\n userName: props.userName,\n serviceName: props.serviceName,\n url: window.location.href,\n id,\n }}\n >\n <MatsuriFormsQuestionProvider\n renderSelect={SelectQuestion}\n renderMultilineText={MultipleTextQuestion}\n renderText={TextQuestion}\n >\n {questions.map((question) => {\n return (\n <MatsuriFormsQuestion {...question} key={question.id} />\n );\n })}\n </MatsuriFormsQuestionProvider>\n </TextQuestionContext.Provider>\n <div>\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"filled\"\n disabled={status === \"sending\"}\n fullWidth\n >\n 送信\n </Button>\n <Typography\n variant=\"caption\"\n style={{\n float: \"right\",\n }}\n >\n {status === \"sending\" ? \"送信中...\" : undefined}\n \n </Typography>\n </div>\n </form>\n )\n }\n {...props}\n />\n );\n};\n\ninterface FeedbackProviderProps {\n userId?: string;\n userName?: string;\n serviceName: string;\n datadogLogs?: {\n logger: Logger;\n };\n}\n\nexport const FeedbackProvider = ({\n children,\n ...modalProps\n}: PropsWithChildren<FeedbackProviderProps>) => {\n const [open] = useModal(FeedbackProviderModal, {\n enableClickOutside: true,\n disableClose: false,\n });\n return (\n <div>\n {children}\n <Portal>\n <Button\n style={{\n position: \"fixed\",\n bottom: 16,\n right: 16,\n }}\n onClick={() => {\n open(modalProps);\n }}\n type=\"button\"\n icon={<FeedbackIcon />}\n color=\"secondary\"\n variant=\"filled\"\n rounded\n />\n </Portal>\n </div>\n );\n};\n","import { MatsuriFormsMultilineTextQuestionProps } from \"matsuri-forms-sdk\";\nimport { MultipleTextField } from \"matsuri-ui\";\n\nexport const MultipleTextQuestion = (\n props: MatsuriFormsMultilineTextQuestionProps,\n) => {\n return (\n <MultipleTextField\n label=\"問題や提案について説明してください\"\n required={props.required}\n name={props.name}\n rows={6}\n helperText=\"現在開いているページのURLは自動的に送信されるため記載不要です\"\n />\n );\n};\n","import { Checkbox } from \"matsuri-ui\";\nimport { MatsuriFormsSelectQuestionProps } from \"matsuri-forms-sdk\";\n\nexport const SelectQuestion = (props: MatsuriFormsSelectQuestionProps) => {\n return (\n <div\n style={{\n display: \"flex\",\n gap: 16,\n }}\n >\n {props.options.map((option) => {\n return (\n <Checkbox\n defaultChecked\n type=\"radio\"\n name={props.name}\n value={option.value}\n key={option.value}\n >\n {option.label}\n </Checkbox>\n );\n })}\n </div>\n );\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { LitElement, css } from \"lit\";\r\nimport { Ref, createRef } from \"lit/directives/ref.js\";\r\nimport { property } from \"lit/decorators.js\";\r\n\r\nexport interface MenuAdditionalItem {\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface MenuBaseElementProps {\r\n expanded: boolean;\r\n additinalItems: MenuAdditionalItem[];\r\n}\r\n\r\nexport class MenuBaseElement extends LitElement {\r\n static styles = css`\r\n nav {\r\n position: relative;\r\n display: flex;\r\n }\r\n .navigation-drawer-controll-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n height: 42px;\r\n padding: 0;\r\n cursor: pointer;\r\n background-color: transparent;\r\n border: none;\r\n transition: background-color 0.2s;\r\n appearance: none;\r\n }\r\n .navigation-drawer-controll-button.navigation-drawer-controll-button--icon {\r\n width: 42px;\r\n }\r\n .navigation-drawer-controll-button:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n .navigation-drawer-controll-button:active {\r\n background-color: rgba(0, 0, 0, 0.075);\r\n }\r\n\r\n .navigation-drawer {\r\n position: absolute;\r\n top: 100%;\r\n right: 0px;\r\n z-index: 1100;\r\n box-sizing: border-box;\r\n min-width: 200px;\r\n padding: 0px;\r\n margin: 0px;\r\n overflow: hidden;\r\n color: rgba(0, 0, 0, 0.87);\r\n white-space: nowrap;\r\n list-style: none;\r\n background-color: #fff;\r\n border-radius: 5px;\r\n box-shadow:\r\n 0px 1px 3px 0px rgb(0 0 0 / 20%),\r\n 0px 1px 1px 0px rgb(0 0 0 / 14%),\r\n 0px 2px 1px -1px rgb(0 0 0 / 12%);\r\n }\r\n .navigation-drawer-controll-button[aria-expanded=\"false\"]\r\n ~ .navigation-drawer {\r\n display: none;\r\n }\r\n\r\n .navigation-drawer li {\r\n border-bottom: 1px solid #eeeeee;\r\n }\r\n .navigation-drawer li:last-of-type {\r\n border-bottom: none;\r\n }\r\n .navigation-drawer li > a,\r\n .navigation-drawer li > button {\r\n box-sizing: border-box;\r\n display: block;\r\n width: 100%;\r\n padding: 0;\r\n padding: 0.6em 1em;\r\n font: inherit;\r\n color: inherit;\r\n text-align: left;\r\n text-decoration: none;\r\n cursor: pointer;\r\n cursor: pointer;\r\n background-color: transparent;\r\n border: none;\r\n transition: 0.2s;\r\n appearance: none;\r\n }\r\n .navigation-drawer li > a:hover,\r\n .navigation-drawer li > button:hover {\r\n background-color: #ededed;\r\n }\r\n .navigation-drawer li > a:active,\r\n .navigation-drawer li > button:active {\r\n background-color: #dadada;\r\n }\r\n\r\n .navigation-drawer li ul {\r\n padding: 0;\r\n list-style: none;\r\n }\r\n .navigation-drawer li:has(> ul) li > a {\r\n padding-left: 2em;\r\n }\r\n\r\n .navigation-drawer li:has(> ul) > span {\r\n display: block;\r\n padding: 0.6em 1em;\r\n border-bottom: 1px solid #eeeeee;\r\n }\r\n `;\r\n\r\n handleClickOutside = (event: MouseEvent | TouchEvent) => {\r\n if (\r\n !this.listRef.value ||\r\n this.listRef.value.contains(event.composedPath()[0] as Node)\r\n ) {\r\n return;\r\n }\r\n this.expanded = false;\r\n };\r\n\r\n @property({\r\n type: Object,\r\n attribute: \"additional-items\",\r\n })\r\n additinalItems: MenuBaseElementProps[\"additinalItems\"] = [];\r\n\r\n @property()\r\n expanded?: boolean = false;\r\n\r\n handleToggleDrawer = (event: Event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\r\n this.expanded = !this.expanded;\r\n if (this.expanded) {\r\n window.addEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n };\r\n\r\n protected updated() {\r\n if (this.expanded === false) {\r\n window.removeEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n window.removeEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n\r\n listRef: Ref = createRef();\r\n}\r\n","import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\r\nimport { customElement } from \"lit/decorators.js\";\r\nimport { getDomains } from \"./domains\";\r\nimport { html } from \"lit\";\r\nimport { ref } from \"lit/directives/ref.js\";\r\n\r\nexport type M2MAppsMenuProps = MenuBaseElementProps;\r\n\r\n@customElement(\"m2m-apps-menu\")\r\nexport class M2MAppsMenu extends MenuBaseElement {\r\n render() {\r\n const domains = getDomains();\r\n const additionalItems = this.additinalItems?.map((item) => {\r\n return html`\r\n <li>\r\n <a href=\"${item.href}\">${item.label}</a>\r\n </li>\r\n `;\r\n });\r\n const isHidden = this.expanded === false || this.expanded === undefined;\r\n return html`<nav>\r\n <button\r\n type=\"button\"\r\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\r\n aria-controls=\"m2m-apps-menu__navigation-drawer\"\r\n aria-expanded=${this.expanded}\r\n @click=${this.handleToggleDrawer}\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"38px\"\r\n height=\"38px\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n ${ref(this.listRef)}\r\n id=\"m2m-apps-menu__navigation-drawer\"\r\n aria-hidden=${isHidden}\r\n class=\"navigation-drawer\"\r\n >\r\n <li>\r\n <span>m2m Series</span>\r\n <ul>\r\n <li><a href=\"${domains.core}\">Core 施設管理</a></li>\r\n <li><a href=\"${domains.checkin}\">Checkin ゲストチェックイン</a></li>\r\n <li><a href=\"${domains.systems}\">Systems Airbnb連携</a></li>\r\n <li><a href=\"${domains.cleaning}\">Cleaning 清掃管理</a></li>\r\n <li><a href=\"${domains.inspection}\">Inspection 内見チェック</a></li>\r\n <li><a href=\"${domains.users}\">Users アカウント管理</a></li>\r\n </ul>\r\n </li>\r\n <li>\r\n <a href=\"${domains.sumyca}\">Sumyca マンスリープラットフォーム</a>\r\n </li>\r\n ${additionalItems}\r\n </ul>\r\n </nav>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m2m-apps-menu\": M2MAppsMenu;\r\n }\r\n}\r\n","import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\r\nimport { customElement } from \"lit/decorators.js\";\r\nimport { getDomains } from \"./domains\";\r\nimport { html } from \"lit\";\r\nimport { m2mAuthTokenApi } from \"./storage/client\";\r\nimport { ref } from \"lit/directives/ref.js\";\r\n\r\nexport type M2MUserMenuProps = MenuBaseElementProps;\r\n\r\n@customElement(\"m2m-user-menu\")\r\nexport class M2MUserMenu extends MenuBaseElement {\r\n handleLogout = () => {\r\n void m2mAuthTokenApi.clear();\r\n window.location.reload();\r\n };\r\n\r\n render() {\r\n const domains = getDomains();\r\n const additionalItems = this.additinalItems?.map((item) => {\r\n return html`\r\n <li>\r\n <a href=\"${item.href}\">${item.label}</a>\r\n </li>\r\n `;\r\n });\r\n const isHidden = this.expanded === false || this.expanded === undefined;\r\n return html`<nav>\r\n <button\r\n type=\"button\"\r\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\r\n aria-controls=\"m2m-user-menu__navigation-drawer\"\r\n aria-expanded=${this.expanded}\r\n @click=${this.handleToggleDrawer}\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"38px\" height=\"38px\" fill=\"#000000\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path\r\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n ${ref(this.listRef)}\r\n id=\"m2m-user-menu__navigation-drawer\"\r\n aria-hidden=${isHidden}\r\n class=\"navigation-drawer\"\r\n >\r\n <li><a href=\"${domains.users}\">アカウント情報</a></li>\r\n <li @click=${this.handleLogout}>\r\n <button type=\"button\">ログアウト</button>\r\n </li>\r\n ${additionalItems}\r\n </ul>\r\n </nav>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m2m-user-menu\": M2MUserMenu;\r\n }\r\n}\r\n","import { Subscription } from \"./domain\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { m2mNotifications_v1 } from \"../endpoints/m2m-notifications.v1\";\n\nexport const requestUpdateNotificationStatusToRead = async (\n token: string,\n id: string,\n) => {\n await fetcher(\n m2mNotifications_v1.updateNotificationStatus({\n id,\n }),\n {\n method: \"PUT\",\n token,\n body: JSON.stringify({ status: \"read\" }),\n },\n );\n};\n\nexport const requestSubscribe = async (\n token: string,\n serviceId: string,\n input: Pick<Subscription, \"notificationType\" | \"resourceSubscription\">,\n) => {\n const { error } = await fetcher(m2mNotifications_v1.saveSubscription(), {\n method: \"POST\",\n token,\n body: JSON.stringify({\n ...input,\n serviceId,\n status: \"subscribed\",\n }),\n });\n if (error) {\n console.error(error);\n }\n};\n\nexport const requestUnSubscribe = async (\n token: string,\n serviceId: string,\n input: Pick<Subscription, \"notificationType\" | \"resourceSubscription\">,\n) => {\n const { error } = await fetcher(m2mNotifications_v1.saveSubscription(), {\n method: \"POST\",\n token,\n body: JSON.stringify({\n ...input,\n serviceId,\n status: \"denied\",\n }),\n });\n if (error) {\n console.error(error);\n }\n};\n","import React, { createContext, useMemo } from \"react\";\n\ninterface ServiceIdContextState {\n serviceId: string;\n}\n\nconst ServiceIdContext = createContext<ServiceIdContextState | undefined>(\n undefined,\n);\n\nexport const ServiceIdProvider = ({\n serviceId,\n children,\n}: {\n serviceId: string;\n children: React.ReactNode;\n}) => {\n const state = useMemo(() => ({ serviceId }), [serviceId]);\n\n return (\n <ServiceIdContext.Provider value={state}>\n {children}\n </ServiceIdContext.Provider>\n );\n};\n\nexport const useServiceId = () => {\n const context = React.useContext(ServiceIdContext);\n if (context === undefined) {\n throw new Error(\"useServiceId must be used within a ServiceIdProvider\");\n }\n return context.serviceId;\n};\n","import { Notification, Subscription, SubscriptionStatus } from \"./domain\";\nimport {\n PropsWithChildren,\n createContext,\n useCallback,\n useContext,\n} from \"react\";\nimport { m2mNotifications_v1 } from \"../endpoints/m2m-notifications.v1\";\nimport { useAuthFetch } from \"matsuri-hooks\";\nimport { useMemo } from \"react\";\nimport { useServiceId } from \"./ServiceIdProvider\";\n\nconst NotificationPermissionContext = createContext<\n | {\n checkPermission: (\n notificationType: string,\n ) => SubscriptionStatus | undefined;\n refetch: () => void;\n }\n | undefined\n>(undefined);\n\nconst NotificationsContext = createContext<\n | { notifications: Notification[]; isAllRead: boolean; refetch: () => void }\n | undefined\n>(undefined);\n\n// ServiceIdProviderの中で使うこと\nexport const NotificationsProvider = ({\n token,\n children,\n}: PropsWithChildren<{ token: string }>) => {\n const serviceId = useServiceId();\n\n const { data: subscriptions, refetch: refetchSubscriptions } = useAuthFetch<\n Subscription[]\n >(token, m2mNotifications_v1.findMySubscriptions(), {});\n const checkPermission = useCallback(\n (notificationType: string) => {\n const subscription = subscriptions?.find((item) => {\n return (\n item.serviceId === serviceId &&\n item.notificationType === notificationType &&\n item.resourceSubscription.resourceSelectType === \"any\"\n );\n });\n\n return subscription?.status;\n },\n [serviceId, subscriptions],\n );\n\n const {\n data: notifications,\n error,\n refetch: refetchNotifications,\n } = useAuthFetch<{ data: Notification[] }>(\n token,\n m2mNotifications_v1.findNotificationsByServiceId({ id: serviceId }),\n { swrConfig: { refreshInterval: 1000 * 60 * 5 } },\n );\n if (error) {\n // エラーが出てもユーザーは特に困らないので、ユーザーに伝える必要はないが、監視は必要。\n console.error(error);\n }\n\n const permissionContextState = useMemo(() => {\n return {\n checkPermission,\n refetch: refetchSubscriptions,\n };\n }, [checkPermission, refetchSubscriptions]);\n\n const notificationsContextState = useMemo(() => {\n return {\n notifications: notifications?.data ?? [],\n isAllRead: notifications?.data.every((n) => n.status === \"read\") ?? true,\n refetch: refetchNotifications,\n };\n }, [refetchNotifications, notifications?.data]);\n\n return (\n <NotificationPermissionContext.Provider value={permissionContextState}>\n <NotificationsContext.Provider value={notificationsContextState}>\n {children}\n </NotificationsContext.Provider>\n </NotificationPermissionContext.Provider>\n );\n};\n\nexport const useNotifications = () => {\n const ctx = useContext(NotificationsContext);\n if (!ctx) {\n throw new Error(\"NotificatoinProvider is not found\");\n }\n\n return ctx;\n};\n\nexport const useNotificationPermission = () => {\n const ctx = useContext(NotificationPermissionContext);\n if (!ctx) {\n throw new Error(\"NotificatoinProvider is not found\");\n }\n\n return ctx;\n};\n"],"mappings":"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","names":["import_matsuri_ui","import_matsuri_ui","import_jsx_runtime","import_jsx_runtime","import_react","FeedbackIconBase","storage","import_decorators","import_lit","import_ref","import_decorators","import_lit","import_ref","import_react","import_jsx_runtime","import_react","import_matsuri_hooks","import_react","import_jsx_runtime"]}
|
package/index.mjs
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
import "./chunk-
|
|
2
|
+
import "./chunk-H6D6RG6X.mjs";
|
|
3
3
|
import "./chunk-GHZTTY3R.mjs";
|
|
4
|
-
import "./chunk-RDG67OF7.mjs";
|
|
5
|
-
import "./chunk-IH72EYIB.mjs";
|
|
6
4
|
import "./chunk-IOZIVEOV.mjs";
|
|
7
|
-
import "./chunk-V65OEKRZ.mjs";
|
|
8
|
-
import "./chunk-ARKJVMNQ.mjs";
|
|
9
5
|
import "./chunk-JTZEHJPB.mjs";
|
|
10
6
|
import "./chunk-YUHXVW6K.mjs";
|
|
7
|
+
import "./chunk-V65OEKRZ.mjs";
|
|
8
|
+
import "./chunk-ARKJVMNQ.mjs";
|
|
11
9
|
import "./chunk-M2D55I4L.mjs";
|
|
10
|
+
import "./chunk-DJMCUABY.mjs";
|
|
12
11
|
import "./chunk-SXIYWN76.mjs";
|
|
13
12
|
import "./chunk-CTGSJWXT.mjs";
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-IH72EYIB.mjs";
|
|
14
|
+
import "./chunk-FK5456TR.mjs";
|
|
15
|
+
import "./chunk-3LXMUAGW.mjs";
|
|
16
|
+
import "./chunk-2F7MVYJV.mjs";
|
|
17
|
+
import "./chunk-5DZIFMOT.mjs";
|
|
18
18
|
import "./chunk-PB3E5UQP.mjs";
|
|
19
|
-
import "./chunk-HI2D4CLX.mjs";
|
|
20
19
|
import "./chunk-B7STDXYN.mjs";
|
|
20
|
+
import "./chunk-6YUMRFSL.mjs";
|
|
21
21
|
import "./chunk-QH5I6YL2.mjs";
|
|
22
22
|
//# sourceMappingURL=index.mjs.map
|
package/initM2mComponents.js
CHANGED
|
@@ -179,7 +179,6 @@ var StorageClient = class {
|
|
|
179
179
|
// src/storage/client.ts
|
|
180
180
|
var M2mStorageClient = class extends StorageClient {
|
|
181
181
|
};
|
|
182
|
-
var context = {};
|
|
183
182
|
var getStorage = async (timeout = 5e3) => {
|
|
184
183
|
const storage = await new Promise((resolve, reject) => {
|
|
185
184
|
const rejectTimer = globalThis.setTimeout(function() {
|
|
@@ -189,13 +188,13 @@ var getStorage = async (timeout = 5e3) => {
|
|
|
189
188
|
)
|
|
190
189
|
);
|
|
191
190
|
}, timeout);
|
|
192
|
-
const storage2 =
|
|
191
|
+
const storage2 = globalThis.M2M_STORAGE;
|
|
193
192
|
if (storage2) {
|
|
194
193
|
globalThis.clearTimeout(rejectTimer);
|
|
195
194
|
resolve(storage2);
|
|
196
195
|
}
|
|
197
196
|
const timer = globalThis.setInterval(() => {
|
|
198
|
-
const storage3 =
|
|
197
|
+
const storage3 = globalThis.M2M_STORAGE;
|
|
199
198
|
if (storage3) {
|
|
200
199
|
globalThis.clearTimeout(rejectTimer);
|
|
201
200
|
globalThis.clearInterval(timer);
|
|
@@ -209,7 +208,7 @@ var getStorage = async (timeout = 5e3) => {
|
|
|
209
208
|
var M2M_STORAGE_HUB_URL = "https://hub.m2msystems.cloud/";
|
|
210
209
|
var M2M_STORAGE_HUB_URL_DEV = "https://m2m-components-storage-hub-dev.netlify.app/";
|
|
211
210
|
var initStorageClient = (options) => {
|
|
212
|
-
if (
|
|
211
|
+
if (globalThis.M2M_STORAGE) {
|
|
213
212
|
throw new Error(
|
|
214
213
|
"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times."
|
|
215
214
|
);
|
|
@@ -217,7 +216,7 @@ var initStorageClient = (options) => {
|
|
|
217
216
|
const storage = new M2mStorageClient(
|
|
218
217
|
(options == null ? void 0 : options.env) === "production" ? M2M_STORAGE_HUB_URL : M2M_STORAGE_HUB_URL_DEV
|
|
219
218
|
);
|
|
220
|
-
|
|
219
|
+
globalThis.M2M_STORAGE = storage;
|
|
221
220
|
};
|
|
222
221
|
var m2mStorageClient = {
|
|
223
222
|
init: initStorageClient,
|
package/initM2mComponents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/initM2mComponents.ts","../src/storage/lib/client.ts","../src/storage/client.ts"],"sourcesContent":["import { m2mStorageClient } from \"./storage/client\";\n\ntype Env = \"development\" | \"production\" | \"local\" | \"localDev\";\n\ninterface InitM2mComponentsArgs {\n env: Env;\n}\n\nexport const initM2mComponents = (args: InitM2mComponentsArgs) => {\n m2mStorageClient.init({\n env: args.env === \"production\" ? \"production\" : \"development\",\n });\n if (globalThis.M2M_COMPONENTS_ENV === undefined) {\n globalThis.M2M_COMPONENTS_ENV = args.env;\n }\n};\n","/**\n * この実装はcross-storageほぼそのままです。\n */\nconst generateUUID = () => {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\n\n return v.toString(16);\n });\n};\nexport class StorageClient {\n id: string;\n frameId: string;\n origin: string;\n requests: Record<string, any>;\n connected: boolean;\n closed: boolean;\n count: number;\n timeout: number;\n hub: null | Window;\n\n constructor(url: string, opts?: { frameId?: string; timeout?: number }) {\n opts = opts || {};\n\n this.id = generateUUID();\n this.frameId = opts.frameId || \"CrossStorageClient-\" + this.id;\n this.origin = new URL(url).origin;\n this.requests = {};\n this.connected = false;\n this.closed = false;\n this.count = 0;\n this.timeout = opts.timeout || 5000;\n\n window.addEventListener(\"message\", this.listener.bind(this), false);\n\n const frame = this.createFrame(url);\n this.hub = frame.contentWindow;\n }\n\n onConnect() {\n if (this.connected) {\n return Promise.resolve();\n } else if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n if (!this.requests.connect) {\n this.requests.connect = [];\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(function () {\n reject(new Error(\"StorageClient could not connect.\"));\n }, this.timeout);\n\n this.requests.connect.push((err: string) => {\n clearTimeout(timeout);\n if (err) return reject(err);\n\n resolve(undefined);\n });\n });\n }\n\n set(key: string, value: string) {\n return this.request(\"set\", {\n key: key,\n value: value,\n });\n }\n\n get(...keys: string[]) {\n return this.request(\"get\", { keys });\n }\n\n del(...keys: string[]) {\n return this.request(\"del\", { keys });\n }\n\n clear() {\n return this.request(\"clear\");\n }\n\n getKeys() {\n this.request(\"getKeys\");\n }\n\n close() {\n const frame = document.getElementById(this.frameId);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n\n window.removeEventListener(\"message\", this.listener, false);\n\n this.connected = false;\n this.closed = true;\n }\n\n private listener(message: MessageEvent) {\n let i, error, response;\n\n if (this.closed || !message.data || typeof message.data !== \"string\") {\n return;\n }\n\n const origin = message.origin;\n\n if (origin !== this.origin) return;\n\n if (message.data === \"cross-storage:unavailable\") {\n if (!this.closed) this.close();\n if (!this.requests.connect) return;\n\n error = new Error(\n \"Closing StorageClient. Could not access localStorage in StorageHub.\",\n );\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n\n return;\n }\n\n if (message.data.indexOf(\"cross-storage:\") !== -1 && !this.connected) {\n this.connected = true;\n if (!this.requests.connect) return;\n\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n delete this.requests.connect;\n }\n\n if (message.data === \"cross-storage:ready\") return;\n\n try {\n response = JSON.parse(message.data);\n } catch (e) {\n return;\n }\n\n if (!response.id) return;\n\n if (this.requests[response.id]) {\n this.requests[response.id](response.error, response.result);\n }\n }\n\n private createFrame(url: string) {\n const frame = window.document.createElement(\"iframe\");\n frame.id = this.frameId;\n\n frame.style.display = \"none\";\n frame.style.position = \"absolute\";\n frame.style.top = \"-999px\";\n frame.style.left = \"-999px\";\n\n window.document.body.appendChild(frame);\n frame.src = url;\n\n return frame;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private request(method: string, params?: {}) {\n if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n this.count++;\n\n const req = {\n id: this.id + \":\" + this.count,\n method: \"cross-storage:\" + method,\n params: params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = window.setTimeout(() => {\n if (!this.requests[req.id]) return;\n\n delete this.requests[req.id];\n reject(\n new Error(\"Timeout: StorageClient could not perform \" + req.method),\n );\n }, this.timeout);\n\n this.requests[req.id] = (err: string, result: string) => {\n clearTimeout(timeout);\n delete this.requests[req.id];\n if (err) return reject(new Error(err));\n resolve(result);\n };\n\n if (this.hub) {\n this.hub.postMessage(JSON.stringify(req), this.origin);\n } else {\n reject(new Error(\"Not found StorageHub.\"));\n }\n });\n }\n}\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\nconst context: {\n storage?: M2mStorageClient;\n} = {};\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = context.storage;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = context.storage;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (context.storage) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n context.storage = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n"],"mappings":"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","names":["storage"]}
|
|
1
|
+
{"version":3,"sources":["../src/initM2mComponents.ts","../src/storage/lib/client.ts","../src/storage/client.ts"],"sourcesContent":["import { m2mStorageClient } from \"./storage/client\";\n\ntype Env = \"development\" | \"production\" | \"local\" | \"localDev\";\n\ninterface InitM2mComponentsArgs {\n env: Env;\n}\n\nexport const initM2mComponents = (args: InitM2mComponentsArgs) => {\n m2mStorageClient.init({\n env: args.env === \"production\" ? \"production\" : \"development\",\n });\n if (globalThis.M2M_COMPONENTS_ENV === undefined) {\n globalThis.M2M_COMPONENTS_ENV = args.env;\n }\n};\n","/**\n * この実装はcross-storageほぼそのままです。\n */\nconst generateUUID = () => {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\n\n return v.toString(16);\n });\n};\nexport class StorageClient {\n id: string;\n frameId: string;\n origin: string;\n requests: Record<string, any>;\n connected: boolean;\n closed: boolean;\n count: number;\n timeout: number;\n hub: null | Window;\n\n constructor(url: string, opts?: { frameId?: string; timeout?: number }) {\n opts = opts || {};\n\n this.id = generateUUID();\n this.frameId = opts.frameId || \"CrossStorageClient-\" + this.id;\n this.origin = new URL(url).origin;\n this.requests = {};\n this.connected = false;\n this.closed = false;\n this.count = 0;\n this.timeout = opts.timeout || 5000;\n\n window.addEventListener(\"message\", this.listener.bind(this), false);\n\n const frame = this.createFrame(url);\n this.hub = frame.contentWindow;\n }\n\n onConnect() {\n if (this.connected) {\n return Promise.resolve();\n } else if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n if (!this.requests.connect) {\n this.requests.connect = [];\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(function () {\n reject(new Error(\"StorageClient could not connect.\"));\n }, this.timeout);\n\n this.requests.connect.push((err: string) => {\n clearTimeout(timeout);\n if (err) return reject(err);\n\n resolve(undefined);\n });\n });\n }\n\n set(key: string, value: string) {\n return this.request(\"set\", {\n key: key,\n value: value,\n });\n }\n\n get(...keys: string[]) {\n return this.request(\"get\", { keys });\n }\n\n del(...keys: string[]) {\n return this.request(\"del\", { keys });\n }\n\n clear() {\n return this.request(\"clear\");\n }\n\n getKeys() {\n this.request(\"getKeys\");\n }\n\n close() {\n const frame = document.getElementById(this.frameId);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n\n window.removeEventListener(\"message\", this.listener, false);\n\n this.connected = false;\n this.closed = true;\n }\n\n private listener(message: MessageEvent) {\n let i, error, response;\n\n if (this.closed || !message.data || typeof message.data !== \"string\") {\n return;\n }\n\n const origin = message.origin;\n\n if (origin !== this.origin) return;\n\n if (message.data === \"cross-storage:unavailable\") {\n if (!this.closed) this.close();\n if (!this.requests.connect) return;\n\n error = new Error(\n \"Closing StorageClient. Could not access localStorage in StorageHub.\",\n );\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n\n return;\n }\n\n if (message.data.indexOf(\"cross-storage:\") !== -1 && !this.connected) {\n this.connected = true;\n if (!this.requests.connect) return;\n\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n delete this.requests.connect;\n }\n\n if (message.data === \"cross-storage:ready\") return;\n\n try {\n response = JSON.parse(message.data);\n } catch (e) {\n return;\n }\n\n if (!response.id) return;\n\n if (this.requests[response.id]) {\n this.requests[response.id](response.error, response.result);\n }\n }\n\n private createFrame(url: string) {\n const frame = window.document.createElement(\"iframe\");\n frame.id = this.frameId;\n\n frame.style.display = \"none\";\n frame.style.position = \"absolute\";\n frame.style.top = \"-999px\";\n frame.style.left = \"-999px\";\n\n window.document.body.appendChild(frame);\n frame.src = url;\n\n return frame;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private request(method: string, params?: {}) {\n if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n this.count++;\n\n const req = {\n id: this.id + \":\" + this.count,\n method: \"cross-storage:\" + method,\n params: params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = window.setTimeout(() => {\n if (!this.requests[req.id]) return;\n\n delete this.requests[req.id];\n reject(\n new Error(\"Timeout: StorageClient could not perform \" + req.method),\n );\n }, this.timeout);\n\n this.requests[req.id] = (err: string, result: string) => {\n clearTimeout(timeout);\n delete this.requests[req.id];\n if (err) return reject(new Error(err));\n resolve(result);\n };\n\n if (this.hub) {\n this.hub.postMessage(JSON.stringify(req), this.origin);\n } else {\n reject(new Error(\"Not found StorageHub.\"));\n }\n });\n }\n}\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n"],"mappings":"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","names":["storage"]}
|
package/initM2mComponents.mjs
CHANGED
package/m2m-apps-menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/m2m-apps-menu.ts","../src/MenuBaseElement.ts","../src/domains.ts"],"sourcesContent":["import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\nimport { customElement } from \"lit/decorators.js\";\nimport { getDomains } from \"./domains\";\nimport { html } from \"lit\";\nimport { ref } from \"lit/directives/ref.js\";\n\nexport type M2MAppsMenuProps = MenuBaseElementProps;\n\n@customElement(\"m2m-apps-menu\")\nexport class M2MAppsMenu extends MenuBaseElement {\n render() {\n const domains = getDomains();\n const additionalItems = this.additinalItems?.map((item) => {\n return html`\n <li>\n <a href=\"${item.href}\">${item.label}</a>\n </li>\n `;\n });\n const isHidden = this.expanded === false || this.expanded === undefined;\n return html`<nav>\n <button\n type=\"button\"\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\n aria-controls=\"m2m-apps-menu__navigation-drawer\"\n aria-expanded=${this.expanded}\n @click=${this.handleToggleDrawer}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"38px\"\n height=\"38px\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"\n />\n </svg>\n </button>\n <ul\n ${ref(this.listRef)}\n id=\"m2m-apps-menu__navigation-drawer\"\n aria-hidden=${isHidden}\n class=\"navigation-drawer\"\n >\n <li>\n <span>m2m Series</span>\n <ul>\n <li><a href=\"${domains.core}\">Core 施設管理</a></li>\n <li><a href=\"${domains.checkin}\">Checkin ゲストチェックイン</a></li>\n <li><a href=\"${domains.systems}\">Systems Airbnb連携</a></li>\n <li><a href=\"${domains.cleaning}\">Cleaning 清掃管理</a></li>\n <li><a href=\"${domains.inspection}\">Inspection 内見チェック</a></li>\n <li><a href=\"${domains.users}\">Users アカウント管理</a></li>\n </ul>\n </li>\n <li>\n <a href=\"${domains.sumyca}\">Sumyca マンスリープラットフォーム</a>\n </li>\n ${additionalItems}\n </ul>\n </nav>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"m2m-apps-menu\": M2MAppsMenu;\n }\n}\n","import { LitElement, css } from \"lit\";\nimport { Ref, createRef } from \"lit/directives/ref.js\";\nimport { property } from \"lit/decorators.js\";\n\nexport interface MenuAdditionalItem {\n label: string;\n href: string;\n}\n\nexport interface MenuBaseElementProps {\n expanded: boolean;\n additinalItems: MenuAdditionalItem[];\n}\n\nexport class MenuBaseElement extends LitElement {\n static styles = css`\n nav {\n position: relative;\n display: flex;\n }\n .navigation-drawer-controll-button {\n display: flex;\n align-items: center;\n justify-content: center;\n\n height: 42px;\n padding: 0;\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: background-color 0.2s;\n appearance: none;\n }\n .navigation-drawer-controll-button.navigation-drawer-controll-button--icon {\n width: 42px;\n }\n .navigation-drawer-controll-button:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n .navigation-drawer-controll-button:active {\n background-color: rgba(0, 0, 0, 0.075);\n }\n\n .navigation-drawer {\n position: absolute;\n top: 100%;\n right: 0px;\n z-index: 1100;\n box-sizing: border-box;\n min-width: 200px;\n padding: 0px;\n margin: 0px;\n overflow: hidden;\n color: rgba(0, 0, 0, 0.87);\n white-space: nowrap;\n list-style: none;\n background-color: #fff;\n border-radius: 5px;\n box-shadow:\n 0px 1px 3px 0px rgb(0 0 0 / 20%),\n 0px 1px 1px 0px rgb(0 0 0 / 14%),\n 0px 2px 1px -1px rgb(0 0 0 / 12%);\n }\n .navigation-drawer-controll-button[aria-expanded=\"false\"]\n ~ .navigation-drawer {\n display: none;\n }\n\n .navigation-drawer li {\n border-bottom: 1px solid #eeeeee;\n }\n .navigation-drawer li:last-of-type {\n border-bottom: none;\n }\n .navigation-drawer li > a,\n .navigation-drawer li > button {\n box-sizing: border-box;\n display: block;\n width: 100%;\n padding: 0;\n padding: 0.6em 1em;\n font: inherit;\n color: inherit;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: 0.2s;\n appearance: none;\n }\n .navigation-drawer li > a:hover,\n .navigation-drawer li > button:hover {\n background-color: #ededed;\n }\n .navigation-drawer li > a:active,\n .navigation-drawer li > button:active {\n background-color: #dadada;\n }\n\n .navigation-drawer li ul {\n padding: 0;\n list-style: none;\n }\n .navigation-drawer li:has(> ul) li > a {\n padding-left: 2em;\n }\n\n .navigation-drawer li:has(> ul) > span {\n display: block;\n padding: 0.6em 1em;\n border-bottom: 1px solid #eeeeee;\n }\n `;\n\n handleClickOutside = (event: MouseEvent | TouchEvent) => {\n if (\n !this.listRef.value ||\n this.listRef.value.contains(event.composedPath()[0] as Node)\n ) {\n return;\n }\n this.expanded = false;\n };\n\n @property({\n type: Object,\n attribute: \"additional-items\",\n })\n additinalItems: MenuBaseElementProps[\"additinalItems\"] = [];\n\n @property()\n expanded?: boolean = false;\n\n handleToggleDrawer = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n this.expanded = !this.expanded;\n if (this.expanded) {\n window.addEventListener(\"click\", this.handleClickOutside, false);\n }\n };\n\n protected updated() {\n if (this.expanded === false) {\n window.removeEventListener(\"click\", this.handleClickOutside, false);\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n window.removeEventListener(\"click\", this.handleClickOutside, false);\n }\n\n listRef: Ref = createRef();\n}\n","export const getDomains = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? {\n core: \"https://core.m2msystems.cloud\",\n sumyca: \"https://manage.sumyca.com\",\n cleaning: \"https://manager-cleaning.m2msystems.cloud\",\n users: \"https://manage-users.m2msystems.cloud\",\n inspection: \"https://inspection.m2msystems.cloud\",\n checkin: \"https://manage.checkin.m2msystems.cloud\",\n systems: \"https://m2msystems.cloud/\",\n }\n : {\n core: \"https://dev--m2m-core-manager-front.netlify.app\",\n sumyca: \"https://dev--sumyca-manager-front.netlify.app\",\n cleaning: \"https://dev--m2m-cleaning-manager-front.netlify.app\",\n users: \"https://dev--manage-users.netlify.app\",\n inspection: \"https://dev--m2m-inspection-manager-front.netlify.app\",\n checkin: \"https://manage.dev.checkin.m2msystems.cloud\",\n systems: \"https://dev.m2msystems.cloud\",\n };\n};\n"],"mappings":"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","names":["import_decorators","import_lit","import_ref"]}
|
|
1
|
+
{"version":3,"sources":["../src/m2m-apps-menu.ts","../src/MenuBaseElement.ts","../src/domains.ts"],"sourcesContent":["import { MenuBaseElement, MenuBaseElementProps } from \"./MenuBaseElement\";\r\nimport { customElement } from \"lit/decorators.js\";\r\nimport { getDomains } from \"./domains\";\r\nimport { html } from \"lit\";\r\nimport { ref } from \"lit/directives/ref.js\";\r\n\r\nexport type M2MAppsMenuProps = MenuBaseElementProps;\r\n\r\n@customElement(\"m2m-apps-menu\")\r\nexport class M2MAppsMenu extends MenuBaseElement {\r\n render() {\r\n const domains = getDomains();\r\n const additionalItems = this.additinalItems?.map((item) => {\r\n return html`\r\n <li>\r\n <a href=\"${item.href}\">${item.label}</a>\r\n </li>\r\n `;\r\n });\r\n const isHidden = this.expanded === false || this.expanded === undefined;\r\n return html`<nav>\r\n <button\r\n type=\"button\"\r\n class=\"navigation-drawer-controll-button navigation-drawer-controll-button--icon\"\r\n aria-controls=\"m2m-apps-menu__navigation-drawer\"\r\n aria-expanded=${this.expanded}\r\n @click=${this.handleToggleDrawer}\r\n >\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"38px\"\r\n height=\"38px\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n ${ref(this.listRef)}\r\n id=\"m2m-apps-menu__navigation-drawer\"\r\n aria-hidden=${isHidden}\r\n class=\"navigation-drawer\"\r\n >\r\n <li>\r\n <span>m2m Series</span>\r\n <ul>\r\n <li><a href=\"${domains.core}\">Core 施設管理</a></li>\r\n <li><a href=\"${domains.checkin}\">Checkin ゲストチェックイン</a></li>\r\n <li><a href=\"${domains.systems}\">Systems Airbnb連携</a></li>\r\n <li><a href=\"${domains.cleaning}\">Cleaning 清掃管理</a></li>\r\n <li><a href=\"${domains.inspection}\">Inspection 内見チェック</a></li>\r\n <li><a href=\"${domains.users}\">Users アカウント管理</a></li>\r\n </ul>\r\n </li>\r\n <li>\r\n <a href=\"${domains.sumyca}\">Sumyca マンスリープラットフォーム</a>\r\n </li>\r\n ${additionalItems}\r\n </ul>\r\n </nav>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"m2m-apps-menu\": M2MAppsMenu;\r\n }\r\n}\r\n","import { LitElement, css } from \"lit\";\r\nimport { Ref, createRef } from \"lit/directives/ref.js\";\r\nimport { property } from \"lit/decorators.js\";\r\n\r\nexport interface MenuAdditionalItem {\r\n label: string;\r\n href: string;\r\n}\r\n\r\nexport interface MenuBaseElementProps {\r\n expanded: boolean;\r\n additinalItems: MenuAdditionalItem[];\r\n}\r\n\r\nexport class MenuBaseElement extends LitElement {\r\n static styles = css`\r\n nav {\r\n position: relative;\r\n display: flex;\r\n }\r\n .navigation-drawer-controll-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n height: 42px;\r\n padding: 0;\r\n cursor: pointer;\r\n background-color: transparent;\r\n border: none;\r\n transition: background-color 0.2s;\r\n appearance: none;\r\n }\r\n .navigation-drawer-controll-button.navigation-drawer-controll-button--icon {\r\n width: 42px;\r\n }\r\n .navigation-drawer-controll-button:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n .navigation-drawer-controll-button:active {\r\n background-color: rgba(0, 0, 0, 0.075);\r\n }\r\n\r\n .navigation-drawer {\r\n position: absolute;\r\n top: 100%;\r\n right: 0px;\r\n z-index: 1100;\r\n box-sizing: border-box;\r\n min-width: 200px;\r\n padding: 0px;\r\n margin: 0px;\r\n overflow: hidden;\r\n color: rgba(0, 0, 0, 0.87);\r\n white-space: nowrap;\r\n list-style: none;\r\n background-color: #fff;\r\n border-radius: 5px;\r\n box-shadow:\r\n 0px 1px 3px 0px rgb(0 0 0 / 20%),\r\n 0px 1px 1px 0px rgb(0 0 0 / 14%),\r\n 0px 2px 1px -1px rgb(0 0 0 / 12%);\r\n }\r\n .navigation-drawer-controll-button[aria-expanded=\"false\"]\r\n ~ .navigation-drawer {\r\n display: none;\r\n }\r\n\r\n .navigation-drawer li {\r\n border-bottom: 1px solid #eeeeee;\r\n }\r\n .navigation-drawer li:last-of-type {\r\n border-bottom: none;\r\n }\r\n .navigation-drawer li > a,\r\n .navigation-drawer li > button {\r\n box-sizing: border-box;\r\n display: block;\r\n width: 100%;\r\n padding: 0;\r\n padding: 0.6em 1em;\r\n font: inherit;\r\n color: inherit;\r\n text-align: left;\r\n text-decoration: none;\r\n cursor: pointer;\r\n cursor: pointer;\r\n background-color: transparent;\r\n border: none;\r\n transition: 0.2s;\r\n appearance: none;\r\n }\r\n .navigation-drawer li > a:hover,\r\n .navigation-drawer li > button:hover {\r\n background-color: #ededed;\r\n }\r\n .navigation-drawer li > a:active,\r\n .navigation-drawer li > button:active {\r\n background-color: #dadada;\r\n }\r\n\r\n .navigation-drawer li ul {\r\n padding: 0;\r\n list-style: none;\r\n }\r\n .navigation-drawer li:has(> ul) li > a {\r\n padding-left: 2em;\r\n }\r\n\r\n .navigation-drawer li:has(> ul) > span {\r\n display: block;\r\n padding: 0.6em 1em;\r\n border-bottom: 1px solid #eeeeee;\r\n }\r\n `;\r\n\r\n handleClickOutside = (event: MouseEvent | TouchEvent) => {\r\n if (\r\n !this.listRef.value ||\r\n this.listRef.value.contains(event.composedPath()[0] as Node)\r\n ) {\r\n return;\r\n }\r\n this.expanded = false;\r\n };\r\n\r\n @property({\r\n type: Object,\r\n attribute: \"additional-items\",\r\n })\r\n additinalItems: MenuBaseElementProps[\"additinalItems\"] = [];\r\n\r\n @property()\r\n expanded?: boolean = false;\r\n\r\n handleToggleDrawer = (event: Event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\r\n this.expanded = !this.expanded;\r\n if (this.expanded) {\r\n window.addEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n };\r\n\r\n protected updated() {\r\n if (this.expanded === false) {\r\n window.removeEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n window.removeEventListener(\"click\", this.handleClickOutside, false);\r\n }\r\n\r\n listRef: Ref = createRef();\r\n}\r\n","export const getDomains = () => {\n return globalThis.M2M_COMPONENTS_ENV === \"production\"\n ? {\n core: \"https://core.m2msystems.cloud\",\n sumyca: \"https://manage.sumyca.com\",\n cleaning: \"https://manager-cleaning.m2msystems.cloud\",\n users: \"https://manage-users.m2msystems.cloud\",\n inspection: \"https://inspection.m2msystems.cloud\",\n checkin: \"https://manage.checkin.m2msystems.cloud\",\n systems: \"https://m2msystems.cloud/\",\n }\n : {\n core: \"https://dev--m2m-core-manager-front.netlify.app\",\n sumyca: \"https://dev--sumyca-manager-front.netlify.app\",\n cleaning: \"https://dev--m2m-cleaning-manager-front.netlify.app\",\n users: \"https://dev--manage-users.netlify.app\",\n inspection: \"https://dev--m2m-inspection-manager-front.netlify.app\",\n checkin: \"https://manage.dev.checkin.m2msystems.cloud\",\n systems: \"https://dev.m2msystems.cloud\",\n };\n};\n"],"mappings":"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","names":["import_decorators","import_lit","import_ref"]}
|
package/m2m-apps-menu.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
import {
|
|
3
3
|
M2MAppsMenu
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-HI2D4CLX.mjs";
|
|
4
|
+
} from "./chunk-3LXMUAGW.mjs";
|
|
6
5
|
import "./chunk-B7STDXYN.mjs";
|
|
6
|
+
import "./chunk-6YUMRFSL.mjs";
|
|
7
7
|
import "./chunk-QH5I6YL2.mjs";
|
|
8
8
|
export {
|
|
9
9
|
M2MAppsMenu
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function that returns the URL part common to the endpoints.
|
|
3
|
+
*/
|
|
4
|
+
declare const root: () => string;
|
|
5
|
+
/**
|
|
6
|
+
* health check
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
declare const healthCheck: () => string;
|
|
10
|
+
/**
|
|
11
|
+
* 通知を登録する
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
declare const registerNotification: () => string;
|
|
15
|
+
/**
|
|
16
|
+
* 自分宛の通知をserviceIdを使って取得する
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
declare const findNotificationsByServiceId: ({ id }: {
|
|
20
|
+
id: string;
|
|
21
|
+
}) => string;
|
|
22
|
+
/**
|
|
23
|
+
* 通知のステータスを更新する
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
declare const updateNotificationStatus: ({ id }: {
|
|
27
|
+
id: string;
|
|
28
|
+
}) => string;
|
|
29
|
+
/**
|
|
30
|
+
* 通知の購読を更新する
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
declare const saveSubscription: () => string;
|
|
34
|
+
/**
|
|
35
|
+
* 自分の購読している通知を取得する
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
declare const findMySubscriptions: () => string;
|
|
39
|
+
declare const m2mNotifications_v1: {
|
|
40
|
+
healthCheck: () => string;
|
|
41
|
+
registerNotification: () => string;
|
|
42
|
+
findNotificationsByServiceId: ({ id }: {
|
|
43
|
+
id: string;
|
|
44
|
+
}) => string;
|
|
45
|
+
updateNotificationStatus: ({ id }: {
|
|
46
|
+
id: string;
|
|
47
|
+
}) => string;
|
|
48
|
+
saveSubscription: () => string;
|
|
49
|
+
findMySubscriptions: () => string;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
declare const v1_findMySubscriptions: typeof findMySubscriptions;
|
|
53
|
+
declare const v1_findNotificationsByServiceId: typeof findNotificationsByServiceId;
|
|
54
|
+
declare const v1_healthCheck: typeof healthCheck;
|
|
55
|
+
declare const v1_m2mNotifications_v1: typeof m2mNotifications_v1;
|
|
56
|
+
declare const v1_registerNotification: typeof registerNotification;
|
|
57
|
+
declare const v1_root: typeof root;
|
|
58
|
+
declare const v1_saveSubscription: typeof saveSubscription;
|
|
59
|
+
declare const v1_updateNotificationStatus: typeof updateNotificationStatus;
|
|
60
|
+
declare namespace v1 {
|
|
61
|
+
export { v1_findMySubscriptions as findMySubscriptions, v1_findNotificationsByServiceId as findNotificationsByServiceId, v1_healthCheck as healthCheck, v1_m2mNotifications_v1 as m2mNotifications_v1, v1_registerNotification as registerNotification, v1_root as root, v1_saveSubscription as saveSubscription, v1_updateNotificationStatus as updateNotificationStatus };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { registerNotification as a, findMySubscriptions as b, findNotificationsByServiceId as f, healthCheck as h, m2mNotifications_v1 as m, root as r, saveSubscription as s, updateNotificationStatus as u, v1 as v };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A function that returns the URL part common to the endpoints.
|
|
3
|
+
*/
|
|
4
|
+
declare const root: () => string;
|
|
5
|
+
/**
|
|
6
|
+
* health check
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
declare const healthCheck: () => string;
|
|
10
|
+
/**
|
|
11
|
+
* 通知を登録する
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
declare const registerNotification: () => string;
|
|
15
|
+
/**
|
|
16
|
+
* 自分宛の通知をserviceIdを使って取得する
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
declare const findNotificationsByServiceId: ({ id }: {
|
|
20
|
+
id: string;
|
|
21
|
+
}) => string;
|
|
22
|
+
/**
|
|
23
|
+
* 通知のステータスを更新する
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
declare const updateNotificationStatus: ({ id }: {
|
|
27
|
+
id: string;
|
|
28
|
+
}) => string;
|
|
29
|
+
/**
|
|
30
|
+
* 通知の購読を更新する
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
declare const saveSubscription: () => string;
|
|
34
|
+
/**
|
|
35
|
+
* 自分の購読している通知を取得する
|
|
36
|
+
*
|
|
37
|
+
*/
|
|
38
|
+
declare const findMySubscriptions: () => string;
|
|
39
|
+
declare const m2mNotifications_v1: {
|
|
40
|
+
healthCheck: () => string;
|
|
41
|
+
registerNotification: () => string;
|
|
42
|
+
findNotificationsByServiceId: ({ id }: {
|
|
43
|
+
id: string;
|
|
44
|
+
}) => string;
|
|
45
|
+
updateNotificationStatus: ({ id }: {
|
|
46
|
+
id: string;
|
|
47
|
+
}) => string;
|
|
48
|
+
saveSubscription: () => string;
|
|
49
|
+
findMySubscriptions: () => string;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
declare const v1_findMySubscriptions: typeof findMySubscriptions;
|
|
53
|
+
declare const v1_findNotificationsByServiceId: typeof findNotificationsByServiceId;
|
|
54
|
+
declare const v1_healthCheck: typeof healthCheck;
|
|
55
|
+
declare const v1_m2mNotifications_v1: typeof m2mNotifications_v1;
|
|
56
|
+
declare const v1_registerNotification: typeof registerNotification;
|
|
57
|
+
declare const v1_root: typeof root;
|
|
58
|
+
declare const v1_saveSubscription: typeof saveSubscription;
|
|
59
|
+
declare const v1_updateNotificationStatus: typeof updateNotificationStatus;
|
|
60
|
+
declare namespace v1 {
|
|
61
|
+
export { v1_findMySubscriptions as findMySubscriptions, v1_findNotificationsByServiceId as findNotificationsByServiceId, v1_healthCheck as healthCheck, v1_m2mNotifications_v1 as m2mNotifications_v1, v1_registerNotification as registerNotification, v1_root as root, v1_saveSubscription as saveSubscription, v1_updateNotificationStatus as updateNotificationStatus };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { registerNotification as a, findMySubscriptions as b, findNotificationsByServiceId as f, healthCheck as h, m2mNotifications_v1 as m, root as r, saveSubscription as s, updateNotificationStatus as u, v1 as v };
|
package/m2m-releases-link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/m2m-releases-link.ts","../src/releases/t.ts"],"sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { t } from \"./releases/t\";\n\nconst RELEASE_URL = \"https://matsuri-releases-api.vercel.app/product\";\n\n@customElement(\"m2m-releases-link\")\nexport class M2mReleaseLink extends LitElement {\n static readonly styles = css`\n :host a {\n display: block;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n padding: 0px;\n color: rgba(0, 0, 0, 0.87);\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: background-color 0.2s ease 0s;\n appearance: none;\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n }\n `;\n\n @property({ type: String, attribute: \"product\" })\n product = \"\";\n\n render() {\n return html`<a\n href=\"${RELEASE_URL}/${this.product}?t=${t}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"リリース情報\"\n >\n <span></span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32px\"\n height=\"32px\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M7 20h4c0 1.1-.9 2-2 2s-2-.9-2-2zm-2-1h8v-2H5v2zm11.5-9.5c0 3.82-2.66 5.86-3.77 6.5H5.27c-1.11-.64-3.77-2.68-3.77-6.5C1.5 5.36 4.86 2 9 2s7.5 3.36 7.5 7.5zm-2 0C14.5 6.47 12.03 4 9 4S3.5 6.47 3.5 9.5c0 2.47 1.49 3.89 2.35 4.5h6.3c.86-.61 2.35-2.03 2.35-4.5zm6.87-2.13L20 8l1.37.63L22 10l.63-1.37L24 8l-1.37-.63L22 6l-.63 1.37zM19 6l.94-2.06L22 3l-2.06-.94L19 0l-.94 2.06L16 3l2.06.94L19 6z\"\n />\n </svg>\n </a>`;\n }\n}\n","export const t = \"01J6NF4H69FPZD9VS7PCMZXJ3V\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAsC;AACtC,wBAAwC;;;ACDjC,IAAM,IAAI;;;ADIjB,IAAM,cAAc;AAGb,IAAM,iBAAN,cAA6B,sBAAW;AAAA,EAAxC;AAAA;AAuBL,mBAAU;AAAA;AAAA,EAEV,SAAS;AACP,WAAO;AAAA,cACG,WAAW,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB9C;AACF;AA9Ca,eACK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBzB;AAAA,MADC,4BAAS,EAAE,MAAM,QAAQ,WAAW,UAAU,CAAC;AAAA,GAtBrC,eAuBX;AAvBW,iBAAN;AAAA,MADN,iCAAc,mBAAmB;AAAA,GACrB;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/m2m-releases-link.ts","../src/releases/t.ts"],"sourcesContent":["import { LitElement, css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { t } from \"./releases/t\";\n\nconst RELEASE_URL = \"https://matsuri-releases-api.vercel.app/product\";\n\n@customElement(\"m2m-releases-link\")\nexport class M2mReleaseLink extends LitElement {\n static readonly styles = css`\n :host a {\n display: block;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 42px;\n height: 42px;\n padding: 0px;\n color: rgba(0, 0, 0, 0.87);\n cursor: pointer;\n background-color: transparent;\n border: none;\n transition: background-color 0.2s ease 0s;\n appearance: none;\n &:hover {\n background-color: rgba(0, 0, 0, 0.05);\n }\n }\n `;\n\n @property({ type: String, attribute: \"product\" })\n product = \"\";\n\n render() {\n return html`<a\n href=\"${RELEASE_URL}/${this.product}?t=${t}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"リリース情報\"\n >\n <span></span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32px\"\n height=\"32px\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M7 20h4c0 1.1-.9 2-2 2s-2-.9-2-2zm-2-1h8v-2H5v2zm11.5-9.5c0 3.82-2.66 5.86-3.77 6.5H5.27c-1.11-.64-3.77-2.68-3.77-6.5C1.5 5.36 4.86 2 9 2s7.5 3.36 7.5 7.5zm-2 0C14.5 6.47 12.03 4 9 4S3.5 6.47 3.5 9.5c0 2.47 1.49 3.89 2.35 4.5h6.3c.86-.61 2.35-2.03 2.35-4.5zm6.87-2.13L20 8l1.37.63L22 10l.63-1.37L24 8l-1.37-.63L22 6l-.63 1.37zM19 6l.94-2.06L22 3l-2.06-.94L19 0l-.94 2.06L16 3l2.06.94L19 6z\"\n />\n </svg>\n </a>`;\n }\n}\n","export const t = \"01J6NF4H69FPZD9VS7PCMZXJ3V\";\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAsC;AACtC,wBAAwC;;;ACDjC,IAAM,IAAI;;;ADIjB,IAAM,cAAc;AAGb,IAAM,iBAAN,cAA6B,sBAAW;AAAA,EAAxC;AAAA;AAuBL,mBAAU;AAAA;AAAA,EAEV,SAAS;AACP,WAAO;AAAA,cACG,WAAW,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB9C;AACF;AA9Ca,eACK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBzB;AAAA,MADC,4BAAS,EAAE,MAAM,QAAQ,WAAW,UAAU,CAAC;AAAA,GAtBrC,eAuBX;AAvBW,iBAAN;AAAA,MADN,iCAAc,mBAAmB;AAAA,GACrB;","names":[]}
|