Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "reactmap",
"version": "1.4.1",
"version": "1.5.0",
"description": "React based frontend map.",
"main": "ReactMap.mjs",
"author": "TurtIeSocks <58572875+TurtIeSocks@users.noreply.github.com>",
Expand Down
4 changes: 4 additions & 0 deletions server/src/configs/custom-environment-variables.json
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,10 @@
"maxConnections": {
"__name": "DATABASE_SETTINGS_MAX_CONNECTIONS",
"__format": "number"
},
"extraUserFields": {
"__name": "DATABASE_SETTINGS_EXTRA_USER_FIELDS",
"__format": "json"
}
},
"schemas": {
Expand Down
3 changes: 2 additions & 1 deletion server/src/configs/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,8 @@
"gymBadgeTableName": "gymBadges",
"sessionTableName": "session",
"migrationTableName": "knex_migrations",
"maxConnections": 10
"maxConnections": 10,
"extraUserFields": []
},
"schemas": []
},
Expand Down
22 changes: 22 additions & 0 deletions server/src/db/migrations/20221006032139_add_data_column.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* eslint-disable no-unused-vars */
const { database: { settings: { userTableName: tableName } } } = require('../../services/config')

/**
* @typedef {import("knex")} Knex
*/

/**
* @param {Knex} knex
*/
exports.up = async (knex) => knex.schema
.table(tableName, (table) => {
table.json('data')
})

