Compare commits

..

No commits in common. "ff5e5dec14186daa4be1bd81e9d0bf2e683164c1" and "1ff5f205b2c4829a571021139fa7e3abf48518cb" have entirely different histories.

10 changed files with 145 additions and 167 deletions

View File

@ -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() });

View File

@ -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 () => {

View File

@ -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: () => "",
}

View File

@ -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,62 +75,62 @@ 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> {
let ret = await sdk.account().logout();
return { success: ret, redirectTo: "/login" };
},
async check(params?: any): Promise<CheckResponse> {
const ret = await sdk.account().ping();
if (ret) {
maybeSetupAuth();
} }
return { authenticated: ret, redirectTo: ret ? undefined : "/login" }; async logout(params: any): Promise<AuthActionResponse> {
}, let ret = await this._sdk.account().logout();
return {success: ret, redirectTo: "/login"};
}
async check(params?: any): Promise<CheckResponse> {
const ret = await this._sdk.account().ping();
if(ret){
this.maybeSetupAuth();
}
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};
} }
const acct = ret as AccountInfoResponse; const acct = ret as AccountInfoResponse;
@ -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'];
}

View File

@ -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") },

View File

@ -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;
}

View File

@ -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;

View File

@ -1,6 +0,0 @@
import {DataProvider} from "@refinedev/core";
import {Sdk} from "@lumeweb/portal-sdk";
export interface SdkProvider extends DataProvider {
sdk?: Sdk;
}

View File

@ -1,16 +1,21 @@
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";
// 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>

9
vite-env.d.ts vendored
View File

@ -1,9 +0,0 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_PORTAL_API_URL: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}