lynx-console 0.2.2 → 0.3.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/dist/index.cjs +87 -105
- package/dist/index.css +45 -243
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +87 -105
- package/dist/index.mjs.map +1 -1
- package/dist/setup.cjs +0 -1
- package/dist/setup.d.cts +0 -1
- package/dist/setup.d.cts.map +1 -1
- package/dist/setup.d.mts +0 -1
- package/dist/setup.d.mts.map +1 -1
- package/dist/setup.mjs +0 -1
- package/dist/setup.mjs.map +1 -1
- package/package.json +5 -5
- package/src/components/BottomSheet.css +2 -13
- package/src/components/BottomSheet.tsx +1 -1
- package/src/components/ConsolePanel.css +0 -84
- package/src/components/ConsolePanel.tsx +3 -2
- package/src/components/FloatingButton.css +1 -8
- package/src/components/FloatingButton.tsx +29 -35
- package/src/components/LogPanel.tsx +108 -47
- package/src/components/NetworkDetailSection.tsx +24 -12
- package/src/components/NetworkPanel.css +0 -53
- package/src/components/NetworkPanel.tsx +78 -34
- package/src/components/PerformancePanel.css +0 -64
- package/src/components/PerformancePanel.tsx +120 -56
- package/src/components/Tabs.css +1 -21
- package/src/components/Tabs.tsx +2 -2
- package/src/index.tsx +11 -2
- package/src/styles/ThemeContext.ts +1 -1
- package/src/styles/theme.ts +0 -14
- package/src/styles/tokens.css +40 -0
- package/src/components/FadeList.tsx +0 -31
- package/src/styles/getDimensionValue.ts +0 -7
package/dist/setup.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.mjs","names":[],"sources":["../src/shared/ensureConsoleStructure.ts","../src/setup/setupLogMonitor.ts","../src/setup/_setupMainThreadConsole.ts","../src/setup/setupMainThreadConsole.ts","../src/setup/setupNetworkMonitor.ts","../src/setup/setupPerformanceMonitor.ts"],"sourcesContent":["type LynxConsole = NonNullable<typeof globalThis.__LYNX_CONSOLE__>;\ntype ConsoleState = NonNullable<LynxConsole[\"state\"]>;\n\nexport const ensureConsoleStructure = (): {\n lynxConsole: LynxConsole;\n state: ConsoleState;\n} => {\n if (!globalThis.__LYNX_CONSOLE__) {\n globalThis.__LYNX_CONSOLE__ = {};\n }\n\n if (!globalThis.__LYNX_CONSOLE__.state) {\n globalThis.__LYNX_CONSOLE__.state = {};\n }\n\n return {\n lynxConsole: globalThis.__LYNX_CONSOLE__,\n state: globalThis.__LYNX_CONSOLE__.state,\n };\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\ntype LogListener = (entry: LogEntry) => void;\n\nconst LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\nconst LOG_ID_PREFIX = \"background-thread\";\n\nconst generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n};\n\nconst createLogEntry = (method: LogLevel, args: unknown[]): LogEntry => {\n return {\n id: generateLogId(),\n level: method,\n message: \"\",\n timestamp: Date.now(),\n args,\n };\n};\n\nconst addLogEntry = (entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.logs || !state?.logListeners) {\n console.error(\n \"[LynxConsole] Cannot add log entry: Log monitor not initialized. Call initLogMonitor() first.\",\n );\n return;\n }\n\n state.logs.push(entry);\n state.logListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\n// Background Thread: Log monitoring 초기화\nexport const initLogMonitor = () => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.originalConsole) {\n console.warn(\"[LynxConsole] Log monitor already initialized\");\n return;\n }\n\n const originalConsole = globalThis.console;\n lynxConsole.originalConsole = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n state.logs = [];\n state.logListeners = new Set();\n state.logSubscribe = (listener: LogListener) => {\n state.logListeners?.add(listener);\n return () => {\n state.logListeners?.delete(listener);\n };\n };\n\n // Background Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n globalThis.console[method] = ((...args: unknown[]) => {\n lynxConsole.originalConsole?.[method](...args);\n const entry = createLogEntry(method, args);\n addLogEntry(entry);\n }).bind(globalThis.console);\n });\n\n lynxConsole.originalConsole?.log(\n \"[LynxConsole] ✅ Log monitoring initialized\",\n );\n};\n","import { runOnBackground } from \"@lynx-js/react\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nconst _setupMainThreadConsole = (): void => {\n \"main thread\";\n\n //IMPORTANT: do not use external functions in main thread\n if (!globalThis.__LYNX_CONSOLE__) globalThis.__LYNX_CONSOLE__ = {};\n const lynxConsole = globalThis.__LYNX_CONSOLE__;\n\n if (lynxConsole.mainThreadInitialized) {\n console.warn(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n const LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\n const LOG_ID_PREFIX = \"main-thread\";\n\n const serializeArgs = (args: unknown[]): unknown[] => {\n return args.map((arg) => {\n try {\n JSON.stringify(arg);\n return arg;\n } catch {\n return String(arg);\n }\n });\n };\n\n const generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n };\n\n // Main Thread에서 Background Thread로 로그 전송하는 함수\n const sendLogToBackground = runOnBackground((entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state) return;\n\n state.logs?.push(entry);\n state.logListeners?.forEach((listener) => {\n listener(entry);\n });\n });\n\n const originalConsole = globalThis.console;\n\n const originalMethods = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n // Main Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n const original = originalMethods[method];\n originalConsole[method] = ((...args: unknown[]) => {\n // 원본 console 호출\n original(...args);\n\n const serializedArgs = serializeArgs(args);\n const timestamp = Date.now();\n const id = generateLogId();\n\n sendLogToBackground({\n id,\n level: method,\n message: \"\",\n timestamp,\n args: serializedArgs,\n });\n }).bind(originalConsole);\n });\n\n lynxConsole.mainThreadInitialized = true;\n\n originalConsole.log(\"[LynxConsole] ✅ Main thread console initialized\");\n};\n\nexport default _setupMainThreadConsole;\n","// both thread;\nimport \"./_setupMainThreadConsole\";\n\nimport { runOnMainThread } from \"@lynx-js/react\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport _setupMainThreadConsole from \"./_setupMainThreadConsole\";\n\n// Main Thread: Console 초기화\n\nexport const initMainThreadConsole = async (): Promise<void> => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.mainThreadInitialized) {\n console.error(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n if (!state.logs) {\n console.error(\"[LynxConsole] Background thread console not initialized\");\n return;\n }\n\n try {\n const setupOnMainThread = runOnMainThread(_setupMainThreadConsole);\n await setupOnMainThread();\n } catch (error) {\n console.error(\n \"[LynxConsole] Failed to initialize main thread console:\",\n error,\n );\n }\n};\n","import { stringify } from \"javascript-stringify\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { NetworkEntry } from \"../types\";\n\nconst generateNetworkId = (): string => {\n return `network-${Date.now()}-${Math.random()}`;\n};\n\nconst extractUrl = (input: RequestInfo | URL): string => {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.href;\n return (input as Request).url;\n};\n\nconst extractMethod = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): string | undefined => {\n if (init?.method) return init.method;\n if (typeof input === \"object\" && \"method\" in input) {\n return (input as Request).method;\n }\n return \"GET\";\n};\n\nconst extractHeaders = (\n headers: HeadersInit | undefined,\n): Record<string, string> => {\n const result: Record<string, string> = {};\n if (!headers) return result;\n\n try {\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = value;\n });\n } else if (Array.isArray(headers)) {\n headers.forEach(([key, value]) => {\n result[key] = value;\n });\n } else {\n Object.entries(headers).forEach(([key, value]) => {\n result[key] = value;\n });\n }\n } catch (error) {\n console.error(\"[LynxConsole] Failed to extract headers:\", error);\n }\n\n return result;\n};\n\nconst mergeRequestHeaders = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): Record<string, string> => {\n const merged: Record<string, string> = {};\n\n // Request 객체나 URL 객체에서 헤더 추출\n if (typeof input === \"object\" && \"headers\" in input) {\n Object.assign(merged, extractHeaders(input.headers as HeadersInit));\n }\n\n // RequestInit에서 헤더 추출 (나중 값이 우선)\n if (init?.headers) {\n Object.assign(merged, extractHeaders(init.headers));\n }\n\n return merged;\n};\n\nconst addNetworkEntry = (entry: NetworkEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot add network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n state.networks.push(entry);\n state.networksMap.set(entry.id, entry);\n\n state.networkListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nconst updateNetworkEntry = (\n id: string,\n updates: Partial<NetworkEntry>,\n): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot update network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n const existingEntry = state.networksMap.get(id);\n if (!existingEntry) {\n console.error(\n `[LynxConsole] Cannot update network entry: Entry with id '${id}' not found.`,\n );\n return;\n }\n\n const updatedEntry = { ...existingEntry, ...updates };\n\n const index = state.networks.findIndex((entry) => entry.id === id);\n if (index !== -1) {\n state.networks[index] = updatedEntry;\n }\n\n state.networksMap.set(id, updatedEntry);\n\n state.networkListeners.forEach((listener) => {\n listener(updatedEntry);\n });\n};\n\nexport const initNetworkMonitor = () => {\n if (!lynx.fetch) {\n console.warn(\n \"[LynxConsole] lynx.fetch not available, skipping network monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.networks !== undefined) {\n console.warn(\"[LynxConsole] Network monitor already initialized\");\n return;\n }\n\n type NetworkListener = (entry: NetworkEntry) => void;\n state.networks = [];\n state.networksMap = new Map();\n state.networkListeners = new Set();\n state.subscribeNetwork = (listener: NetworkListener) => {\n state.networkListeners?.add(listener);\n return () => {\n state.networkListeners?.delete(listener);\n };\n };\n\n const originalFetch = fetch.bind(lynx);\n\n const monitoredFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const id = generateNetworkId();\n const startTime = Date.now();\n const url = extractUrl(input);\n const method = extractMethod(input, init);\n\n const requestHeaders = mergeRequestHeaders(input, init);\n\n // Request body 처리\n let requestBody: string | undefined;\n if (init?.body) {\n if (typeof init.body === \"string\") {\n requestBody = init.body;\n } else if (init.body instanceof URLSearchParams) {\n requestBody = init.body.toString();\n } else {\n // Lynx가 지원하지 않는 타입이거나 알 수 없는 타입\n requestBody = String(init.body);\n }\n }\n\n addNetworkEntry({\n id,\n url,\n method: method || \"default\",\n status: \"pending\",\n startTime,\n requestHeaders,\n requestBody: requestBody ?? \"\",\n });\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const clonedResponse = response.clone();\n let responseBody: string | undefined;\n\n try {\n const headerMap: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headerMap[key.toLowerCase()] = value;\n });\n\n const contentType = headerMap[\"content-type\"];\n if (contentType?.includes(\"application/json\")) {\n const json = await clonedResponse.json();\n responseBody = stringify(json, null, 2, { references: true }) ?? \"\";\n } else if (contentType?.includes(\"text\")) {\n responseBody = await clonedResponse.text();\n }\n } catch (error) {\n responseBody = `[Unable to read response body] ${error}`;\n console.error(\"[LynxConsole] Error reading response body:\", error);\n }\n\n updateNetworkEntry(id, {\n status: \"success\",\n statusCode: response.status,\n statusText: response.statusText,\n endTime,\n duration: endTime - startTime,\n responseHeaders,\n responseBody: responseBody ?? \"\",\n });\n\n return response;\n } catch (error) {\n const endTime = Date.now();\n updateNetworkEntry(id, {\n status: \"error\",\n endTime,\n duration: endTime - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n };\n\n // biome-ignore lint/suspicious/noTsIgnore: to assign fetch to global functionfetch\n // @ts-ignore\n // biome-ignore lint/suspicious/noGlobalAssign: to assign fetch to global functionfetch fetch\n fetch = monitoredFetch as typeof fetch;\n\n //fetch 대신 lynx.fetch를 사용하는 경우에도 모니터링 되도록 설정\n lynx.fetch = monitoredFetch as typeof lynx.fetch;\n\n console.log(\"[LynxConsole] ✅ Network monitoring initialized\");\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { PerformanceEntryData, PerformanceEntryType } from \"../types\";\n\ntype PerformanceListener = (entry: PerformanceEntryData) => void;\n\nconst generatePerformanceId = (): string => {\n return `performance-${Date.now()}-${Math.random()}`;\n};\n\nconst addPerformanceEntry = (entry: PerformanceEntryData): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.performances || !state?.performanceListeners) {\n console.error(\n \"[LynxConsole] Cannot add performance entry: Performance monitor not initialized. Call initPerformanceMonitor() first.\",\n );\n return;\n }\n\n state.performances.push(entry);\n state.performanceListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nexport const initPerformanceMonitor = () => {\n \"background only\";\n\n if (!lynx.performance) {\n console.warn(\n \"[LynxConsole] lynx.performance not available, skipping performance monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.performances !== undefined) {\n console.warn(\"[LynxConsole] Performance monitor already initialized\");\n return;\n }\n\n state.performances = [];\n state.performanceListeners = new Set();\n state.subscribePerformance = (listener: PerformanceListener) => {\n state.performanceListeners?.add(listener);\n return () => {\n state.performanceListeners?.delete(listener);\n };\n };\n\n const observer = lynx.performance.createObserver((entry) => {\n const performanceEntry: PerformanceEntryData = {\n id: generatePerformanceId(),\n entryType: entry.entryType as PerformanceEntryType,\n name: entry.name,\n timestamp: Date.now(),\n rawEntry: entry,\n };\n\n addPerformanceEntry(performanceEntry);\n });\n\n observer.observe([\n \"pipeline\", // LoadBundleEntry\n \"init\", // InitLynxviewEntry\n \"metric\", // MetricEntry\n ]);\n\n console.log(\"[LynxConsole] ✅ Performance monitoring initialized\");\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"setup.mjs","names":[],"sources":["../src/shared/ensureConsoleStructure.ts","../src/setup/setupLogMonitor.ts","../src/setup/_setupMainThreadConsole.ts","../src/setup/setupMainThreadConsole.ts","../src/setup/setupNetworkMonitor.ts","../src/setup/setupPerformanceMonitor.ts"],"sourcesContent":["type LynxConsole = NonNullable<typeof globalThis.__LYNX_CONSOLE__>;\ntype ConsoleState = NonNullable<LynxConsole[\"state\"]>;\n\nexport const ensureConsoleStructure = (): {\n lynxConsole: LynxConsole;\n state: ConsoleState;\n} => {\n if (!globalThis.__LYNX_CONSOLE__) {\n globalThis.__LYNX_CONSOLE__ = {};\n }\n\n if (!globalThis.__LYNX_CONSOLE__.state) {\n globalThis.__LYNX_CONSOLE__.state = {};\n }\n\n return {\n lynxConsole: globalThis.__LYNX_CONSOLE__,\n state: globalThis.__LYNX_CONSOLE__.state,\n };\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\ntype LogListener = (entry: LogEntry) => void;\n\nconst LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\nconst LOG_ID_PREFIX = \"background-thread\";\n\nconst generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n};\n\nconst createLogEntry = (method: LogLevel, args: unknown[]): LogEntry => {\n return {\n id: generateLogId(),\n level: method,\n message: \"\",\n timestamp: Date.now(),\n args,\n };\n};\n\nconst addLogEntry = (entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.logs || !state?.logListeners) {\n console.error(\n \"[LynxConsole] Cannot add log entry: Log monitor not initialized. Call initLogMonitor() first.\",\n );\n return;\n }\n\n state.logs.push(entry);\n state.logListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\n// Background Thread: Log monitoring 초기화\nexport const initLogMonitor = () => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.originalConsole) {\n console.warn(\"[LynxConsole] Log monitor already initialized\");\n return;\n }\n\n const originalConsole = globalThis.console;\n lynxConsole.originalConsole = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n state.logs = [];\n state.logListeners = new Set();\n state.logSubscribe = (listener: LogListener) => {\n state.logListeners?.add(listener);\n return () => {\n state.logListeners?.delete(listener);\n };\n };\n\n // Background Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n globalThis.console[method] = ((...args: unknown[]) => {\n lynxConsole.originalConsole?.[method](...args);\n const entry = createLogEntry(method, args);\n addLogEntry(entry);\n }).bind(globalThis.console);\n });\n\n lynxConsole.originalConsole?.log(\n \"[LynxConsole] ✅ Log monitoring initialized\",\n );\n};\n","import { runOnBackground } from \"@lynx-js/react\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nconst _setupMainThreadConsole = (): void => {\n \"main thread\";\n\n //IMPORTANT: do not use external functions in main thread\n if (!globalThis.__LYNX_CONSOLE__) globalThis.__LYNX_CONSOLE__ = {};\n const lynxConsole = globalThis.__LYNX_CONSOLE__;\n\n if (lynxConsole.mainThreadInitialized) {\n console.warn(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n const LOG_METHODS: LogLevel[] = [\"log\", \"warn\", \"error\", \"info\"];\n const LOG_ID_PREFIX = \"main-thread\";\n\n const serializeArgs = (args: unknown[]): unknown[] => {\n return args.map((arg) => {\n try {\n JSON.stringify(arg);\n return arg;\n } catch {\n return String(arg);\n }\n });\n };\n\n const generateLogId = (): string => {\n return `${LOG_ID_PREFIX}-${Date.now()}-${Math.random()}`;\n };\n\n // Main Thread에서 Background Thread로 로그 전송하는 함수\n const sendLogToBackground = runOnBackground((entry: LogEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state) return;\n\n state.logs?.push(entry);\n state.logListeners?.forEach((listener) => {\n listener(entry);\n });\n });\n\n const originalConsole = globalThis.console;\n\n const originalMethods = {\n log: originalConsole.log.bind(originalConsole),\n warn: originalConsole.warn.bind(originalConsole),\n error: originalConsole.error.bind(originalConsole),\n info: originalConsole.info.bind(originalConsole),\n };\n\n // Main Thread console 오버라이드\n LOG_METHODS.forEach((method) => {\n const original = originalMethods[method];\n originalConsole[method] = ((...args: unknown[]) => {\n // 원본 console 호출\n original(...args);\n\n const serializedArgs = serializeArgs(args);\n const timestamp = Date.now();\n const id = generateLogId();\n\n sendLogToBackground({\n id,\n level: method,\n message: \"\",\n timestamp,\n args: serializedArgs,\n });\n }).bind(originalConsole);\n });\n\n lynxConsole.mainThreadInitialized = true;\n\n originalConsole.log(\"[LynxConsole] ✅ Main thread console initialized\");\n};\n\nexport default _setupMainThreadConsole;\n","// both thread;\nimport \"./_setupMainThreadConsole\";\n\nimport { runOnMainThread } from \"@lynx-js/react\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport _setupMainThreadConsole from \"./_setupMainThreadConsole\";\n\n// Main Thread: Console 초기화\n\nexport const initMainThreadConsole = async (): Promise<void> => {\n \"background only\";\n\n const { lynxConsole, state } = ensureConsoleStructure();\n\n if (lynxConsole.mainThreadInitialized) {\n console.error(\"[LynxConsole] Main thread console already initialized\");\n return;\n }\n\n if (!state.logs) {\n console.error(\"[LynxConsole] Background thread console not initialized\");\n return;\n }\n\n try {\n const setupOnMainThread = runOnMainThread(_setupMainThreadConsole);\n await setupOnMainThread();\n } catch (error) {\n console.error(\n \"[LynxConsole] Failed to initialize main thread console:\",\n error,\n );\n }\n};\n","import { stringify } from \"javascript-stringify\";\nimport { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { NetworkEntry } from \"../types\";\n\nconst generateNetworkId = (): string => {\n return `network-${Date.now()}-${Math.random()}`;\n};\n\nconst extractUrl = (input: RequestInfo | URL): string => {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.href;\n return (input as Request).url;\n};\n\nconst extractMethod = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): string | undefined => {\n if (init?.method) return init.method;\n if (typeof input === \"object\" && \"method\" in input) {\n return (input as Request).method;\n }\n return \"GET\";\n};\n\nconst extractHeaders = (\n headers: HeadersInit | undefined,\n): Record<string, string> => {\n const result: Record<string, string> = {};\n if (!headers) return result;\n\n try {\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n result[key] = value;\n });\n } else if (Array.isArray(headers)) {\n headers.forEach(([key, value]) => {\n result[key] = value;\n });\n } else {\n Object.entries(headers).forEach(([key, value]) => {\n result[key] = value;\n });\n }\n } catch (error) {\n console.error(\"[LynxConsole] Failed to extract headers:\", error);\n }\n\n return result;\n};\n\nconst mergeRequestHeaders = (\n input: RequestInfo | URL,\n init?: RequestInit,\n): Record<string, string> => {\n const merged: Record<string, string> = {};\n\n // Request 객체나 URL 객체에서 헤더 추출\n if (typeof input === \"object\" && \"headers\" in input) {\n Object.assign(merged, extractHeaders(input.headers as HeadersInit));\n }\n\n // RequestInit에서 헤더 추출 (나중 값이 우선)\n if (init?.headers) {\n Object.assign(merged, extractHeaders(init.headers));\n }\n\n return merged;\n};\n\nconst addNetworkEntry = (entry: NetworkEntry): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot add network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n state.networks.push(entry);\n state.networksMap.set(entry.id, entry);\n\n state.networkListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nconst updateNetworkEntry = (\n id: string,\n updates: Partial<NetworkEntry>,\n): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.networks || !state?.networksMap || !state?.networkListeners) {\n console.error(\n \"[LynxConsole] Cannot update network entry: Network monitor not initialized. Call initNetworkMonitor() first.\",\n );\n return;\n }\n\n const existingEntry = state.networksMap.get(id);\n if (!existingEntry) {\n console.error(\n `[LynxConsole] Cannot update network entry: Entry with id '${id}' not found.`,\n );\n return;\n }\n\n const updatedEntry = { ...existingEntry, ...updates };\n\n const index = state.networks.findIndex((entry) => entry.id === id);\n if (index !== -1) {\n state.networks[index] = updatedEntry;\n }\n\n state.networksMap.set(id, updatedEntry);\n\n state.networkListeners.forEach((listener) => {\n listener(updatedEntry);\n });\n};\n\nexport const initNetworkMonitor = () => {\n if (!lynx.fetch) {\n console.warn(\n \"[LynxConsole] lynx.fetch not available, skipping network monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.networks !== undefined) {\n console.warn(\"[LynxConsole] Network monitor already initialized\");\n return;\n }\n\n type NetworkListener = (entry: NetworkEntry) => void;\n state.networks = [];\n state.networksMap = new Map();\n state.networkListeners = new Set();\n state.subscribeNetwork = (listener: NetworkListener) => {\n state.networkListeners?.add(listener);\n return () => {\n state.networkListeners?.delete(listener);\n };\n };\n\n const originalFetch = fetch.bind(lynx);\n\n const monitoredFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const id = generateNetworkId();\n const startTime = Date.now();\n const url = extractUrl(input);\n const method = extractMethod(input, init);\n\n const requestHeaders = mergeRequestHeaders(input, init);\n\n // Request body 처리\n let requestBody: string | undefined;\n if (init?.body) {\n if (typeof init.body === \"string\") {\n requestBody = init.body;\n } else if (init.body instanceof URLSearchParams) {\n requestBody = init.body.toString();\n } else {\n // Lynx가 지원하지 않는 타입이거나 알 수 없는 타입\n requestBody = String(init.body);\n }\n }\n\n addNetworkEntry({\n id,\n url,\n method: method || \"default\",\n status: \"pending\",\n startTime,\n requestHeaders,\n requestBody: requestBody ?? \"\",\n });\n\n try {\n const response = await originalFetch(input, init);\n const endTime = Date.now();\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const clonedResponse = response.clone();\n let responseBody: string | undefined;\n\n try {\n const headerMap: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headerMap[key.toLowerCase()] = value;\n });\n\n const contentType = headerMap[\"content-type\"];\n if (contentType?.includes(\"application/json\")) {\n const json = await clonedResponse.json();\n responseBody = stringify(json, null, 2, { references: true }) ?? \"\";\n } else if (contentType?.includes(\"text\")) {\n responseBody = await clonedResponse.text();\n }\n } catch (error) {\n responseBody = `[Unable to read response body] ${error}`;\n console.error(\"[LynxConsole] Error reading response body:\", error);\n }\n\n updateNetworkEntry(id, {\n status: \"success\",\n statusCode: response.status,\n statusText: response.statusText,\n endTime,\n duration: endTime - startTime,\n responseHeaders,\n responseBody: responseBody ?? \"\",\n });\n\n return response;\n } catch (error) {\n const endTime = Date.now();\n updateNetworkEntry(id, {\n status: \"error\",\n endTime,\n duration: endTime - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n };\n\n // biome-ignore lint/suspicious/noTsIgnore: to assign fetch to global functionfetch\n // @ts-ignore\n // biome-ignore lint/suspicious/noGlobalAssign: to assign fetch to global functionfetch fetch\n fetch = monitoredFetch as typeof fetch;\n\n //fetch 대신 lynx.fetch를 사용하는 경우에도 모니터링 되도록 설정\n lynx.fetch = monitoredFetch as typeof lynx.fetch;\n\n console.log(\"[LynxConsole] ✅ Network monitoring initialized\");\n};\n","import { ensureConsoleStructure } from \"../shared/ensureConsoleStructure\";\nimport type { PerformanceEntryData, PerformanceEntryType } from \"../types\";\n\ntype PerformanceListener = (entry: PerformanceEntryData) => void;\n\nconst generatePerformanceId = (): string => {\n return `performance-${Date.now()}-${Math.random()}`;\n};\n\nconst addPerformanceEntry = (entry: PerformanceEntryData): void => {\n const state = globalThis.__LYNX_CONSOLE__?.state;\n if (!state?.performances || !state?.performanceListeners) {\n console.error(\n \"[LynxConsole] Cannot add performance entry: Performance monitor not initialized. Call initPerformanceMonitor() first.\",\n );\n return;\n }\n\n state.performances.push(entry);\n state.performanceListeners.forEach((listener) => {\n listener(entry);\n });\n};\n\nexport const initPerformanceMonitor = () => {\n \"background only\";\n\n if (!lynx.performance) {\n console.warn(\n \"[LynxConsole] lynx.performance not available, skipping performance monitor\",\n );\n return;\n }\n\n const { state } = ensureConsoleStructure();\n\n if (state.performances !== undefined) {\n console.warn(\"[LynxConsole] Performance monitor already initialized\");\n return;\n }\n\n state.performances = [];\n state.performanceListeners = new Set();\n state.subscribePerformance = (listener: PerformanceListener) => {\n state.performanceListeners?.add(listener);\n return () => {\n state.performanceListeners?.delete(listener);\n };\n };\n\n const observer = lynx.performance.createObserver((entry) => {\n const performanceEntry: PerformanceEntryData = {\n id: generatePerformanceId(),\n entryType: entry.entryType as PerformanceEntryType,\n name: entry.name,\n timestamp: Date.now(),\n rawEntry: entry,\n };\n\n addPerformanceEntry(performanceEntry);\n });\n\n observer.observe([\n \"pipeline\", // LoadBundleEntry\n \"init\", // InitLynxviewEntry\n \"metric\", // MetricEntry\n ]);\n\n console.log(\"[LynxConsole] ✅ Performance monitoring initialized\");\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lynx-console",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"**/*.css",
|
|
@@ -30,16 +30,16 @@
|
|
|
30
30
|
"dev": "tsdown --watch"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@lynx-js/react": "^0.
|
|
34
|
-
"@lynx-js/types": "^3.
|
|
33
|
+
"@lynx-js/react": "^0.116.0",
|
|
34
|
+
"@lynx-js/types": "^3.7.0",
|
|
35
35
|
"@types/react": "^18.3.28",
|
|
36
36
|
"react": "^18.3.1",
|
|
37
37
|
"tsdown": "^0.20.1",
|
|
38
38
|
"typescript": "^5.9.3"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@lynx-js/react": "^0.
|
|
42
|
-
"@lynx-js/types": "^3.
|
|
41
|
+
"@lynx-js/react": "^0.116.0",
|
|
42
|
+
"@lynx-js/types": "^3.7.0",
|
|
43
43
|
"@types/react": "^18"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
@@ -54,16 +54,8 @@
|
|
|
54
54
|
display: flex;
|
|
55
55
|
flex-direction: column;
|
|
56
56
|
gap: 8px;
|
|
57
|
-
padding
|
|
58
|
-
padding-bottom: 16px;
|
|
57
|
+
padding: 24px 50px 16px 16px;
|
|
59
58
|
justify-content: flex-start;
|
|
60
|
-
padding-left: 16px;
|
|
61
|
-
padding-right: 50px;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.bs-title {
|
|
65
|
-
font-size: 1.25rem;
|
|
66
|
-
line-height: 1.6875rem;
|
|
67
59
|
}
|
|
68
60
|
|
|
69
61
|
.bs-body {
|
|
@@ -77,8 +69,5 @@
|
|
|
77
69
|
.bs-footer {
|
|
78
70
|
display: flex;
|
|
79
71
|
flex-direction: column;
|
|
80
|
-
padding
|
|
81
|
-
padding-right: 16px;
|
|
82
|
-
padding-top: 12px;
|
|
83
|
-
padding-bottom: 16px;
|
|
72
|
+
padding: 12px 16px 16px;
|
|
84
73
|
}
|
|
@@ -11,11 +11,6 @@
|
|
|
11
11
|
height: 100%;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
.cp-placeholderText {
|
|
15
|
-
font-size: 0.875rem;
|
|
16
|
-
line-height: 1.1875rem;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
14
|
.cp-logContainer {
|
|
20
15
|
display: flex;
|
|
21
16
|
flex-direction: column;
|
|
@@ -43,11 +38,6 @@
|
|
|
43
38
|
border-radius: 4px;
|
|
44
39
|
}
|
|
45
40
|
|
|
46
|
-
.cp-filterButtonText {
|
|
47
|
-
font-size: 0.8125rem;
|
|
48
|
-
line-height: 1.125rem;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
41
|
.cp-filterDropdown {
|
|
52
42
|
position: absolute;
|
|
53
43
|
top: 100%;
|
|
@@ -70,16 +60,9 @@
|
|
|
70
60
|
}
|
|
71
61
|
|
|
72
62
|
.cp-filterCheckbox {
|
|
73
|
-
font-size: 0.8125rem;
|
|
74
|
-
line-height: 1.125rem;
|
|
75
63
|
width: 16px;
|
|
76
64
|
}
|
|
77
65
|
|
|
78
|
-
.cp-filterLabel {
|
|
79
|
-
font-size: 0.8125rem;
|
|
80
|
-
line-height: 1.125rem;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
66
|
.cp-searchWrapper {
|
|
84
67
|
display: flex;
|
|
85
68
|
flex-direction: row;
|
|
@@ -92,36 +75,19 @@
|
|
|
92
75
|
gap: 8px;
|
|
93
76
|
}
|
|
94
77
|
|
|
95
|
-
.cp-searchPrompt {
|
|
96
|
-
font-size: 1.125rem;
|
|
97
|
-
line-height: 1.5rem;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
78
|
.cp-searchInput {
|
|
101
79
|
flex: 1;
|
|
102
|
-
font-size: 0.8125rem;
|
|
103
|
-
line-height: 1.125rem;
|
|
104
80
|
}
|
|
105
81
|
|
|
106
82
|
.cp-searchClear {
|
|
107
83
|
padding: 2px 4px;
|
|
108
84
|
}
|
|
109
85
|
|
|
110
|
-
.cp-searchClearText {
|
|
111
|
-
font-size: 0.8125rem;
|
|
112
|
-
line-height: 1.125rem;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
86
|
.cp-clearButton {
|
|
116
87
|
padding: 3px 6px;
|
|
117
88
|
border-radius: 4px;
|
|
118
89
|
}
|
|
119
90
|
|
|
120
|
-
.cp-clearButtonText {
|
|
121
|
-
font-size: 0.8125rem;
|
|
122
|
-
line-height: 1.125rem;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
91
|
.cp-logList {
|
|
126
92
|
flex: 1;
|
|
127
93
|
padding-top: 0;
|
|
@@ -142,26 +108,15 @@
|
|
|
142
108
|
}
|
|
143
109
|
|
|
144
110
|
.cp-logLevel {
|
|
145
|
-
font-size: 0.75rem;
|
|
146
|
-
line-height: 1rem;
|
|
147
111
|
margin-right: 8px;
|
|
148
112
|
}
|
|
149
113
|
|
|
150
|
-
.cp-logTime {
|
|
151
|
-
font-size: 0.75rem;
|
|
152
|
-
line-height: 1rem;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
114
|
.cp-toggleIndicator {
|
|
156
|
-
font-size: 0.75rem;
|
|
157
|
-
line-height: 1rem;
|
|
158
115
|
margin-left: 4px;
|
|
159
116
|
align-self: flex-start;
|
|
160
117
|
}
|
|
161
118
|
|
|
162
119
|
.cp-logMessage {
|
|
163
|
-
font-size: 0.8125rem;
|
|
164
|
-
line-height: 1.125rem;
|
|
165
120
|
word-break: break-all;
|
|
166
121
|
}
|
|
167
122
|
|
|
@@ -172,21 +127,6 @@
|
|
|
172
127
|
gap: 8px;
|
|
173
128
|
}
|
|
174
129
|
|
|
175
|
-
.cp-logArgItem {
|
|
176
|
-
font-size: 0.8125rem;
|
|
177
|
-
line-height: 1.125rem;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
.cp-argString {
|
|
181
|
-
font-size: 0.8125rem;
|
|
182
|
-
line-height: 1.125rem;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
.cp-argPrimitive {
|
|
186
|
-
font-size: 0.8125rem;
|
|
187
|
-
line-height: 1.125rem;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
130
|
.cp-argObject {
|
|
191
131
|
display: flex;
|
|
192
132
|
flex-direction: column;
|
|
@@ -199,11 +139,6 @@
|
|
|
199
139
|
gap: 4px;
|
|
200
140
|
}
|
|
201
141
|
|
|
202
|
-
.cp-argObjectPreview {
|
|
203
|
-
font-size: 0.8125rem;
|
|
204
|
-
line-height: 1.125rem;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
142
|
.cp-argObjectContent {
|
|
208
143
|
margin-top: 4px;
|
|
209
144
|
display: flex;
|
|
@@ -217,16 +152,6 @@
|
|
|
217
152
|
align-items: flex-start;
|
|
218
153
|
}
|
|
219
154
|
|
|
220
|
-
.cp-argObjectKey {
|
|
221
|
-
font-size: 0.8125rem;
|
|
222
|
-
line-height: 1.125rem;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
.cp-argObjectJson {
|
|
226
|
-
font-size: 0.8125rem;
|
|
227
|
-
line-height: 1.125rem;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
155
|
.cp-replInputRow {
|
|
231
156
|
display: flex;
|
|
232
157
|
flex-direction: row;
|
|
@@ -237,15 +162,11 @@
|
|
|
237
162
|
}
|
|
238
163
|
|
|
239
164
|
.cp-replPrompt {
|
|
240
|
-
font-size: 1.625rem;
|
|
241
|
-
line-height: 2.1875rem;
|
|
242
165
|
padding-bottom: 8px;
|
|
243
166
|
}
|
|
244
167
|
|
|
245
168
|
.cp-replInput {
|
|
246
169
|
flex: 1;
|
|
247
|
-
font-size: 1rem;
|
|
248
|
-
line-height: 1.375rem;
|
|
249
170
|
padding-bottom: 8px;
|
|
250
171
|
}
|
|
251
172
|
|
|
@@ -254,8 +175,3 @@
|
|
|
254
175
|
border-radius: 4px;
|
|
255
176
|
margin-bottom: 8px;
|
|
256
177
|
}
|
|
257
|
-
|
|
258
|
-
.cp-replRunButtonText {
|
|
259
|
-
font-size: 0.8125rem;
|
|
260
|
-
line-height: 1.125rem;
|
|
261
|
-
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { ReactNode } from "@lynx-js/react";
|
|
1
2
|
import { useConsole, useNetwork, usePerformance } from "../hooks";
|
|
2
3
|
import type { CustomTab } from "../types";
|
|
3
4
|
import "./ConsolePanel.css";
|
|
4
|
-
import {
|
|
5
|
+
import { dismissFilterDropdown, LogPanel } from "./LogPanel";
|
|
5
6
|
import { NetworkPanel } from "./NetworkPanel";
|
|
6
7
|
import { PerformancePanel } from "./PerformancePanel";
|
|
7
8
|
import Tabs from "./Tabs";
|
|
@@ -20,7 +21,7 @@ export const ConsolePanel = ({ customTabs }: ConsolePanelProps) => {
|
|
|
20
21
|
const items: Array<{
|
|
21
22
|
key: string;
|
|
22
23
|
label: string;
|
|
23
|
-
renderContent: () =>
|
|
24
|
+
renderContent: () => ReactNode;
|
|
24
25
|
}> = [];
|
|
25
26
|
|
|
26
27
|
if (state?.logs) {
|
|
@@ -11,10 +11,7 @@
|
|
|
11
11
|
.fb-button {
|
|
12
12
|
position: relative;
|
|
13
13
|
overflow: hidden;
|
|
14
|
-
padding
|
|
15
|
-
padding-right: 8px;
|
|
16
|
-
padding-top: 4px;
|
|
17
|
-
padding-bottom: 4px;
|
|
14
|
+
padding: 4px 8px;
|
|
18
15
|
border-radius: 12px;
|
|
19
16
|
display: flex;
|
|
20
17
|
flex-direction: column;
|
|
@@ -35,14 +32,10 @@
|
|
|
35
32
|
}
|
|
36
33
|
|
|
37
34
|
.fb-title {
|
|
38
|
-
font-size: 0.875rem;
|
|
39
|
-
line-height: 1.1875rem;
|
|
40
35
|
text-align: center;
|
|
41
36
|
}
|
|
42
37
|
|
|
43
38
|
.fb-subtitle {
|
|
44
|
-
font-size: 0.8125rem;
|
|
45
|
-
line-height: 1.125rem;
|
|
46
39
|
text-align: center;
|
|
47
40
|
}
|
|
48
41
|
|
|
@@ -26,15 +26,11 @@ const SHINE_STYLES = {
|
|
|
26
26
|
},
|
|
27
27
|
} as const;
|
|
28
28
|
|
|
29
|
-
export const FloatingButton = ({
|
|
30
|
-
bindtap,
|
|
31
|
-
children,
|
|
32
|
-
}: FloatingButtonProps) => {
|
|
29
|
+
export const FloatingButton = ({ bindtap, children }: FloatingButtonProps) => {
|
|
33
30
|
const colors = useThemeColors();
|
|
34
31
|
const { phase, right, bottom, clearTimer, handlers } =
|
|
35
32
|
useLongPressDrag(bindtap);
|
|
36
33
|
|
|
37
|
-
|
|
38
34
|
const handleReload = () => {
|
|
39
35
|
try {
|
|
40
36
|
lynx.reload({}, () => {
|
|
@@ -48,39 +44,37 @@ export const FloatingButton = ({
|
|
|
48
44
|
const isDragging = phase === "dragging";
|
|
49
45
|
|
|
50
46
|
return (
|
|
51
|
-
|
|
47
|
+
<view
|
|
48
|
+
className={"fb-wrapper"}
|
|
49
|
+
consume-slide-event={[[-180, 180]]}
|
|
50
|
+
style={{
|
|
51
|
+
right: `${right}px`,
|
|
52
|
+
bottom: `${bottom}px`,
|
|
53
|
+
transform: isDragging ? "scale(1.05)" : "scale(1)",
|
|
54
|
+
transition: `transform ${duration.d4} cubic-bezier(0.4, 0, 0.2, 1)`,
|
|
55
|
+
}}
|
|
56
|
+
{...handlers}
|
|
57
|
+
>
|
|
52
58
|
<view
|
|
53
|
-
className={"fb-
|
|
54
|
-
|
|
55
|
-
style={{
|
|
56
|
-
right: `${right}px`,
|
|
57
|
-
bottom: `${bottom}px`,
|
|
58
|
-
transform: isDragging ? "scale(1.05)" : "scale(1)",
|
|
59
|
-
transition: `transform ${duration.d4} cubic-bezier(0.4, 0, 0.2, 1)`,
|
|
60
|
-
}}
|
|
61
|
-
{...handlers}
|
|
59
|
+
className={"fb-button"}
|
|
60
|
+
style={{ backgroundColor: colors.palette.green600 }}
|
|
62
61
|
>
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
62
|
+
{children}
|
|
63
|
+
<view className={"fb-shineOverlay"} style={SHINE_STYLES[phase]} />
|
|
64
|
+
</view>
|
|
65
|
+
<view
|
|
66
|
+
className={"fb-reloadButton"}
|
|
67
|
+
style={{ backgroundColor: colors.palette.green600 }}
|
|
68
|
+
catchtouchstart={() => clearTimer()}
|
|
69
|
+
bindtap={handleReload}
|
|
70
|
+
>
|
|
71
|
+
<text
|
|
72
|
+
className={"fb-reloadIcon"}
|
|
73
|
+
style={{ color: colors.palette.staticWhite }}
|
|
75
74
|
>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
style={{ color: colors.palette.staticWhite }}
|
|
79
|
-
>
|
|
80
|
-
{"\u21BB"}
|
|
81
|
-
</text>
|
|
82
|
-
</view>
|
|
75
|
+
{"\u21BB"}
|
|
76
|
+
</text>
|
|
83
77
|
</view>
|
|
84
|
-
|
|
78
|
+
</view>
|
|
85
79
|
);
|
|
86
80
|
};
|