Skip to content

Commit

Permalink
Update Query Experience
Browse files Browse the repository at this point in the history
  • Loading branch information
lucemans committed Nov 27, 2024
1 parent bbb8777 commit 39f1f9b
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 11 deletions.
44 changes: 44 additions & 0 deletions engine/src/routes/instance.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use std::sync::Arc;

use poem::web::{Data};
use poem_openapi::{payload::Json, Enum, Object, OpenApi};
use serde::{Deserialize, Serialize};

use crate::{auth::middleware::AuthToken, models::user_data::{User, UserEntry}, state::AppState};

pub struct ApiInstance;

#[derive(Serialize, Deserialize, Object)]
pub struct InstanceSettings {
pub id_casing_preference: IdCasingPreference,
}

#[derive(Serialize, Deserialize, Enum)]
pub enum IdCasingPreference {
#[oai(rename = "upper")]
#[serde(rename = "upper")]
Upper,
#[oai(rename = "lower")]
#[serde(rename = "lower")]
Lower,
}

#[OpenApi]
impl ApiInstance {
#[oai(path = "/instance/settings", method = "get")]
pub async fn settings(&self, state: Data<&Arc<AppState>>, token: AuthToken) -> Json<InstanceSettings> {
// match token {
// AuthToken::Active(active_user) => {
// TODO: check if user has permission to access this resource

Json(InstanceSettings {
id_casing_preference: IdCasingPreference::Upper,
})
// }
// _ => {
// Error::from_string("Not Authenticated", StatusCode::UNAUTHORIZED).into_response(),
// panic!()
// }
// }
}
}
4 changes: 3 additions & 1 deletion engine/src/routes/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::sync::Arc;

use instance::ApiInstance;
use me::ApiMe;
use poem::{
get, handler, listener::TcpListener, middleware::Cors, web::Html, EndpointExt, Route, Server,
Expand All @@ -17,9 +18,10 @@ pub mod properties;
pub mod root;
pub mod sessions;
pub mod users;
pub mod instance;

fn get_api() -> impl OpenApi {
(RootApi, ApiMe, ApiSessions, ApiUserById)
(RootApi, ApiMe, ApiSessions, ApiUserById, ApiInstance)
}

#[handler]
Expand Down
16 changes: 12 additions & 4 deletions web/src/api/instance_settings.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
import { useQuery } from '@tanstack/react-query';

import { BASE_URL } from './core';

export type IdCasingPreference = 'upper' | 'lower';

export type InstanceSettings = {
id_casing_preference: IdCasingPreference;
};

export const getInstanceSettings = () => {
// return useHttp<InstanceSettings>('/api/instance/settings', {
// auth: 'include',
// });
return {
queryKey: ['instance_settings'],
queryFn: async () => {
return {
id_casing_preference: 'upper',
} as InstanceSettings;
const response = await fetch(BASE_URL + '/api/instance/settings');

return (await response.json()) as InstanceSettings;
},
};
};

export const useInstanceSettings = () => {
return useQuery(getInstanceSettings());
return useQuery({
queryKey: ['instance_settings'],
queryFn: getInstanceSettings,
});
};

export const formatIdCasing = (
Expand Down
14 changes: 8 additions & 6 deletions web/src/routes/create.lazy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@ import { createLazyFileRoute, useNavigate } from '@tanstack/react-router';
import { useState } from 'react';
import { FiArrowRight } from 'react-icons/fi';

import { isValidId } from '../api/generate_id';
import { formatId, useInstanceSettings } from '../api/instance_settings';
import { useApiCreateItem } from '../api/item';
import { NewItemIdInput } from '../components/input/NewItemIdInput';
import { isValidId } from '../api/generate_id';

const component = () => {
const { mutate: createItem } = useApiCreateItem();
const [item_id, setItemId] = useState('');
const { data: instanceSettings } = useInstanceSettings();
const navigate = useNavigate();

const [item_id, setItemId] = useState('');
const { mutate: createItem } = useApiCreateItem();
const isDisabled = !isValidId(item_id);
const formattedItemId = formatId(item_id, instanceSettings);

return (
<div className="p-2 mt-8 mx-auto w-full max-w-4xl space-y-4">
Expand All @@ -35,11 +37,11 @@ const component = () => {
<button
className="btn w-fit flex items-center gap-2"
onClick={async () => {
await createItem(item_id);
await createItem(formattedItemId);
// navigate to the new item
navigate({
to: '/item/$itemId/edit',
params: { itemId: item_id },
params: { itemId: formattedItemId },
});
}}
disabled={isDisabled}
Expand Down
2 changes: 2 additions & 0 deletions web/src/routes/item/$itemId/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ export const Route = createFileRoute('/item/$itemId/')({
const formattedItemId = formatId(params.itemId, instanceSettings);

if (formattedItemId !== params.itemId) {
console.log('redirecting to', formattedItemId);

return redirect({ to: `/item/${formattedItemId}` });
}
},
Expand Down

0 comments on commit 39f1f9b

Please sign in to comment.