mirror of
https://github.com/ivabus/gui
synced 2025-06-08 00:00:27 +03:00
partial oauth related strategy/impl
This commit is contained in:
parent
ed78e98b0f
commit
fa6f9d1930
8 changed files with 90 additions and 4 deletions
|
@ -15,7 +15,7 @@
|
||||||
"http": {
|
"http": {
|
||||||
"all": true,
|
"all": true,
|
||||||
"request": true,
|
"request": true,
|
||||||
"scope": ["https://api.tea.xyz/v1/*", "https://github.com/*"]
|
"scope": ["https://api.tea.xyz/v1/*", "https://github.com/*", "http://localhost:3000/v1/*"]
|
||||||
},
|
},
|
||||||
"shell": {
|
"shell": {
|
||||||
"all": true,
|
"all": true,
|
||||||
|
|
46
packages/gui/src/components/Auth/Auth.svelte
Normal file
46
packages/gui/src/components/Auth/Auth.svelte
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import Button from '@tea/ui/Button/Button.svelte';
|
||||||
|
import { open } from '@tauri-apps/api/shell';
|
||||||
|
import { getDeviceAuth } from '@api';
|
||||||
|
|
||||||
|
const authPage = 'http://localhost:3000/v1'; // https://api.tea.xyz/v1/auth/user?device_id=device_id
|
||||||
|
|
||||||
|
let statusMessage = '';
|
||||||
|
|
||||||
|
let timer: NodeJS.Timer;
|
||||||
|
|
||||||
|
let loop = 0;
|
||||||
|
|
||||||
|
const openGithub = () => {
|
||||||
|
open(authPage);
|
||||||
|
try {
|
||||||
|
if (!timer) {
|
||||||
|
timer = setInterval(pollAuth, 5000)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const pollAuth = async () => {
|
||||||
|
loop++;
|
||||||
|
try {
|
||||||
|
const data = await getDeviceAuth();
|
||||||
|
console.log('dd:',data);
|
||||||
|
if (data.status === 'SUCCESS') {
|
||||||
|
clearInterval(timer);
|
||||||
|
}
|
||||||
|
statusMessage = data.status;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loop > 20 && timer) {
|
||||||
|
clearInterval(timer);
|
||||||
|
loop = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<p>{loop}:{statusMessage}</p>
|
||||||
|
<Button onClick={openGithub}>login</Button>
|
|
@ -322,3 +322,12 @@ export async function getCategorizedPackages(): Promise<Category[]> {
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getDeviceAuth(): Promise<any> {
|
||||||
|
const deviceId = 'xyz123';
|
||||||
|
// const data = await get<any>(`/auth/device/${deviceId}`);
|
||||||
|
return {
|
||||||
|
status: 'SUCCESS',
|
||||||
|
user: {},
|
||||||
|
};
|
||||||
|
}
|
|
@ -14,16 +14,19 @@ import { getClient } from '@tauri-apps/api/http';
|
||||||
// import { invoke } from '@tauri-apps/api';
|
// import { invoke } from '@tauri-apps/api';
|
||||||
import { Command } from '@tauri-apps/api/shell';
|
import { Command } from '@tauri-apps/api/shell';
|
||||||
import { readDir, BaseDirectory } from '@tauri-apps/api/fs';
|
import { readDir, BaseDirectory } from '@tauri-apps/api/fs';
|
||||||
import type { Package, Review, AirtablePost } from '@tea/ui/types';
|
import type { Package, Review, AirtablePost, User } from '@tea/ui/types';
|
||||||
import type { GUIPackage, Course, Category } from '../types';
|
import type { GUIPackage, Course, Category, AuthStatus } from '../types';
|
||||||
import * as mock from './mock';
|
import * as mock from './mock';
|
||||||
import { PackageStates } from '../types';
|
import { PackageStates } from '../types';
|
||||||
|
|
||||||
const base = 'https://api.tea.xyz/v1';
|
const base = 'https://api.tea.xyz/v1';
|
||||||
|
// const base = 'http://localhost:3000/v1';
|
||||||
|
|
||||||
async function get<T>(path: string, query?: { [key: string]: string }) {
|
async function get<T>(path: string, query?: { [key: string]: string }) {
|
||||||
|
console.log('path', path);
|
||||||
const client = await getClient();
|
const client = await getClient();
|
||||||
const uri = join(base, path);
|
const uri = join(base, path);
|
||||||
|
console.log('uri:', uri);
|
||||||
const { data } = await client.get<T>(uri.toString(), {
|
const { data } = await client.get<T>(uri.toString(), {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: 'public' // TODO: figure out why req w/o Authorization does not work
|
Authorization: 'public' // TODO: figure out why req w/o Authorization does not work
|
||||||
|
@ -161,3 +164,14 @@ export async function getCategorizedPackages(): Promise<Category[]> {
|
||||||
const categories = await get<Category[]>('/packages/categorized');
|
const categories = await get<Category[]>('/packages/categorized');
|
||||||
return categories;
|
return categories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DeviceAuth = {
|
||||||
|
status: AuthStatus;
|
||||||
|
user: User;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getDeviceAuth(): Promise<DeviceAuth> {
|
||||||
|
const deviceId = 'xyxz123';
|
||||||
|
const data = await get<DeviceAuth>(`/auth/device/${deviceId}`);
|
||||||
|
return data;
|
||||||
|
}
|
|
@ -29,3 +29,10 @@ export type Category = {
|
||||||
cta_label: string;
|
cta_label: string;
|
||||||
packages: GUIPackage[];
|
packages: GUIPackage[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export enum AuthStatus {
|
||||||
|
UNKNOWN = 'UNKNOWN',
|
||||||
|
PENDING = 'PENDING',
|
||||||
|
SUCCESS = 'SUCCESS',
|
||||||
|
FAILED = 'FAILED',
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
import News from '$components/News/News.svelte';
|
import News from '$components/News/News.svelte';
|
||||||
import CategorizedPackages from '$components/CategorizedPackages/CategorizedPackages.svelte';
|
import CategorizedPackages from '$components/CategorizedPackages/CategorizedPackages.svelte';
|
||||||
backLink.set('');
|
backLink.set('');
|
||||||
|
console.log("test", window.location)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -6,12 +6,15 @@
|
||||||
import Badges from '$components/Badges/Badges.svelte';
|
import Badges from '$components/Badges/Badges.svelte';
|
||||||
import InstalledPackages from '$components/InstalledPackages/InstalledPackages.svelte';
|
import InstalledPackages from '$components/InstalledPackages/InstalledPackages.svelte';
|
||||||
import { backLink } from '$libs/stores';
|
import { backLink } from '$libs/stores';
|
||||||
|
import Auth from '$components/Auth/Auth.svelte';
|
||||||
backLink.set('/');
|
backLink.set('/');
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<PageHeader>PROFILE</PageHeader>
|
<PageHeader>PROFILE</PageHeader>
|
||||||
|
<section>
|
||||||
|
<Auth/>
|
||||||
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ProfileBanner />
|
<ProfileBanner />
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -34,3 +34,9 @@ export type AirtablePost = {
|
||||||
published_at: Date;
|
published_at: Date;
|
||||||
tags: string[];
|
tags: string[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type User = {
|
||||||
|
username: string;
|
||||||
|
country?: string;
|
||||||
|
eth_wallet_address?: string;
|
||||||
|
}
|
Loading…
Reference in a new issue