basic avatar upload

This commit is contained in:
Anton 2023-10-13 18:32:23 +02:00
parent 2dfdb874bc
commit 29eedc3a37
13 changed files with 117 additions and 32 deletions

15
package-lock.json generated
View File

@ -10,8 +10,10 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@heroicons/react": "^2.0.17", "@heroicons/react": "^2.0.17",
"@types/offscreencanvas": "^2019.7.1",
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-image-crop": "^10.1.8",
"react-leaflet": "^4.2.1", "react-leaflet": "^4.2.1",
"react-leaflet-cluster": "^2.1.0", "react-leaflet-cluster": "^2.1.0",
"react-router-dom": "^6.16.0", "react-router-dom": "^6.16.0",
@ -283,6 +285,11 @@
"@types/geojson": "*" "@types/geojson": "*"
} }
}, },
"node_modules/@types/offscreencanvas": {
"version": "2019.7.1",
"resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz",
"integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ=="
},
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.5", "version": "15.7.5",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
@ -3792,6 +3799,14 @@
"react": "^18.2.0" "react": "^18.2.0"
} }
}, },
"node_modules/react-image-crop": {
"version": "10.1.8",
"resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-10.1.8.tgz",
"integrity": "sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==",
"peerDependencies": {
"react": ">=16.13.1"
}
},
"node_modules/react-is": { "node_modules/react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",

View File

@ -44,8 +44,10 @@
}, },
"dependencies": { "dependencies": {
"@heroicons/react": "^2.0.17", "@heroicons/react": "^2.0.17",
"@types/offscreencanvas": "^2019.7.1",
"leaflet": "^1.9.4", "leaflet": "^1.9.4",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-image-crop": "^10.1.8",
"react-leaflet": "^4.2.1", "react-leaflet": "^4.2.1",
"react-leaflet-cluster": "^2.1.0", "react-leaflet-cluster": "^2.1.0",
"react-router-dom": "^6.16.0", "react-router-dom": "^6.16.0",

View File

@ -3,26 +3,34 @@ import NavBar from './NavBar'
import { BrowserRouter } from 'react-router-dom' import { BrowserRouter } from 'react-router-dom'
import { ToastContainer } from 'react-toastify' import { ToastContainer } from 'react-toastify'
import { QuestsProvider } from '../Gaming/hooks/useQuests' import { QuestsProvider } from '../Gaming/hooks/useQuests'
import { AssetsProvider, useSetAssetApi } from './hooks/useAssets'
import { useEffect } from 'react'
import { SetAssetsApi } from './SetAssetsApi'
export function AppShell({ appName, children, assetsApi }) {
export function AppShell({ appName, children }) {
return ( return (
<BrowserRouter> <BrowserRouter>
<QuestsProvider initialOpen={false}> <AssetsProvider>
<ToastContainer position="top-right" <SetAssetsApi assetsApi={assetsApi}></SetAssetsApi>
autoClose={2000} <QuestsProvider initialOpen={false}>
hideProgressBar <ToastContainer position="top-right"
newestOnTop={false} autoClose={2000}
closeOnClick hideProgressBar
rtl={false} newestOnTop={false}
pauseOnFocusLoss closeOnClick
draggable rtl={false}
pauseOnHover pauseOnFocusLoss
theme="light" /> draggable
<NavBar appName={appName}></NavBar> pauseOnHover
<div id="app-content" className="tw-flex tw-!pl-[77px]"> theme="light" />
{children} <NavBar appName={appName}></NavBar>
</div> <div id="app-content" className="tw-flex tw-!pl-[77px]">
</QuestsProvider> {children}
</div>
</QuestsProvider>
</AssetsProvider>
</BrowserRouter> </BrowserRouter>
) )
} }

View File

@ -5,7 +5,7 @@ import { Link } from "react-router-dom";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon' import QuestionMarkIcon from '@heroicons/react/24/outline/QuestionMarkCircleIcon'
import * as React from "react"; import * as React from "react";
import DialogModal from "./DialogModal"; import DialogModal from "../Templates/DialogModal";
export default function NavBar({ appName}: { appName: string }) { export default function NavBar({ appName}: { appName: string }) {

View File

@ -0,0 +1,17 @@
import * as React from 'react'
import { useSetAssetApi } from './hooks/useAssets'
import { AssetsApi } from '../../types';
import { useEffect } from 'react';
export const SetAssetsApi = ({assetsApi}:{assetsApi: AssetsApi}) => {
const setAssetsApi = useSetAssetApi();
useEffect(() => {
setAssetsApi(assetsApi)
}, [assetsApi])
return (
<></>
)
}

View File

@ -0,0 +1,47 @@
import { useCallback, useState } from 'react';
import { createContext, useContext } from "react";
import * as React from "react";
import { AssetsApi } from '../../../types';
type UseAssetManagerResult = ReturnType<typeof useAssetsManager>;
const AssetContext = createContext<UseAssetManagerResult>({
api: {} as AssetsApi,
setAssetsApi: () => { }
});
function useAssetsManager(): {
api: AssetsApi;
setAssetsApi: (api: AssetsApi) => void;
} {
const [api, setApi] = useState<AssetsApi>({} as AssetsApi);
const setAssetsApi = useCallback((api: AssetsApi) => {
setApi(api);
}, []);
return { api, setAssetsApi };
}
export const AssetsProvider: React.FunctionComponent<{
children?: React.ReactNode
}> = ({ children }) => (
<AssetContext.Provider value={useAssetsManager()}>
{children}
</AssetContext.Provider>
);
export const useAssetApi = (): AssetsApi => {
const { api } = useContext(AssetContext);
return api;
};
export const useSetAssetApi = (): UseAssetManagerResult["setAssetsApi"] => {
const { setAssetsApi } = useContext(AssetContext);
return setAssetsApi;
}

View File

@ -9,14 +9,6 @@ export function Quests() {
const setQuestsOpen = useSetQuestOpen(); const setQuestsOpen = useSetQuestOpen();
const { isAuthenticated, user } = useAuth(); const { isAuthenticated, user } = useAuth();
useEffect(() => {
console.log(questsOpen);
}, [questsOpen])
return ( return (
<>{questsOpen? <>{questsOpen?
<div className="tw-card tw-w-48 tw-bg-base-100 tw-shadow-xl tw-absolute tw-bottom-4 tw-left-4 tw-z-[2000]"> <div className="tw-card tw-w-48 tw-bg-base-100 tw-shadow-xl tw-absolute tw-bottom-4 tw-left-4 tw-z-[2000]">

View File

@ -19,8 +19,6 @@ function useQuestsManager(initialOpen: boolean): {
} { } {
const [open, setOpen] = useState<boolean>(initialOpen); const [open, setOpen] = useState<boolean>(initialOpen);
const setQuestsOpen = useCallback((questOpen: boolean) => { const setQuestsOpen = useCallback((questOpen: boolean) => {
setOpen(questOpen); setOpen(questOpen);
console.log(open); console.log(open);

View File

@ -56,6 +56,7 @@ export function Settings() {
.then(() => navigate("/")); .then(() => navigate("/"));
} }
return ( return (
<main className="tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" > <main className="tw-flex-1 tw-overflow-y-auto tw-overflow-x-hidden tw-pt-8 tw-px-6 tw-bg-base-200 tw-min-w-80 tw-flex tw-justify-center" >

View File

@ -20,7 +20,7 @@ export function CardPage({title,children, parent} : {
<li>{title}</li> <li>{title}</li>
</ul> </ul>
</div> </div>
<TitleCard title={title} topMargin="mt-2"> <TitleCard title={title} topMargin="tw-my-2" className=" tw-mb-4">
{children} {children}
</TitleCard> </TitleCard>
</div> </div>

View File

@ -43,7 +43,7 @@ const DialogModal = ({
return ( return (
<dialog className='tw-card tw-shadow-xl tw-absolute tw-right-0 tw-top-0 tw-bottom-0 tw-left-0 tw-m-auto tw-transition-opacity tw-duration-300 tw-p-4' <dialog className='tw-card tw-shadow-xl tw-absolute tw-right-0 tw-top-0 tw-bottom-0 tw-left-0 tw-m-auto tw-transition-opacity tw-duration-300 tw-p-4 tw-max-w-2xl'
ref={ref} ref={ref}
onCancel={onClose} onCancel={onClose}

View File

@ -12,7 +12,7 @@ interface TitleCardProps {
export function TitleCard({title, children, topMargin, TopSideButtons, className} : TitleCardProps){ export function TitleCard({title, children, topMargin, TopSideButtons, className} : TitleCardProps){
return( return(
<div className={"tw-card tw-w-full tw-p-6 tw-bg-base-100 tw-shadow-xl tw-h-fit " + className + " " + (topMargin || "tw-mt-6")}> <div className={"tw-card tw-w-full tw-p-6 tw-bg-base-100 tw-shadow-xl tw-h-fit " + (className || "") + " " + (topMargin || "tw-mt-6")}>
{/* Title for Card */} {/* Title for Card */}
<Subtitle styleClass={TopSideButtons ? "tw-inline-block" : ""}> <Subtitle styleClass={TopSideButtons ? "tw-inline-block" : ""}>

View File

@ -71,6 +71,11 @@ export interface ItemsApi<T> {
collectionName?: string collectionName?: string
} }
export interface AssetsApi {
upload(file: Blob, title: string): any,
url: string
}
export interface UserApi { export interface UserApi {
register(email: string, password: string, userName: string): Promise<void>, register(email: string, password: string, userName: string): Promise<void>,
login(email: string, password: string): Promise<any>, login(email: string, password: string): Promise<any>,
@ -92,7 +97,7 @@ export type UserItem = {
export type Permission = { export type Permission = {
id?: string; id?: string;
role: string; role: string;S
collection: string; collection: string;
action: PermissionAction action: PermissionAction
} }