mirror of
https://iceshrimp.dev/Crimekillz/jointrashposs.git
synced 2024-11-22 00:43:50 +01:00
(add) エラー報告フォームに動作環境を自動追記
This commit is contained in:
parent
42a8fb003d
commit
47bbd175c3
66
assets/js/misc/get-issue-url.ts
Normal file
66
assets/js/misc/get-issue-url.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import { withQuery } from 'ufo';
|
||||||
|
|
||||||
|
export async function getGhIssueUrl(options: {
|
||||||
|
lang: string;
|
||||||
|
repoUrl: string;
|
||||||
|
}) {
|
||||||
|
// Issue Templateのプレフィル
|
||||||
|
let environment = `* Model and OS of the device(s):
|
||||||
|
* Browser:`;
|
||||||
|
let template = '02_visitor-bug-report-en.yml';
|
||||||
|
|
||||||
|
if (options.lang === 'ja') {
|
||||||
|
template = '01_visitor-bug-report-ja.yml';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.client) {
|
||||||
|
//@ts-ignore
|
||||||
|
if ('userAgentData' in navigator && 'getHighEntropyValues' in navigator.userAgentData) {
|
||||||
|
//@ts-ignore
|
||||||
|
const uaData = await navigator.userAgentData.getHighEntropyValues([
|
||||||
|
"fullVersionList",
|
||||||
|
"platformVersion",
|
||||||
|
]);
|
||||||
|
let osVersion = 'v' + uaData.platformVersion;
|
||||||
|
if (uaData.platform === 'Windows') {
|
||||||
|
// https://learn.microsoft.com/ja-jp/microsoft-edge/web-platform/how-to-detect-win11
|
||||||
|
const majorPlatformVersion = parseInt(uaData.platformVersion.split('.')[0]);
|
||||||
|
if (majorPlatformVersion >= 13) {
|
||||||
|
osVersion = '11 or later';
|
||||||
|
}
|
||||||
|
else if (majorPlatformVersion > 0) {
|
||||||
|
osVersion = '10';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
osVersion = '8.1 or before';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const browserData = uaData.fullVersionList.find((item: any) => item.brand.toLowerCase() !== 'not_a brand');
|
||||||
|
const env = [
|
||||||
|
`* Model and OS of the device(s): ${uaData.platform} ${osVersion}`,
|
||||||
|
`* Browser: ${browserData.brand} ${browserData.version}`,
|
||||||
|
`* Viewport Size: ${window.innerWidth}x${window.innerHeight}`,
|
||||||
|
`* (UA Detected Using getHighEntropyValues)`,
|
||||||
|
];
|
||||||
|
environment = env.join('\n');
|
||||||
|
} else {
|
||||||
|
const UAParser = (await import('ua-parser-js')).default;
|
||||||
|
const ua = new UAParser();
|
||||||
|
const uaRes = ua.getResult();
|
||||||
|
const env = [
|
||||||
|
`* Model and OS of the device(s): ${uaRes.os.name} v${uaRes.os.version}`,
|
||||||
|
`* Browser: ${uaRes.browser.name} (${uaRes.engine.name}) v${uaRes.browser.version}`,
|
||||||
|
`* Viewport Size: ${window.innerWidth}x${window.innerHeight}`,
|
||||||
|
`* Raw User Agent: ${uaRes.ua}`,
|
||||||
|
];
|
||||||
|
environment = env.join('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return withQuery(`${options.repoUrl}/issues/new`, {
|
||||||
|
template,
|
||||||
|
environment,
|
||||||
|
labels: 'maybe non-developer,bug?',
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
13
error.vue
13
error.vue
@ -15,7 +15,7 @@
|
|||||||
<p class="text-center mb-4">{{ error?.statusCode === 404 ? $t('_error.notFoundDesc') : $t('_error.generalErrorDesc') }}</p>
|
<p class="text-center mb-4">{{ error?.statusCode === 404 ? $t('_error.notFoundDesc') : $t('_error.generalErrorDesc') }}</p>
|
||||||
<div class="max-w-lg w-full mx-auto grid grid-cols-1 sm:grid-cols-2 gap-4">
|
<div class="max-w-lg w-full mx-auto grid grid-cols-1 sm:grid-cols-2 gap-4">
|
||||||
<button class="block rounded-full text-center px-4 py-2 border-2 hover:opacity-70" @click="handleError">{{ $t('_error.goToTop') }}</button>
|
<button class="block rounded-full text-center px-4 py-2 border-2 hover:opacity-70" @click="handleError">{{ $t('_error.goToTop') }}</button>
|
||||||
<GNuxtLink class="block rounded-full text-center px-4 py-2 border-2 hover:opacity-70" target="_blank" :to="`${runtimeConfig.public.repositoryUrl}/issues/new`">{{ $t('_error.reportProblem') }}</GNuxtLink>
|
<GNuxtLink class="block rounded-full text-center px-4 py-2 border-2 hover:opacity-70" target="_blank" :to="issueReportLink">{{ $t('_error.reportProblem') }}</GNuxtLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="mx-auto py-5">
|
<div v-else class="mx-auto py-5">
|
||||||
@ -27,7 +27,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import type { LocaleObject } from '@nuxtjs/i18n/dist/runtime/composables';
|
||||||
import NProgress from 'nprogress';
|
import NProgress from 'nprogress';
|
||||||
|
import { getGhIssueUrl } from './assets/js/misc/get-issue-url';
|
||||||
|
|
||||||
const error = useError();
|
const error = useError();
|
||||||
const colorMode = useColorMode();
|
const colorMode = useColorMode();
|
||||||
@ -49,7 +51,7 @@ const handleError = () => clearError({ redirect: localePath('/') });
|
|||||||
* 中国大陸で Google Fonts を使う裏技
|
* 中国大陸で Google Fonts を使う裏技
|
||||||
* fonts.googleapis.com → fonts.googleapis.cn
|
* fonts.googleapis.com → fonts.googleapis.cn
|
||||||
**/
|
**/
|
||||||
const cnHead = (locale.value === 'cn') ? [
|
const cnHead = (locale.value === 'cn') ? [
|
||||||
{ rel: 'preconnect', href: 'https://fonts.googleapis.cn' },
|
{ rel: 'preconnect', href: 'https://fonts.googleapis.cn' },
|
||||||
{ rel: 'preconnect', href: 'https://fonts.gstatic.cn' },
|
{ rel: 'preconnect', href: 'https://fonts.gstatic.cn' },
|
||||||
{ rel: 'stylesheet', href: 'https://fonts.googleapis.cn/css2?family=Capriola&family=Nunito:ital,wght@0,400;0,700;1,400;1,700&display=swap' }
|
{ rel: 'stylesheet', href: 'https://fonts.googleapis.cn/css2?family=Capriola&family=Nunito:ital,wght@0,400;0,700;1,400;1,700&display=swap' }
|
||||||
@ -59,6 +61,13 @@ const handleError = () => clearError({ redirect: localePath('/') });
|
|||||||
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Capriola&family=Nunito:ital,wght@0,400;0,700;1,400;1,700&display=swap' },
|
{ rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Capriola&family=Nunito:ital,wght@0,400;0,700;1,400;1,700&display=swap' },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const { data: issueReportLink } = await useAsyncData(`issueReportLink_${locale.value}`, () => getGhIssueUrl({
|
||||||
|
lang: locale.value,
|
||||||
|
repoUrl: runtimeConfig.public.repositoryUrl,
|
||||||
|
}), {
|
||||||
|
server: false,
|
||||||
|
});
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
htmlAttrs: {
|
htmlAttrs: {
|
||||||
lang: currentLocaleIso.value,
|
lang: currentLocaleIso.value,
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/node": "^20.10.5",
|
"@types/node": "^20.10.5",
|
||||||
"@types/nprogress": "^0.2.3",
|
"@types/nprogress": "^0.2.3",
|
||||||
|
"@types/ua-parser-js": "^0.7.39",
|
||||||
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.0.5",
|
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.0.5",
|
||||||
"autoprefixer": "^10.4.16",
|
"autoprefixer": "^10.4.16",
|
||||||
"bootstrap": "^5.3.2",
|
"bootstrap": "^5.3.2",
|
||||||
@ -32,6 +33,7 @@
|
|||||||
"schema-dts": "^1.1.2",
|
"schema-dts": "^1.1.2",
|
||||||
"sitemap": "^7.1.1",
|
"sitemap": "^7.1.1",
|
||||||
"tailwindcss": "^3.4.0",
|
"tailwindcss": "^3.4.0",
|
||||||
|
"ua-parser-js": "^1.0.37",
|
||||||
"ufo": "^1.3.2",
|
"ufo": "^1.3.2",
|
||||||
"vite-svg-loader": "^4.0.0"
|
"vite-svg-loader": "^4.0.0"
|
||||||
},
|
},
|
||||||
|
@ -34,6 +34,9 @@ devDependencies:
|
|||||||
'@types/nprogress':
|
'@types/nprogress':
|
||||||
specifier: ^0.2.3
|
specifier: ^0.2.3
|
||||||
version: 0.2.3
|
version: 0.2.3
|
||||||
|
'@types/ua-parser-js':
|
||||||
|
specifier: ^0.7.39
|
||||||
|
version: 0.7.39
|
||||||
aiscript-vscode:
|
aiscript-vscode:
|
||||||
specifier: github:aiscript-dev/aiscript-vscode#v0.0.5
|
specifier: github:aiscript-dev/aiscript-vscode#v0.0.5
|
||||||
version: github.com/aiscript-dev/aiscript-vscode/a8fa5bb41885391cdb6a6e3165eaa6e4868da86e
|
version: github.com/aiscript-dev/aiscript-vscode/a8fa5bb41885391cdb6a6e3165eaa6e4868da86e
|
||||||
@ -79,6 +82,9 @@ devDependencies:
|
|||||||
tailwindcss:
|
tailwindcss:
|
||||||
specifier: ^3.4.0
|
specifier: ^3.4.0
|
||||||
version: 3.4.0
|
version: 3.4.0
|
||||||
|
ua-parser-js:
|
||||||
|
specifier: ^1.0.37
|
||||||
|
version: 1.0.37
|
||||||
ufo:
|
ufo:
|
||||||
specifier: ^1.3.2
|
specifier: ^1.3.2
|
||||||
version: 1.3.2
|
version: 1.3.2
|
||||||
@ -2304,6 +2310,10 @@ packages:
|
|||||||
'@types/node': 20.10.5
|
'@types/node': 20.10.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/ua-parser-js@0.7.39:
|
||||||
|
resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/unist@2.0.10:
|
/@types/unist@2.0.10:
|
||||||
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
|
resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
|
||||||
dev: true
|
dev: true
|
||||||
@ -7785,6 +7795,10 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/ua-parser-js@1.0.37:
|
||||||
|
resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/ufo@1.3.2:
|
/ufo@1.3.2:
|
||||||
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
|
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
Loading…
Reference in New Issue
Block a user