Second frontend, written in Next.JS + Typescript.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

180 lines
3.4 KiB

import { GQLClient, gql } from "../client/graphql";
export async function listLogs(gql: GQLClient, filter?: LogFilter): Promise<LogHeader[]> {
return (await gql.post(LOGS_DOC, {filter}, "ListLogs")).logs;
}
export function logFilterToQueryString(filter: LogFilter): string {
const parts: {k:string, v:string}[] = [];
if (filter.characters != null && filter.characters.length > 0) {
parts.push({k:"characters", v:filter.characters.join(",")})
}
if (filter.channels != null && filter.channels.length > 0) {
parts.push({k:"channels", v:filter.channels.join(",")})
}
if (filter.events != null && filter.events.length > 0) {
parts.push({k:"events", v:filter.events.join(",")})
}
if (filter.search != null && filter.search !== "") {
parts.push({k:"search", v:filter.search})
}
if (filter.open != null) {
parts.push({k:"open", v:filter.open ? "true" : "false"})
}
if (filter.limit != null) {
parts.push({k:"limit", v:filter.limit.toFixed(0)})
} else {
parts.push({k:"limit", v:"100"})
}
if (parts.length === 1 && parts[0].k === "limit" && parts[0].v === "100") {
return "";
}
return "?" + parts.map(p => `${p.k}=${encodeURIComponent(p.v)}`);
}
export function logFilterFromQueryString(qs: string): LogFilter {
const filter: LogFilter = {limit: 100};
const qsParts = (qs.startsWith("?") ? qs.slice(1) : qs).split("&").map(t => t.split("=")).map(kv => ({
k: kv[0],
v: decodeURIComponent(kv[1]),
}));
for (const part of qsParts) {
switch (part.k) {
case "characters": {
filter.characters = part.v.split(",");
break;
}
case "channels": {
filter.channels = part.v.split(",");
break;
}
case "events": {
filter.events = part.v.split(",");
break;
}
case "search": {
filter.search = part.v;
break;
}
case "open": {
filter.open = part.v === "open";
break;
}
case "limit": {
filter.limit = parseInt(part.v) || 0;
break;
}
}
}
return filter;
}
export interface LogFilter {
/** Character IDs */
characters?: string[]
/** Channel names */
channels?: string[]
/** Event names */
events?: string[]
/** Search text */
search?: string
/** Show only open logs */
open?: boolean
/** Limit the result set size. */
limit?: number
}
export interface LogHeader extends LogCommon {
/** Character IDs */
characters: LogHeaderCharacter[]
}
interface LogCommon {
id: string
shortId: string
date: string
channelName: string
title: string
description: string
eventName: string
open: boolean
}
export interface LogHeaderCharacter {
id: string
name: string
shortName: string
author: string
}
const LOGS_DOC = gql`
query ListLogs($filter: LogsFilter) {
logs(filter: $filter) {
...LogMeta
...LogMetaCharacters
}
}
query FindLog($id: String!) {
log(id: $id) {
...LogMeta
...LogData
}
}
fragment LogMeta on Log {
id
shortId
date
channelName
title
eventName
description
}
fragment LogMetaCharacters on Log {
characters {
id
name
shortName
author
}
}
fragment LogData on Log {
open
channel {
name
logged
hub
eventName
locationName
}
characters {
id
nicks
author
name
shortName
description
}
posts {
id
time
kind
nick
text
position
}
}
`;