Skip to content

Commit 1411047

Browse files
committed
Add button to copy spyglass logs to error panel
1 parent 5c44227 commit 1411047

3 files changed

Lines changed: 56 additions & 9 deletions

File tree

‎src/app/components/ErrorPanel.tsx‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import type { ComponentChildren } from 'preact'
22
import { getCurrentUrl } from 'preact-router'
3-
import { useEffect, useMemo, useState } from 'preact/hooks'
3+
import { useCallback, useEffect, useMemo, useState } from 'preact/hooks'
44
import { useProject } from '../contexts/Project.jsx'
55
import { useSpyglass } from '../contexts/Spyglass.jsx'
66
import { useVersion } from '../contexts/Version.jsx'
7+
import { useActiveTimeout } from '../hooks/useActiveTimout.js'
78
import { useAsync } from '../hooks/useAsync.js'
89
import { latestVersion } from '../services/DataFetcher.js'
910
import { getGenerator, SOURCE_REPO_URL } from '../Utils.js'
10-
import { Octicon } from './index.js'
11+
import { Btn, Octicon } from './index.js'
1112

1213
type ErrorPanelProps = {
1314
error: string | Error,
@@ -37,6 +38,10 @@ export function ErrorPanel({ error, prefix, reportable, onDismiss, body: body_,
3738
return await service.readFile(uri)
3839
}, [service, version, projectUri, gen])
3940

41+
const spyglassLogs = useMemo(() => {
42+
return service?.logger.logs
43+
}, [service])
44+
4045
useEffect(() => {
4146
if (error instanceof Error) {
4247
const stack = error.stack!.split('\n').map(line => {
@@ -78,6 +83,14 @@ export function ErrorPanel({ error, prefix, reportable, onDismiss, body: body_,
7883
return url
7984
}, [error, name, body_, version, stack, source, gen?.id])
8085

86+
const [copySpyglassActive, setCopySpyglassActive] = useActiveTimeout()
87+
const copySpyglassLogs = useCallback(() => {
88+
if (spyglassLogs) {
89+
navigator.clipboard.writeText(spyglassLogs.join('\n'))
90+
.then(() => setCopySpyglassActive())
91+
}
92+
}, [spyglassLogs, setCopySpyglassActive])
93+
8194
return <div class="error">
8295
{onDismiss && <div class="error-dismiss" onClick={onDismiss}>{Octicon.x}</div>}
8396
<h3 class="font-bold text-xl !my-[10px]">
@@ -88,6 +101,7 @@ export function ErrorPanel({ error, prefix, reportable, onDismiss, body: body_,
88101
</h3>
89102
{stack && stackVisible && <pre>{stack}</pre>}
90103
{reportable !== false && <p>If you think this is a bug, you can report it <a href={url} target="_blank">on GitHub</a></p>}
104+
{spyglassLogs && <Btn icon={copySpyglassActive ? 'check' : 'copy'} label="Copy logs" onClick={copySpyglassLogs} />}
91105
{children}
92106
</div>
93107
}

‎src/app/services/Spyglass.ts‎

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export class SpyglassService {
8787

8888
private constructor (
8989
public readonly version: VersionId,
90+
public readonly logger: StoredLogger,
9091
private readonly service: core.Service,
9192
private readonly client: SpyglassClient,
9293
) {
@@ -289,7 +290,7 @@ export class SpyglassService {
289290
const currentServiceId = SpyglassService.activeServiceId
290291
await Promise.allSettled(INITIAL_DIRS.map(async uri => client.externals.fs.mkdir(uri)))
291292
const version = siteConfig.versions.find(v => v.id === versionId)!
292-
const logger = console
293+
const logger = new StoredLogger(console)
293294
const service = new core.Service({
294295
logger,
295296
profilers: new core.ProfilerFactory(logger, [
@@ -388,7 +389,7 @@ export class SpyglassService {
388389
logger.info('[SpyglassService] Skipped saving the cache because another service is active')
389390
}
390391
}, 10_000)
391-
return new SpyglassService(versionId, service, client)
392+
return new SpyglassService(versionId, logger, service, client)
392393
}
393394
}
394395

@@ -417,7 +418,7 @@ const initialize: core.ProjectInitializer = async (ctx) => {
417418
const vanillaMcdoc = await fetchVanillaMcdoc()
418419
meta.registerSymbolRegistrar('vanilla-mcdoc', {
419420
checksum: vanillaMcdoc.ref,
420-
registrar: vanillaMcdocRegistrar(vanillaMcdoc),
421+
registrar: vanillaMcdocRegistrar(vanillaMcdoc, logger),
421422
})
422423

423424
meta.registerDependencyProvider('@misode-mcdoc', async () => {
@@ -434,8 +435,10 @@ const initialize: core.ProjectInitializer = async (ctx) => {
434435
const version = siteConfig.versions.find(v => {
435436
return v.dynamic ? v.id === release : v.ref === release
436437
})
437-
if (version === undefined) {
438-
logger.error(`[initialize] Failed finding game version matching ${release}.`)
438+
if (version !== undefined) {
439+
logger.info(`[initialize] Found game version matching ${release}: ${JSON.stringify(version)}`)
440+
} else {
441+
logger.error(`[initialize] Failed finding game version matching ${release}`)
439442
return
440443
}
441444

@@ -532,7 +535,7 @@ function customSymbolRegistrar(summary: McmetaSummary, release: ReleaseVersion):
532535

533536
const VanillaMcdocUri = 'mcdoc://vanilla-mcdoc/symbols.json'
534537

535-
function vanillaMcdocRegistrar(vanillaMcdoc: VanillaMcdocSymbols): core.SymbolRegistrar {
538+
function vanillaMcdocRegistrar(vanillaMcdoc: VanillaMcdocSymbols, logger: core.Logger): core.SymbolRegistrar {
536539
return (symbols) => {
537540
const start = performance.now()
538541
for (const [id, typeDef] of Object.entries(vanillaMcdoc.mcdoc)) {
@@ -554,6 +557,30 @@ function vanillaMcdocRegistrar(vanillaMcdoc: VanillaMcdocSymbols): core.SymbolRe
554557
})
555558
}
556559
const duration = performance.now() - start
557-
console.log(`[vanillaMcdocRegistrar] Done in ${duration}ms`)
560+
logger.info(`[vanillaMcdocRegistrar] Done in ${duration}ms`)
561+
}
562+
}
563+
564+
export class StoredLogger implements core.Logger {
565+
public readonly logs: string[] = []
566+
constructor(
567+
private readonly parent: core.Logger,
568+
) {}
569+
570+
error(data: any, ...args: any[]): void {
571+
this.logs.push(`[ERROR] ${data}${args.map(a => ` ${a}`).join('')}`)
572+
this.parent.error(data, ...args)
573+
}
574+
info(data: any, ...args: any[]): void {
575+
this.logs.push(`[INFO] ${data}${args.map(a => ` ${a}`).join('')}`)
576+
this.parent.info(data, ...args)
577+
}
578+
log(data: any, ...args: any[]): void {
579+
this.logs.push(`[LOG] ${data}${args.map(a => ` ${a}`).join('')}`)
580+
this.parent.log(data, ...args)
581+
}
582+
warn(data: any, ...args: any[]): void {
583+
this.logs.push(`[WARN] ${data}${args.map(a => ` ${a}`).join('')}`)
584+
this.parent.warn(data, ...args)
558585
}
559586
}

‎src/styles/global.css‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,7 @@ main.has-project {
14551455
color: var(--text-1);
14561456
background-color: var(--errors-background);
14571457
border-radius: 3px;
1458+
overflow: hidden;
14581459
}
14591460

14601461
.error > * {
@@ -1487,6 +1488,11 @@ main.has-project {
14871488
color: var(--text-1)
14881489
}
14891490

1491+
.error .btn {
1492+
display: inline-flex;
1493+
margin-top: 0;
1494+
}
1495+
14901496
.error-actions {
14911497
display: flex;
14921498
flex-wrap: wrap;

0 commit comments

Comments
 (0)