| import { type Editor } from "@graphite/editor"; |
| import { DisplayDialogPanic } from "@graphite/messages"; |
| import { type DialogState } from "@graphite/state-providers/dialog"; |
| import { browserVersion, operatingSystem } from "@graphite/utility-functions/platform"; |
| import { stripIndents } from "@graphite/utility-functions/strip-indents"; |
|
|
| export function createPanicManager(editor: Editor, dialogState: DialogState) { |
| |
| editor.subscriptions.subscribeJsMessage(DisplayDialogPanic, (displayDialogPanic) => { |
| |
| |
| (Error as any).stackTraceLimit = Infinity; |
| const stackTrace = new Error().stack || ""; |
| const panicDetails = `${displayDialogPanic.panicInfo}${stackTrace ? `\n\n${stackTrace}` : ""}`; |
|
|
| |
| console.error(panicDetails); |
|
|
| dialogState.createCrashDialog(panicDetails); |
| }); |
| } |
|
|
| export function githubUrl(panicDetails: string): string { |
| const url = new URL("https://github.com/GraphiteEditor/Graphite/issues/new"); |
|
|
| const buildUrl = (includeCrashReport: boolean) => { |
| let body = stripIndents` |
| **Describe the Crash** |
| Explain clearly what you were doing when the crash occurred. |
| |
| **Steps To Reproduce** |
| Describe precisely how the crash occurred, step by step, starting with a new editor window. |
| 1. Open the Graphite editor at https://editor.graphite.rs |
| 2. |
| 3. |
| 4. |
| 5. |
| |
| **Additional Details** |
| Provide any further information or context that you think would be helpful in fixing the issue. Screenshots or video can be linked or attached to this issue. |
| |
| **Browser and OS** |
| ${browserVersion()}, ${operatingSystem(true).replace("Unknown", "YOUR OPERATING SYSTEM")} |
| |
| **Stack Trace** |
| Copied from the crash dialog in the Graphite editor: |
| `; |
|
|
| const manualCopyStackTraceNotice = stripIndents` |
| Before submitting this bug, REPLACE THIS WITH THE LOG. Return to the editor and click "Copy Error Log" in the crash dialog and paste it in place of this text. |
| `; |
|
|
| body += "\n\n```\n"; |
| body += includeCrashReport ? panicDetails.trimEnd() : manualCopyStackTraceNotice; |
| body += "\n```"; |
|
|
| const fields = { |
| title: "[Crash Report] ", |
| body, |
| labels: ["Crash"].join(","), |
| projects: [].join(","), |
| milestone: "", |
| assignee: "", |
| template: "", |
| }; |
|
|
| Object.entries(fields).forEach(([field, value]) => { |
| if (value) url.searchParams.set(field, value); |
| }); |
|
|
| return url.toString(); |
| }; |
|
|
| let urlString = buildUrl(true); |
| if (urlString.length >= 8192) { |
| |
| urlString = buildUrl(false); |
| } |
| return urlString; |
| } |
|
|