feat: user avatars from plex (#53)

This commit is contained in:
sct
2020-09-06 19:30:16 +09:00
committed by GitHub
parent 190a8831c7
commit e6349c13a0
6 changed files with 19 additions and 6 deletions

View File

@@ -27,6 +27,9 @@ export class User {
@Column({ type: 'integer', default: 0 }) @Column({ type: 'integer', default: 0 })
public permissions = 0; public permissions = 0;
@Column()
public avatar: string;
@CreateDateColumn() @CreateDateColumn()
public createdAt: Date; public createdAt: Date;

View File

@@ -23,6 +23,8 @@ components:
permissions: permissions:
type: number type: number
example: 0 example: 0
avatar:
type: string
createdAt: createdAt:
type: string type: string
example: '2020-09-02T05:02:23.000Z' example: '2020-09-02T05:02:23.000Z'

View File

@@ -46,6 +46,9 @@ authRoutes.post('/login', async (req, res) => {
user.plexToken = body.authToken; user.plexToken = body.authToken;
await userRepository.save(user); await userRepository.save(user);
} }
// Update the users avatar with their plex thumbnail (incase it changed)
user.avatar = account.thumb;
} else { } else {
// Here we check if it's the first user. If it is, we create the user with no check // Here we check if it's the first user. If it is, we create the user with no check
// and give them admin permissions // and give them admin permissions
@@ -56,6 +59,7 @@ authRoutes.post('/login', async (req, res) => {
email: account.email, email: account.email,
plexToken: account.authToken, plexToken: account.authToken,
permissions: Permission.ADMIN, permissions: Permission.ADMIN,
avatar: account.thumb,
}); });
await userRepository.save(user); await userRepository.save(user);
} }

View File

@@ -1,7 +1,9 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import Transition from '../../Transition'; import Transition from '../../Transition';
import { useUser } from '../../../hooks/useUser';
const UserDropdown: React.FC = () => { const UserDropdown: React.FC = () => {
const { user } = useUser();
const [isDropdownOpen, setDropdownOpen] = useState(false); const [isDropdownOpen, setDropdownOpen] = useState(false);
return ( return (
@@ -14,11 +16,7 @@ const UserDropdown: React.FC = () => {
aria-haspopup="true" aria-haspopup="true"
onClick={() => setDropdownOpen((state) => !state)} onClick={() => setDropdownOpen((state) => !state)}
> >
<img <img className="h-8 w-8 rounded-full" src={user?.avatar} alt="" />
className="h-8 w-8 rounded-full"
src="https://avatars1.githubusercontent.com/u/234213?s=460&u=7f30f76bd7bbdab45bab7544ebd80aa88ea11caf&v=4"
alt=""
/>
</button> </button>
</div> </div>
<Transition <Transition

View File

@@ -15,9 +15,13 @@ export const UserContext: React.FC<UserContextProps> = ({
initialUser, initialUser,
children, children,
}) => { }) => {
const { user } = useUser({ initialData: initialUser }); const { user, revalidate } = useUser({ initialData: initialUser });
const router = useRouter(); const router = useRouter();
useEffect(() => {
revalidate();
}, [router.pathname, revalidate]);
useEffect(() => { useEffect(() => {
if (!router.pathname.match(/(setup|login)/) && !user) { if (!router.pathname.match(/(setup|login)/) && !user) {
router.push('/login'); router.push('/login');

View File

@@ -3,6 +3,8 @@ import { useRef } from 'react';
export interface User { export interface User {
id: number; id: number;
email: string; email: string;
avatar: string;
permissions: number;
} }
interface UserHookResponse { interface UserHookResponse {