Compare commits
No commits in common. "ff5e5dec14186daa4be1bd81e9d0bf2e683164c1" and "1ff5f205b2c4829a571021139fa7e3abf48518cb" have entirely different histories.
ff5e5dec14
...
1ff5f205b2
|
@ -159,7 +159,10 @@ const UploadFileForm = () => {
|
||||||
state,
|
state,
|
||||||
removeFile,
|
removeFile,
|
||||||
cancelAll,
|
cancelAll,
|
||||||
} = useUppy();
|
} = useUppy({
|
||||||
|
uploader: "tus",
|
||||||
|
endpoint: import.meta.env.VITE_PUBLIC_TUS_ENDPOINT,
|
||||||
|
});
|
||||||
|
|
||||||
console.log({ state, files: getFiles() });
|
console.log({ state, files: getFiles() });
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,11 @@ const LISTENING_EVENTS = [
|
||||||
"files-added"
|
"files-added"
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
export function useUppy() {
|
export function useUppy({
|
||||||
|
endpoint
|
||||||
|
}: {
|
||||||
|
endpoint: string
|
||||||
|
}) {
|
||||||
const sdk = useSdk()
|
const sdk = useSdk()
|
||||||
|
|
||||||
const [uploadLimit, setUploadLimit] = useState<number>(0)
|
const [uploadLimit, setUploadLimit] = useState<number>(0)
|
||||||
|
@ -157,7 +161,7 @@ export function useUppy() {
|
||||||
})
|
})
|
||||||
|
|
||||||
if (useTus) {
|
if (useTus) {
|
||||||
uppy.use(Tus, { limit: 6, parallelUploads: 10 })
|
uppy.use(Tus, { endpoint: endpoint, limit: 6, parallelUploads: 10 })
|
||||||
uppy.addPreProcessor(tusPreprocessor)
|
uppy.addPreProcessor(tusPreprocessor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +211,7 @@ export function useUppy() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
setState("idle")
|
setState("idle")
|
||||||
}, [targetRef, uploadLimit])
|
}, [targetRef, endpoint, uploadLimit])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return () => {
|
return () => {
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
import type { DataProvider } from "@refinedev/core";
|
|
||||||
import {SdkProvider} from "~/data/sdk-provider.js";
|
|
||||||
|
|
||||||
export const accountProvider: SdkProvider = {
|
|
||||||
getList: () => { throw Error("Not Implemented") },
|
|
||||||
getOne: () => { throw Error("Not Implemented") },
|
|
||||||
update: () => { throw Error("Not Implemented") },
|
|
||||||
create: () => { throw Error("Not Implemented") },
|
|
||||||
deleteOne: () => { throw Error("Not Implemented") },
|
|
||||||
getApiUrl: () => "",
|
|
||||||
}
|
|
|
@ -31,20 +31,42 @@ export type Identity = {
|
||||||
email: string;
|
email: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createPortalAuthProvider = (sdk: Sdk): AuthProvider => {
|
export class PortalAuthProvider implements RequiredAuthProvider {
|
||||||
const maybeSetupAuth = (): void => {
|
constructor(apiUrl: string) {
|
||||||
const jwt = sdk.account().jwtToken;
|
this._sdk = Sdk.create(apiUrl);
|
||||||
if (jwt) {
|
|
||||||
sdk.setAuthToken(jwt);
|
const methods: Array<keyof AuthProvider> = [
|
||||||
}
|
'login',
|
||||||
};
|
'logout',
|
||||||
|
'check',
|
||||||
|
'onError',
|
||||||
|
'register',
|
||||||
|
'forgotPassword',
|
||||||
|
'updatePassword',
|
||||||
|
'getPermissions',
|
||||||
|
'getIdentity',
|
||||||
|
];
|
||||||
|
|
||||||
|
methods.forEach((method) => {
|
||||||
|
this[method] = this[method]?.bind(this) as any;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private _sdk: Sdk;
|
||||||
|
|
||||||
|
get sdk(): Sdk {
|
||||||
|
return this._sdk;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static create(apiUrl: string): AuthProvider {
|
||||||
|
return new PortalAuthProvider(apiUrl);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
|
||||||
async login(params: AuthFormRequest): Promise<AuthActionResponse> {
|
async login(params: AuthFormRequest): Promise<AuthActionResponse> {
|
||||||
const ret = await sdk.account().login({
|
const ret = await this._sdk.account().login({
|
||||||
email: params.email,
|
email: params.email,
|
||||||
password: params.password,
|
password: params.password,
|
||||||
});
|
})
|
||||||
|
|
||||||
let redirectTo: string | undefined;
|
let redirectTo: string | undefined;
|
||||||
|
|
||||||
|
@ -53,59 +75,59 @@ export const createPortalAuthProvider = (sdk: Sdk): AuthProvider => {
|
||||||
if (!redirectTo) {
|
if (!redirectTo) {
|
||||||
redirectTo = ret ? "/dashboard" : "/login";
|
redirectTo = ret ? "/dashboard" : "/login";
|
||||||
}
|
}
|
||||||
sdk.setAuthToken(sdk.account().jwtToken);
|
this._sdk.setAuthToken(this._sdk.account().jwtToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: ret,
|
success: ret,
|
||||||
redirectTo,
|
redirectTo,
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
|
|
||||||
async logout(params: any): Promise<AuthActionResponse> {
|
async logout(params: any): Promise<AuthActionResponse> {
|
||||||
let ret = await sdk.account().logout();
|
let ret = await this._sdk.account().logout();
|
||||||
return {success: ret, redirectTo: "/login"};
|
return {success: ret, redirectTo: "/login"};
|
||||||
},
|
}
|
||||||
|
|
||||||
async check(params?: any): Promise<CheckResponse> {
|
async check(params?: any): Promise<CheckResponse> {
|
||||||
const ret = await sdk.account().ping();
|
const ret = await this._sdk.account().ping();
|
||||||
|
|
||||||
if(ret){
|
if(ret){
|
||||||
maybeSetupAuth();
|
this.maybeSetupAuth();
|
||||||
}
|
}
|
||||||
|
|
||||||
return {authenticated: ret, redirectTo: ret ? undefined : "/login"};
|
return {authenticated: ret, redirectTo: ret ? undefined : "/login"};
|
||||||
},
|
}
|
||||||
|
|
||||||
async onError(error: any): Promise<OnErrorResponse> {
|
async onError(error: any): Promise<OnErrorResponse> {
|
||||||
return {logout: true};
|
return {logout: true};
|
||||||
},
|
}
|
||||||
|
|
||||||
async register(params: RegisterFormRequest): Promise<AuthActionResponse> {
|
async register(params: RegisterFormRequest): Promise<AuthActionResponse> {
|
||||||
const ret = await sdk.account().register({
|
const ret = await this._sdk.account().register({
|
||||||
email: params.email,
|
email: params.email,
|
||||||
password: params.password,
|
password: params.password,
|
||||||
first_name: params.firstName,
|
first_name: params.firstName,
|
||||||
last_name: params.lastName,
|
last_name: params.lastName,
|
||||||
});
|
});
|
||||||
return {success: ret, redirectTo: ret ? "/dashboard" : undefined};
|
return {success: ret, redirectTo: ret ? "/dashboard" : undefined};
|
||||||
},
|
}
|
||||||
|
|
||||||
async forgotPassword(params: any): Promise<AuthActionResponse> {
|
async forgotPassword(params: any): Promise<AuthActionResponse> {
|
||||||
return {success: true};
|
return {success: true};
|
||||||
},
|
}
|
||||||
|
|
||||||
async updatePassword(params: any): Promise<AuthActionResponse> {
|
async updatePassword(params: any): Promise<AuthActionResponse> {
|
||||||
return {success: true};
|
return {success: true};
|
||||||
},
|
}
|
||||||
|
|
||||||
async getPermissions(params?: Record<string, any>): Promise<AuthActionResponse> {
|
async getPermissions(params?: Record<string, any>): Promise<AuthActionResponse> {
|
||||||
return {success: true};
|
return {success: true};
|
||||||
},
|
}
|
||||||
|
|
||||||
async getIdentity(params?: Identity): Promise<IdentityResponse> {
|
async getIdentity(params?: Identity): Promise<IdentityResponse> {
|
||||||
maybeSetupAuth();
|
this.maybeSetupAuth();
|
||||||
const ret = await sdk.account().info();
|
const ret = await this._sdk.account().info();
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return {identity: null};
|
return {identity: null};
|
||||||
|
@ -119,6 +141,24 @@ export const createPortalAuthProvider = (sdk: Sdk): AuthProvider => {
|
||||||
lastName: acct.last_name,
|
lastName: acct.last_name,
|
||||||
email: acct.email,
|
email: acct.email,
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
};
|
|
||||||
};
|
maybeSetupAuth(): void {
|
||||||
|
const jwt = this._sdk.account().jwtToken
|
||||||
|
if (jwt) {
|
||||||
|
this._sdk.setAuthToken(jwt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RequiredAuthProvider extends AuthProvider {
|
||||||
|
login: AuthProvider['login'];
|
||||||
|
logout: AuthProvider['logout'];
|
||||||
|
check: AuthProvider['check'];
|
||||||
|
onError: AuthProvider['onError'];
|
||||||
|
register: AuthProvider['register'];
|
||||||
|
forgotPassword: AuthProvider['forgotPassword'];
|
||||||
|
updatePassword: AuthProvider['updatePassword'];
|
||||||
|
getPermissions: AuthProvider['getPermissions'];
|
||||||
|
getIdentity: AuthProvider['getIdentity'];
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import type { DataProvider } from "@refinedev/core";
|
import type { DataProvider } from "@refinedev/core";
|
||||||
import {SdkProvider} from "~/data/sdk-provider.js";
|
|
||||||
|
|
||||||
export const fileProvider: SdkProvider = {
|
export const defaultProvider: DataProvider = {
|
||||||
getList: () => { throw Error("Not Implemented") },
|
getList: () => { throw Error("Not Implemented") },
|
||||||
getOne: () => { throw Error("Not Implemented") },
|
getOne: () => { throw Error("Not Implemented") },
|
||||||
update: () => { throw Error("Not Implemented") },
|
update: () => { throw Error("Not Implemented") },
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import type {AuthProvider, DataProvider} from "@refinedev/core";
|
|
||||||
import {fileProvider} from "~/data/file-provider.js";
|
|
||||||
import {Sdk} from "@lumeweb/portal-sdk";
|
|
||||||
import {accountProvider} from "~/data/account-provider.js";
|
|
||||||
import type {SdkProvider} from "~/data/sdk-provider.js";
|
|
||||||
import {createPortalAuthProvider} from "~/data/auth-provider.js";
|
|
||||||
|
|
||||||
interface DataProviders {
|
|
||||||
default: SdkProvider;
|
|
||||||
auth: AuthProvider;
|
|
||||||
|
|
||||||
[key: string]: SdkProvider | AuthProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
let providers: DataProviders;
|
|
||||||
|
|
||||||
export function getProviders(sdk: Sdk) {
|
|
||||||
if (providers) {
|
|
||||||
return providers;
|
|
||||||
}
|
|
||||||
|
|
||||||
accountProvider.sdk = sdk;
|
|
||||||
fileProvider.sdk = sdk;
|
|
||||||
providers = {
|
|
||||||
default: accountProvider,
|
|
||||||
auth: createPortalAuthProvider(sdk),
|
|
||||||
files: fileProvider,
|
|
||||||
};
|
|
||||||
|
|
||||||
return providers;
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
import type {ResourceProps} from "@refinedev/core";
|
|
||||||
|
|
||||||
const resources: ResourceProps[] = [
|
|
||||||
{
|
|
||||||
name: 'account',
|
|
||||||
meta: {
|
|
||||||
dataProviderName: 'default',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'file',
|
|
||||||
meta: {
|
|
||||||
dataProviderName: 'files',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
export default resources;
|
|
|
@ -1,6 +0,0 @@
|
||||||
import {DataProvider} from "@refinedev/core";
|
|
||||||
import {Sdk} from "@lumeweb/portal-sdk";
|
|
||||||
|
|
||||||
export interface SdkProvider extends DataProvider {
|
|
||||||
sdk?: Sdk;
|
|
||||||
}
|
|
27
app/root.tsx
27
app/root.tsx
|
@ -1,4 +1,10 @@
|
||||||
import {Links, Meta, Outlet, Scripts, ScrollRestoration,} from "@remix-run/react";
|
import {
|
||||||
|
Links,
|
||||||
|
Meta,
|
||||||
|
Outlet,
|
||||||
|
Scripts,
|
||||||
|
ScrollRestoration,
|
||||||
|
} from "@remix-run/react";
|
||||||
|
|
||||||
import stylesheet from "./tailwind.css?url";
|
import stylesheet from "./tailwind.css?url";
|
||||||
import type { LinksFunction } from "@remix-run/node";
|
import type { LinksFunction } from "@remix-run/node";
|
||||||
|
@ -6,11 +12,10 @@ import type {LinksFunction} from "@remix-run/node";
|
||||||
// Supports weights 200-800
|
// Supports weights 200-800
|
||||||
import '@fontsource-variable/manrope';
|
import '@fontsource-variable/manrope';
|
||||||
import {Refine} from "@refinedev/core";
|
import {Refine} from "@refinedev/core";
|
||||||
|
import {PortalAuthProvider} from "~/data/auth-provider.js";
|
||||||
import routerProvider from "@refinedev/remix-router";
|
import routerProvider from "@refinedev/remix-router";
|
||||||
|
import { defaultProvider } from "./data/file-provider";
|
||||||
import {SdkContextProvider} from "~/components/lib/sdk-context.js";
|
import {SdkContextProvider} from "~/components/lib/sdk-context.js";
|
||||||
import {getProviders} from "~/data/providers.js";
|
|
||||||
import {Sdk} from "@lumeweb/portal-sdk";
|
|
||||||
import resources from "~/data/resources.js";
|
|
||||||
|
|
||||||
export const links: LinksFunction = () => [
|
export const links: LinksFunction = () => [
|
||||||
{ rel: "stylesheet", href: stylesheet },
|
{ rel: "stylesheet", href: stylesheet },
|
||||||
|
@ -35,17 +40,19 @@ export function Layout({children}: { children: React.ReactNode }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const sdk = Sdk.create(import.meta.env.VITE_PORTAL_URL)
|
const auth = PortalAuthProvider.create("https://alpha.pinner.xyz")
|
||||||
const providers = getProviders(sdk);
|
|
||||||
return (
|
return (
|
||||||
<Refine
|
<Refine
|
||||||
authProvider={providers.auth}
|
authProvider={auth}
|
||||||
routerProvider={routerProvider}
|
routerProvider={routerProvider}
|
||||||
dataProvider={providers.default}
|
dataProvider={defaultProvider}
|
||||||
resources={resources}
|
resources={[
|
||||||
|
{ name: 'files' },
|
||||||
|
{ name: 'users' }
|
||||||
|
]}
|
||||||
options={{disableTelemetry: true}}
|
options={{disableTelemetry: true}}
|
||||||
>
|
>
|
||||||
<SdkContextProvider sdk={sdk}>
|
<SdkContextProvider sdk={(auth as PortalAuthProvider).sdk}>
|
||||||
<Outlet/>
|
<Outlet/>
|
||||||
</SdkContextProvider>
|
</SdkContextProvider>
|
||||||
</Refine>
|
</Refine>
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
/// <reference types="vite/client" />
|
|
||||||
|
|
||||||
interface ImportMetaEnv {
|
|
||||||
readonly VITE_PORTAL_API_URL: string
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ImportMeta {
|
|
||||||
readonly env: ImportMetaEnv
|
|
||||||
}
|
|
Loading…
Reference in New Issue