Skip to content

Commit cbef213

Browse files
authored
feat: Implement crowdsource slur functionality (#664)
1 parent 59c5bde commit cbef213

25 files changed

+486
-87
lines changed

browser-extension/api-server/controllers/slur.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ const createSlur = async (req, res) => {
6060
casual,
6161
appropriated,
6262
appropriationContext,
63-
labelMeaning,
63+
meaning,
6464
categories,
6565
} = req.body;
6666
console.log(
6767
userId,
6868
label,
69-
labelMeaning,
69+
meaning,
7070
appropriated,
7171
appropriationContext,
7272
categories
@@ -82,7 +82,7 @@ const createSlur = async (req, res) => {
8282
casual,
8383
appropriated,
8484
appropriationContext,
85-
labelMeaning,
85+
meaning,
8686
},
8787
{ transaction: t }
8888
);
@@ -122,7 +122,7 @@ const updateSlur = async (req, res) => {
122122
casual,
123123
appropriated,
124124
appropriationContext,
125-
labelMeaning,
125+
meaning,
126126
categories,
127127
} = req.body;
128128
const t = await sequelize.transaction();
@@ -140,7 +140,7 @@ const updateSlur = async (req, res) => {
140140
existingSlur.casual = casual;
141141
existingSlur.appropriated = appropriated;
142142
existingSlur.appropriationContext = appropriationContext;
143-
existingSlur.labelMeaning = labelMeaning;
143+
existingSlur.meaning = meaning;
144144
await existingSlur.save({ transaction: t });
145145

146146
// Delete existing categories for this slur

browser-extension/api-server/db/migrations/20230906084000-create-slur.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module.exports = {
3131
appropriationContext: {
3232
type: Sequelize.BOOLEAN,
3333
},
34-
labelMeaning: {
34+
meaning: {
3535
type: Sequelize.TEXT,
3636
},
3737
createdAt: {

browser-extension/api-server/db/models/slur.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ module.exports = (sequelize, DataTypes) => {
4545
appropriationContext: {
4646
type: DataTypes.BOOLEAN,
4747
},
48-
labelMeaning: {
48+
meaning: {
4949
type: DataTypes.TEXT,
5050
},
5151
},

browser-extension/api-server/test/testSlurCategorySequelize.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ async function createSlur() {
66
try {
77
await slur.create({
88
label: "test",
9-
labelMeaning: "test",
9+
meaning: "test",
1010
appropriated: false,
1111
appropriationContext: "test",
1212
})
@@ -32,7 +32,7 @@ async function createCategory() {
3232
// try {
3333
// await slur.create({
3434
// label: "test2",
35-
// labelMeaning: "test2",
35+
// meaning: "test2",
3636
// appropriated: true,
3737
// appropriationContext: "test2",
3838
// category: {category:'gender'}
@@ -51,7 +51,7 @@ async function createSlurAndCategory() {
5151
try {
5252
const newSlur = await slur.create({
5353
label: "test2",
54-
labelMeaning: "test2",
54+
meaning: "test2",
5555
appropriated: true,
5656
appropriationContext: "test2",
5757
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import axios from 'axios';
2+
import config from '../config';
3+
4+
const { API_URL } = config;
5+
6+
export async function createCrowdsourceSlur(attrs, authToken) {
7+
try {
8+
const res = await axios.post(`${API_URL}/api/slurs`, attrs, {
9+
headers: {
10+
Authorization: `Bearer ${authToken}`,
11+
'Content-Type': 'application/json'
12+
}
13+
});
14+
15+
return res.data;
16+
} catch (err) {
17+
throw err;
18+
}
19+
}
20+
21+
export async function getCrowdsourceSlurs(authToken) {
22+
try {
23+
const res = await axios.get(`${API_URL}/api/slurs`, {
24+
headers: {
25+
Authorization: `Bearer ${authToken}`
26+
}
27+
});
28+
29+
return res.data.slurs;
30+
} catch (error) {
31+
throw error;
32+
}
33+
}
34+
35+
export async function getCrowdsourceSlurById(id, authToken) {
36+
try {
37+
const result = await axios.get(`${API_URL}/api/slurs/${id}`, {
38+
headers: {
39+
Authorization: `Bearer ${authToken}`
40+
}
41+
});
42+
return result.data.slur;
43+
} catch (err) {
44+
throw err;
45+
}
46+
}
47+
48+
49+
export async function updateCrowdsourceSlur(slurId, updatedData, authToken) {
50+
51+
try {
52+
await axios.put(`${API_URL}/api/slurs/${slurId}`, updatedData, {
53+
headers: {
54+
Authorization: `Bearer ${authToken}`
55+
}
56+
});
57+
58+
59+
} catch (error) {
60+
throw error
61+
}
62+
}
63+
64+
export async function deleteCrowdsourceSlur(slurId, authToken) {
65+
66+
try {
67+
const res = await axios.delete(`${API_URL}/api/slurs/${slurId}`, {
68+
headers: {
69+
Authorization: `Bearer ${authToken}`
70+
}
71+
});
72+
73+
return res.data.deleted_slur;
74+
75+
} catch (error) {
76+
throw error
77+
}
78+
79+
}

browser-extension/plugin/src/api.js browser-extension/plugin/src/api/user.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axios from "axios";
2-
import config from "./config";
2+
import config from "../config";
33

44
const { API_URL } = config;
55

browser-extension/plugin/src/content-script.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { getUserData, getPreferenceData, setPreferenceData } = repository;
88
import { updateSlurList } from './slur-replace';
99
import transformGeneral from './transform-general';
1010
import Api from './ui-components/pages/Api';
11+
import { createCrowdsourceSlur } from './api/crowdsource-slurs';
1112

1213
const { createSlurAndCategory } = Api;
1314

@@ -105,7 +106,6 @@ chrome.runtime.onMessage.addListener(async function (request) {
105106
// console.log('USER in content-script', user);
106107
const crowdsourceData = {
107108
label: slur,
108-
categories: []
109109
};
110110

111111
// Adding Slur to Prefrences
@@ -127,7 +127,8 @@ chrome.runtime.onMessage.addListener(async function (request) {
127127

128128
//Crowdsourcing Slur
129129
try {
130-
await createSlurAndCategory(user.accessToken, crowdsourceData);
130+
// await createSlurAndCategory(user.accessToken, crowdsourceData);
131+
await createCrowdsourceSlur(crowdsourceData, user.token)
131132
console.log('finsihed POST req');
132133
window.alert(`Slur word "${slur}" added to Uli`);
133134
} catch (error) {

browser-extension/plugin/src/slur-crowdsource/adapters.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,26 @@ function slurCreateApiToPlugin(data) {
1717
// newData['appropriated'] = data['casual'] ? 1 : 2;
1818
newData['appropriated'] = data['appropriated'] === true ? 1 : (data['appropriated'] === false ? 2 : undefined);
1919
newData['appropriationContext'] = data['appropriationContext'] === true ? 1 : (data['appropriationContext'] === false ? 2 : undefined);
20-
newData['categories'] = data['categories'].map(
21-
(category) => category.category
22-
);
20+
// newData['categories'] = data['categories'].map(
21+
// (category) => category.category
22+
// );
2323

2424
return newData;
2525
}
2626

27-
export { slurCreateApiToPlugin, slurCreatePluginToApi };
27+
function crowdsourceSlurMapApiKeys(apiSlur){
28+
return {
29+
id: apiSlur["id"],
30+
label: apiSlur["label"],
31+
levelOfSeverity: apiSlur["level_of_severity"],
32+
casual: apiSlur["casual"],
33+
appropriated: apiSlur["appropriated"],
34+
appropriationContext: apiSlur["appropriation_context"],
35+
categories: apiSlur["categories"],
36+
meaning: apiSlur["meaning"] || "",
37+
createdAt: apiSlur["inserted_at"],
38+
updatedAt: apiSlur["updated_at"]
39+
}
40+
}
41+
42+
export { slurCreateApiToPlugin, slurCreatePluginToApi, crowdsourceSlurMapApiKeys };

browser-extension/plugin/src/slur-crowdsource/values.js

+13-12
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@ const defaultMetadata = {
55
appropriated: undefined,
66
appropriationContext: undefined,
77
categories: [],
8-
labelMeaning: ''
8+
meaning: ''
99
};
1010

1111
const categoryOptions = [
12-
'gendered',
13-
'sexualized',
14-
'religion',
15-
'ethnicity',
16-
'political affiliation',
17-
'caste',
18-
'class',
19-
'body shaming',
20-
'ableist',
21-
'sexual identity',
22-
'other'
12+
{value: 'gendered', label: 'Gendered'},
13+
{value: 'sexualized', label: 'Sexualized'},
14+
{value: 'religion', label: 'Religion'},
15+
{value: 'ethnicity', label: 'Ethnicity'},
16+
{value: 'political_affiliation', label: 'Political Affiliation'},
17+
{value: 'caste', label: 'Caste'},
18+
{value: 'class', label: 'Class'},
19+
{value: 'body_shaming', label: 'Body Shaming'},
20+
{value: 'ableist', label: 'Ableist'},
21+
{value: 'sexual_identity', label: 'Sexual Identity'},
22+
{value: 'other', label: 'Other'}
2323
];
2424

25+
2526
export { defaultMetadata, categoryOptions };

browser-extension/plugin/src/ui-components/atoms/SlurCard.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { Alert, FormUp, FormDown } from 'grommet-icons';
1111

1212
const SlurCard = ({ data }) => {
13+
1314
const isDataEmpty =
1415
!data.levelOfSeverity ||
1516
data.casual === undefined ||
@@ -33,6 +34,7 @@ const SlurCard = ({ data }) => {
3334
property: 'value',
3435
header: false,
3536
render: data => {
37+
3638
return data.name === 'Categories' ? (
3739
<Box direction="row" gap="medium" wrap={true}>
3840
{data.value.map((category, categoryIndex) => (
@@ -55,7 +57,7 @@ const SlurCard = ({ data }) => {
5557
if (showMore) {
5658
dataToShow.push(
5759
{ name: 'If, Appropriated, Is it by Community or Others?', value: data.appropriationContext ? 'Community' : 'Others' },
58-
{ name: 'What Makes it Problematic?', value: data.labelMeaning },
60+
{ name: 'What Makes it Problematic?', value: data.meaning },
5961
{ name: 'Categories', value: data.categories },
6062
);
6163
}

browser-extension/plugin/src/ui-components/atoms/SlurCardBubble.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const SlurCardBubble = ({ data }) => {
1111
width={'fit-content'}
1212
wrap={true}
1313
>
14-
<Text size={'small'}>{data.category}</Text>{' '}
14+
<Text size={'small'}>{data}</Text>{' '}
1515
</Box>
1616
</Box>
1717
);

browser-extension/plugin/src/ui-components/pages/Debug.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ const { getUserData, getPreferenceData, setUserData, setPreferenceData } =
1919
repository;
2020
const { resetAccount } = Api;
2121
import { Hide, View } from 'grommet-icons';
22-
import { userLogin } from '../../api';
2322
import config from '../../config';
23+
import { userLogin } from '../../api/user';
2424

2525
const { API_URL } = config;
2626

browser-extension/plugin/src/ui-components/pages/Preferences.jsx

+24-19
Original file line numberDiff line numberDiff line change
@@ -178,25 +178,30 @@ export function PreferencesHome() {
178178
// alert(JSON.stringify({preferenceInLS, preference}))
179179

180180
try {
181-
if (user) {
182-
const preferenceRemote = await savePreference(
183-
user.accessToken,
184-
preference
185-
);
186-
187-
await setPreferenceData({
188-
...preferenceRemote.data,
189-
language,
190-
enableSlurReplacement,
191-
enableSlurMetadata
192-
});
193-
} else {
194-
await setPreferenceData({
195-
language,
196-
enableSlurReplacement,
197-
enableSlurMetadata
198-
});
199-
}
181+
await setPreferenceData({
182+
language,
183+
enableSlurReplacement,
184+
enableSlurMetadata
185+
});
186+
// if (user) {
187+
// const preferenceRemote = await savePreference(
188+
// user.accessToken,
189+
// preference
190+
// );
191+
192+
// await setPreferenceData({
193+
// ...preferenceRemote.data,
194+
// language,
195+
// enableSlurReplacement,
196+
// enableSlurMetadata
197+
// });
198+
// } else {
199+
// await setPreferenceData({
200+
// language,
201+
// enableSlurReplacement,
202+
// enableSlurMetadata
203+
// });
204+
// }
200205

201206
const enableSlurReplacementChanged =
202207
enableSlurReplacement !== preferenceInLS.enableSlurReplacement;

0 commit comments

Comments
 (0)