/**
* @param {Knex} knex
*/
exports.down = async (knex) => knex.schema
.table(tableName, (table) => {
table.dropColumn('data')
})
15 changes: 15 additions & 0 deletions server/src/graphql/resolvers.js
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,21 @@ module.exports = {
const results = await User.query().where('username', args.username)
return Boolean(results.length)
},
setExtraFields: async (_, { key, value }, { req }) => {
if (req.user?.id) {
const user = await User.query().findById(req.user.id)
if (user) {
const data =
typeof user.data === 'string'
? JSON.parse(user.data)
: user.data || {}
data[key] = value
await user.$query().update({ data: JSON.stringify(data) })
}
return true
}
return false
},
setGymBadge: async (_, args, { req }) => {
const perms = req.user ? req.user.perms : false
if (perms?.gymBadges && req?.user?.id) {
Expand Down
2 changes: 1 addition & 1 deletion server/src/graphql/typeDefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ module.exports = gql`
webhookName: String
ts: Int
midnight: Int

onlyAreas: [String]
): [Search]
searchQuest(
Expand Down Expand Up @@ -123,5 +122,6 @@ module.exports = gql`
strategy(strategy: String): Boolean
checkUsername(username: String): Boolean
setGymBadge(gymId: String, badge: Int): Boolean
setExtraFields(key: String, value: String): Boolean
}
`
1 change: 1 addition & 0 deletions server/src/routes/rootRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ rootRouter.get('/settings', async (req, res) => {
gymValidDataLimit:
Date.now() / 1000 - config.api.gymValidDataLimit * 86400,
},
extraUserFields: config.database.settings.extraUserFields,
available: { pokemon: [], pokestops: [], gyms: [], nests: [] },
}

Expand Down
4 changes: 2 additions & 2 deletions src/components/layout/FloatingBtn.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useEffect, useRef } from 'react'
import { Grid, Fab } from '@material-ui/core'
import {
Menu,
LocationOn,
MyLocation,
ZoomIn,
ZoomOut,
Search,
Expand Down Expand Up @@ -216,7 +216,7 @@ export default function FloatingButtons({
onClick={() => lc._onClick()}
title={t('use_my_location')}
>
<LocationOn color={color} fontSize={iconSize} />
<MyLocation color={color} fontSize={iconSize} />
</Fab>
</Grid>
<Grid item>
Expand Down
50 changes: 50 additions & 0 deletions src/components/layout/dialogs/UserProfile.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
CardContent,
IconButton,
Dialog,
TextField,
} from '@material-ui/core'
import { Edit } from '@material-ui/icons'
import { useTranslation } from 'react-i18next'
Expand Down Expand Up @@ -72,6 +73,7 @@ export default function UserProfile({ setUserProfile, isMobile, isTablet }) {
<TabPanel value={tab} index={0}>
<div style={{ minHeight: '70vh' }}>
<LinkProfiles auth={auth} t={t} />
<ExtraFields auth={auth} />
<GymBadges
badges={auth.badges}
isMobile={isMobile}
Expand Down Expand Up @@ -190,6 +192,54 @@ const LinkProfiles = ({ auth, t }) => {
)
}

const ExtraFields = ({ auth }) => {
const extraUserFields = useStatic((state) => state.extraUserFields)
const setAuth = useStatic((state) => state.setAuth)

const [setField] = useMutation(Query.user('setExtraFields'))

return (
<Grid
container
alignItems="center"
justifyContent="center"
style={{ marginBottom: 10 }}
>
{extraUserFields.map((field) => {
const locale = localStorage.getItem('i18nextLng') || 'en'
const label =
typeof field === 'string' ? field : field[locale] || field.name
const key = typeof field === 'string' ? field : field.database
if (!key || !label) return null
return (
<Grid key={label} item xs={5} style={{ margin: '10px 0' }}>
<TextField
variant="outlined"
label={label}
value={auth.data?.[key] || ''}
onChange={({ target: { value } }) => {
setAuth({
...auth,
data: {
...auth.data,
[key]: value,
},
})
setField({
variables: {
key,
value,
},
})
}}
/>
</Grid>
)
})}
</Grid>
)
}

const ProfilePermissions = ({ perms, excludeList, t }) => {
const {
map: { permImageDir, permArrayImages },
Expand Down
13 changes: 8 additions & 5 deletions src/hooks/useConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export default function useConfig(serverSettings, params) {
const setStaticFilters = useStatic((state) => state.setFilters)
const setWebhookData = useStatic((state) => state.setWebhookData)
const setIsNight = useStatic((state) => state.setIsNight)
const setExtraUserFields = useStatic((state) => state.setExtraUserFields)

const localState = JSON.parse(localStorage.getItem('local-state'))

Expand All @@ -58,14 +59,15 @@ export default function useConfig(serverSettings, params) {
}

setAuth({
strategy: serverSettings.user.strategy,
discordId: serverSettings.user.discordId,
telegramId: serverSettings.user.telegramId,
webhookStrategy: serverSettings.user.webhookStrategy,
strategy: serverSettings.user?.strategy || '',
discordId: serverSettings.user?.discordId || '',
telegramId: serverSettings.user?.telegramId || '',
webhookStrategy: serverSettings.user?.webhookStrategy || '',
loggedIn: serverSettings.loggedIn,
perms: serverSettings.user ? serverSettings.user.perms : {},
methods: serverSettings.authMethods,
username: serverSettings.user.username,
username: serverSettings.user?.username || '',
data: serverSettings.user?.data || {},
})
Sentry.setUser({
username: serverSettings.user.username,
Expand All @@ -86,6 +88,7 @@ export default function useConfig(serverSettings, params) {
setAvailable(serverSettings.available)
setMenus(updateObjState(serverSettings.menus, 'menus'))
setStaticMenus(serverSettings.menus)
setExtraUserFields(serverSettings.extraUserFields)

if (localState?.state?.filters?.pokemon?.standard) {
delete localState.state.filters.pokemon.standard
Expand Down
2 changes: 2 additions & 0 deletions src/hooks/useStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,6 @@ export const useStatic = create((set) => ({
setFeedback: (feedback) => set({ feedback }),
resetFilters: false,
setResetFilters: (resetFilters) => set({ resetFilters }),
extraUserFields: [],
setExtraUserFields: (extraUserFields) => set({ extraUserFields }),
}))
6 changes: 6 additions & 0 deletions src/services/queries/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,9 @@ export const setGymBadge = gql`
setGymBadge(gymId: $gymId, badge: $badge)
}
`

export const setExtraFields = gql`
mutation SetExtraFields($key: String, $value: String) {
setExtraFields(key: $key, value: $value)
}
`