From ec4d5857d80938758ce64930159be2c941d4e30f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 26 Dec 2020 14:11:08 +0900
Subject: [PATCH] Fix service worker generation

---
 src/client/scripts/compose-notification.ts | 95 ----------------------
 src/client/sw/compose-notification.ts      | 90 ++++++++++++++++++++
 src/client/sw/i18n.ts                      |  3 +
 src/client/{ => sw}/sw.ts                  |  3 +-
 webpack.config.ts                          |  2 +-
 5 files changed, 95 insertions(+), 98 deletions(-)
 delete mode 100644 src/client/scripts/compose-notification.ts
 create mode 100644 src/client/sw/compose-notification.ts
 create mode 100644 src/client/sw/i18n.ts
 rename src/client/{ => sw}/sw.ts (93%)

diff --git a/src/client/scripts/compose-notification.ts b/src/client/scripts/compose-notification.ts
deleted file mode 100644
index 1552d45e4e..0000000000
--- a/src/client/scripts/compose-notification.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import getNoteSummary from '../../misc/get-note-summary';
-import getUserName from '../../misc/get-user-name';
-import { clientDb, get, bulkGet } from '../db';
-
-const getTranslation = (text: string): Promise<string> => get(text, clientDb.i18n);
-
-export default async function(type, data): Promise<[string, NotificationOptions]> {
-	const contexts = ['deletedNote', 'invisibleNote', 'withNFiles', 'poll'];
-	const locale = Object.fromEntries(await bulkGet(contexts, clientDb.i18n) as [string, string][]);
-
-	switch (type) {
-		case 'driveFileCreated': // TODO (Server Side)
-			return [await getTranslation('_notification.fileUploaded'), {
-				body: data.name,
-				icon: data.url
-			}];
-		case 'notification':
-			switch (data.type) {
-				case 'mention':
-					return [(await getTranslation('_notification.youGotMention')).replace('{name}', getUserName(data.user)), {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'reply':
-					return [(await getTranslation('_notification.youGotReply')).replace('{name}', getUserName(data.user)), {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'renote':
-					return [(await getTranslation('_notification.youRenoted')).replace('{name}', getUserName(data.user)), {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'quote':
-					return [(await getTranslation('_notification.youGotQuote')).replace('{name}', getUserName(data.user)), {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'reaction':
-					return [`${data.reaction} ${getUserName(data.user)}`, {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'pollVote':
-					return [(await getTranslation('_notification.youGotPoll')).replace('{name}', getUserName(data.user)), {
-						body: getNoteSummary(data.note, locale),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'follow':
-					return [await getTranslation('_notification.youWereFollowed'), {
-						body: getUserName(data.user),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'receiveFollowRequest':
-					return [await getTranslation('_notification.youReceivedFollowRequest'), {
-						body: getUserName(data.user),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'followRequestAccepted':
-					return [await getTranslation('_notification.yourFollowRequestAccepted'), {
-						body: getUserName(data.user),
-						icon: data.user.avatarUrl
-					}];
-
-				case 'groupInvited':
-					return [await getTranslation('_notification.youWereInvitedToGroup'), {
-						body: data.group.name
-					}];
-
-				default:
-					return null;
-			}
-		case 'unreadMessagingMessage':
-			if (data.groupId === null) {
-				return [(await getTranslation('_notification.youGotMessagingMessageFromUser')).replace('{name}', getUserName(data.user)), {
-					icon: data.user.avatarUrl,
-					tag: `messaging:user:${data.user.id}`
-				}];
-			}
-			return [(await getTranslation('_notification.youGotMessagingMessageFromGroup')).replace('{name}', data.group.name), {
-				icon: data.user.avatarUrl,
-				tag: `messaging:group:${data.group.id}`
-			}];
-		default:
-			return null;
-	}
-}
diff --git a/src/client/sw/compose-notification.ts b/src/client/sw/compose-notification.ts
new file mode 100644
index 0000000000..0863d7ef8b
--- /dev/null
+++ b/src/client/sw/compose-notification.ts
@@ -0,0 +1,90 @@
+import getNoteSummary from '../../misc/get-note-summary';
+import getUserName from '../../misc/get-user-name';
+import { i18n } from '@/sw/i18n';
+
+export default async function(type, data): Promise<[string, NotificationOptions]> {
+	switch (type) {
+		case 'driveFileCreated': // TODO (Server Side)
+			return [i18n.t('_notification.fileUploaded'), {
+				body: data.name,
+				icon: data.url
+			}];
+		case 'notification':
+			switch (data.type) {
+				case 'mention':
+					return [i18n.t('_notification.youGotMention', { name: getUserName(data.user) }), {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'reply':
+					return [i18n.t('_notification.youGotReply', { name: getUserName(data.user) }), {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'renote':
+					return [i18n.t('_notification.youRenoted', { name: getUserName(data.user) }), {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'quote':
+					return [i18n.t('_notification.youGotQuote', { name: getUserName(data.user) }), {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'reaction':
+					return [`${data.reaction} ${getUserName(data.user)}`, {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'pollVote':
+					return [i18n.t('_notification.youGotPoll', { name: getUserName(data.user) }), {
+						body: getNoteSummary(data.note, i18n.locale),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'follow':
+					return [i18n.t('_notification.youWereFollowed'), {
+						body: getUserName(data.user),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'receiveFollowRequest':
+					return [i18n.t('_notification.youReceivedFollowRequest'), {
+						body: getUserName(data.user),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'followRequestAccepted':
+					return [i18n.t('_notification.yourFollowRequestAccepted'), {
+						body: getUserName(data.user),
+						icon: data.user.avatarUrl
+					}];
+
+				case 'groupInvited':
+					return [i18n.t('_notification.youWereInvitedToGroup'), {
+						body: data.group.name
+					}];
+
+				default:
+					return null;
+			}
+		case 'unreadMessagingMessage':
+			if (data.groupId === null) {
+				return [i18n.t('_notification.youGotMessagingMessageFromUser', { name: getUserName(data.user) }), {
+					icon: data.user.avatarUrl,
+					tag: `messaging:user:${data.user.id}`
+				}];
+			}
+			return [i18n.t('_notification.youGotMessagingMessageFromGroup', { name: data.group.name }), {
+				icon: data.user.avatarUrl,
+				tag: `messaging:group:${data.group.id}`
+			}];
+		default:
+			return null;
+	}
+}
diff --git a/src/client/sw/i18n.ts b/src/client/sw/i18n.ts
new file mode 100644
index 0000000000..524a205b2f
--- /dev/null
+++ b/src/client/sw/i18n.ts
@@ -0,0 +1,3 @@
+import { I18n } from '@/i18n';
+
+export const i18n = new I18n(_LOCALE_);
diff --git a/src/client/sw.ts b/src/client/sw/sw.ts
similarity index 93%
rename from src/client/sw.ts
rename to src/client/sw/sw.ts
index 01ed216029..91d668c27b 100644
--- a/src/client/sw.ts
+++ b/src/client/sw/sw.ts
@@ -3,9 +3,8 @@
  */
 declare var self: ServiceWorkerGlobalScope;
 
-import composeNotification from '@/scripts/compose-notification';
+import composeNotification from '@/sw/compose-notification';
 
-// eslint-disable-next-line no-undef
 const version = _VERSION_;
 const cacheName = `mk-cache-${version}`;
 
diff --git a/webpack.config.ts b/webpack.config.ts
index 2d6ecd1d58..4efbeeb04b 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -38,7 +38,7 @@ module.exports = Object.keys(isProduction ? locales : {
 }).map(lang => ({
 	entry: {
 		app: './src/client/init.ts',
-		sw: './src/client/sw.ts'
+		sw: './src/client/sw/sw.ts'
 	},
 	module: {
 		rules: [{