1
- // import { userBrowserTabs, userBrowserContextMenus } from './browser-compat';
1
+ import Dexie from 'dexie' ;
2
+ import {
3
+ initializeSlurs ,
4
+ getAllSlurs ,
5
+ convertSlurMetadataFromDBtoJSON ,
6
+ getSlursBySource ,
7
+ addSlur ,
8
+ deleteSlur ,
9
+ slurExists ,
10
+ bulkAddSlurs ,
11
+ fetchPublicSlursMetadata ,
12
+ bulkDeleteSlurs ,
13
+ initializeMetadata
14
+ } from './slur-store' ;
15
+ import { getPublicSlurs } from './api/public-slurs' ;
2
16
console . log ( 'bg script 8' ) ;
3
17
18
+ let db ;
19
+ let isSlurInitialized = false ;
20
+ // init db schema
21
+ function initializeDB ( ) {
22
+ if ( ! db ) {
23
+ db = new Dexie ( 'SlurWordsDatabase' ) ;
24
+ db . version ( 1 ) . stores ( {
25
+ words : '++id, slur_id, word, source, enable_status, batch' ,
26
+ words_metadata :
27
+ '++id, slur_id, label, level_of_severity, casual, appropriated, appropriation_context, meaning, language, batch, categories, timestamp'
28
+ } ) ;
29
+ console . log ( 'Database Initialized' ) ;
30
+ }
31
+ return db ;
32
+ }
33
+
34
+ ( async ( ) => {
35
+ try {
36
+ const db = initializeDB ( ) ;
37
+
38
+ if ( ! isSlurInitialized ) {
39
+ await initializeSlurs ( db ) ;
40
+ await initializeMetadata ( db )
41
+ isSlurInitialized = true ;
42
+ }
43
+ } catch ( error ) {
44
+ console . error ( 'Error initializing extension:' , error ) ;
45
+ }
46
+ } ) ( ) ;
47
+
4
48
const BROWSER_CHROME = 'chrome' ;
5
49
const BROWSER_FIREFOX = 'firefox' ;
6
50
const BROWSER_UNSUPPORTED = 'unsupported' ;
@@ -39,16 +83,18 @@ userBrowserTabs.onUpdated.addListener(function (tabId, changeInfo) {
39
83
}
40
84
} ) ;
41
85
42
- userBrowserContextMenus . create (
43
- {
44
- id : 'add-slur' ,
45
- title : 'Add Slur to Uli' ,
46
- contexts : [ 'selection' ]
47
- } ,
48
- ( ) => {
49
- console . log ( 'context menu created' ) ;
50
- }
51
- ) ;
86
+ userBrowserContextMenus . removeAll ( ( ) => {
87
+ userBrowserContextMenus . create (
88
+ {
89
+ id : 'add-slur' ,
90
+ title : 'Add Slur to Uli' ,
91
+ contexts : [ 'selection' ]
92
+ } ,
93
+ ( ) => {
94
+ console . log ( 'context menu created' ) ;
95
+ }
96
+ ) ;
97
+ } ) ;
52
98
53
99
userBrowserContextMenus . onClicked . addListener ( ( info , tab ) => {
54
100
switch ( info . menuItemId ) {
@@ -66,3 +112,117 @@ userBrowserContextMenus.onClicked.addListener((info, tab) => {
66
112
console ( 'unexpected action' ) ;
67
113
}
68
114
} ) ;
115
+
116
+ chrome . runtime . onMessage . addListener ( ( request , sender , sendResponse ) => {
117
+ switch ( request . type ) {
118
+ case 'initializeSlurs' :
119
+ handleInitSlurs ( request , sendResponse , db ) ;
120
+ return true ;
121
+ case 'updateDataMsgToBG' :
122
+ handleUpdateData ( request , sendResponse , db ) ;
123
+ return true ;
124
+ case 'fetchPersonalSlursToBG' :
125
+ handleFetchPersonalSlurs ( request , sendResponse , db ) ;
126
+ return true ;
127
+ case 'syncApprovedCrowdsourcedSlursToBG' :
128
+ handleSyncApprovedSlurs ( request , sendResponse , db ) ;
129
+ return true ;
130
+ default :
131
+ return false ;
132
+ }
133
+ } ) ;
134
+
135
+ async function handleInitSlurs ( request , sendResponse , db ) {
136
+ try {
137
+ allSlurWords = await getAllSlurs ( db ) ;
138
+ allMetadata = await convertSlurMetadataFromDBtoJSON ( db ) ;
139
+ sendResponse ( {
140
+ status : 200 ,
141
+ allSlurWords : allSlurWords ,
142
+ allMetadata : allMetadata
143
+ } ) ;
144
+ } catch ( error ) {
145
+ console . error ( 'Error initializing slurs in service worker:' , error ) ;
146
+ sendResponse ( { status : 400 , message : error . message } ) ;
147
+ }
148
+ }
149
+
150
+ async function handleUpdateData ( request , sendResponse , db ) {
151
+ try {
152
+ const newSlurs = request . data ;
153
+ console . log ( 'New slurs received:' , newSlurs ) ;
154
+
155
+ // Fetch existing slurs
156
+ const existingSlurs = ( await getSlursBySource ( db , 'personal' ) ) . map (
157
+ ( slur ) => slur . word
158
+ ) ;
159
+ // Add new slurs to the database
160
+ for ( const slur of newSlurs ) {
161
+ if ( ! existingSlurs . includes ( slur ) ) {
162
+ await addSlur ( db , slur , 'personal' ) ;
163
+ }
164
+ }
165
+ // Remove slurs from the database that no longer exist in the new list
166
+ for ( const slur of existingSlurs ) {
167
+ if ( ! newSlurs . includes ( slur ) ) {
168
+ await deleteSlur ( db , slur , 'personal' ) ;
169
+ }
170
+ }
171
+ sendResponse ( { status : 200 } ) ;
172
+ } catch ( error ) {
173
+ console . error ( 'Error during updating slur list:' , error ) ;
174
+ sendResponse ( { status : 400 , message : error . message } ) ;
175
+ }
176
+ }
177
+
178
+ async function handleFetchPersonalSlurs ( request , sendResponse , db ) {
179
+ try {
180
+ console . log ( 'Fetching personal slurs' ) ;
181
+ const personalSlurs = await getSlursBySource ( db , 'personal' ) ;
182
+ const slurArr = personalSlurs . map ( ( slur ) => slur . word ) ;
183
+ console . log ( 'Sending personal slurs:' , slurArr ) ;
184
+ sendResponse ( slurArr ) ;
185
+ } catch ( error ) {
186
+ console . error ( 'Error fetching personal slurs:' , error ) ;
187
+ sendResponse ( { status : 400 , message : error . message } ) ;
188
+ }
189
+ }
190
+
191
+ async function handleSyncApprovedSlurs ( request , sendResponse , db ) {
192
+ const source = 'public_crowdsourced_slurs' ;
193
+ try {
194
+ const publicSlurs = await getPublicSlurs ( ) ;
195
+ const publicSlursArray = publicSlurs . map ( ( slur ) => slur . label ) ;
196
+ // console.log('Public slurs fetched:', publicSlursArray);
197
+
198
+ const existingSlurs = await getSlursBySource ( db , source )
199
+
200
+ const publicSlurSet = new Set ( publicSlurs . map ( s => s . id ) )
201
+ const existingSlurSet = new Set ( existingSlurs . map ( s => s . slur_id ) )
202
+
203
+ const newSlurs = publicSlurs . filter ( s =>
204
+ ! existingSlurSet . has ( s . id )
205
+ ) ;
206
+ // Identify metadata that needs to be removed (exists in DB but not in fetched data)
207
+ const outdatedSlurs = existingSlurs . filter ( s =>
208
+ ! publicSlurSet . has ( s . slur_id )
209
+ ) ;
210
+
211
+ if ( newSlurs . length > 0 ) {
212
+ await bulkAddSlurs ( db , newSlurs , source ) ;
213
+ } else {
214
+ console . log ( 'No new slurs to add.' ) ;
215
+ }
216
+
217
+ if ( outdatedSlurs . length > 0 ) {
218
+ await bulkDeleteSlurs ( db , outdatedSlurs ) ;
219
+ }
220
+
221
+ // Fetch public metadata again
222
+ await fetchPublicSlursMetadata ( db ) ;
223
+ sendResponse ( { status : 200 } ) ;
224
+ } catch ( error ) {
225
+ console . error ( 'Error syncing approved slurs:' , error ) ;
226
+ sendResponse ( { status : 400 , message : error . message } ) ;
227
+ }
228
+ }
0 commit comments