feature/FA-11_CICD #33

Merged
conco merged 27 commits from feature/FA-11_CICD into master 2025-11-26 23:39:45 +00:00
6 changed files with 756 additions and 1437 deletions
Showing only changes of commit 15a8185621 - Show all commits

View File

@@ -22,15 +22,17 @@ const config: CodegenConfig = {
plugins: [
'typescript',
'typescript-operations',
'typescript-react-apollo',
'typed-document-node',
],
config: {
withHooks: true,
avoidOptionals: true,
dedupeFragments: true,
avoidOptionals: {
field: true,
inputValue: false,
},
enumsAsConst: true,
maybeValue: 'T | null',
skipTypename: true,
apolloReactHooksImportFrom: '@apollo/client/react',
useTypeImports: true,
},
},
},

File diff suppressed because it is too large Load Diff

View File

@@ -16,18 +16,18 @@
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"graphql": "^16.12.0",
"react-router-dom": "^6.27.0",
"oidc-client-ts": "^3.4.1",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router-dom": "^6.27.0",
"tailwind-merge": "^2.5.4"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@graphql-codegen/cli": "^5.0.3",
"@graphql-codegen/typed-document-node": "^6.1.1",
"@graphql-codegen/typescript": "^4.0.9",
"@graphql-codegen/typescript-operations": "^4.0.9",
"@graphql-codegen/typescript-react-apollo": "^4.0.9",
"@eslint/js": "^9.39.1",
"@types/node": "^24.10.1",
"@types/react": "^19.2.5",
"@types/react-dom": "^19.2.3",

View File

@@ -1,6 +1,4 @@
import { gql } from '@apollo/client';
import * as Apollo from '@apollo/client';
import * as ApolloReactHooks from '@apollo/client/react';
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
export type Maybe<T> = T | null;
export type InputMaybe<T> = T | null;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
@@ -8,7 +6,6 @@ export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?:
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };
export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
const defaultOptions = {} as const;
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
ID: { input: string; output: string; }
@@ -34,17 +31,17 @@ export type Chapter = {
};
export type ChapterFilterInput = {
and: InputMaybe<Array<ChapterFilterInput>>;
body: InputMaybe<LocalizationKeyFilterInput>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
images: InputMaybe<ListFilterInputTypeOfImageFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
name: InputMaybe<LocalizationKeyFilterInput>;
or: InputMaybe<Array<ChapterFilterInput>>;
order: InputMaybe<UnsignedIntOperationFilterInputType>;
revision: InputMaybe<UnsignedIntOperationFilterInputType>;
url: InputMaybe<StringOperationFilterInput>;
and?: InputMaybe<Array<ChapterFilterInput>>;
body?: InputMaybe<LocalizationKeyFilterInput>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
images?: InputMaybe<ListFilterInputTypeOfImageFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
name?: InputMaybe<LocalizationKeyFilterInput>;
or?: InputMaybe<Array<ChapterFilterInput>>;
order?: InputMaybe<UnsignedIntOperationFilterInputType>;
revision?: InputMaybe<UnsignedIntOperationFilterInputType>;
url?: InputMaybe<StringOperationFilterInput>;
};
export type ChapterPullRequestedEvent = {
@@ -53,14 +50,14 @@ export type ChapterPullRequestedEvent = {
};
export type ChapterSortInput = {
body: InputMaybe<LocalizationKeySortInput>;
createdTime: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
name: InputMaybe<LocalizationKeySortInput>;
order: InputMaybe<SortEnumType>;
revision: InputMaybe<SortEnumType>;
url: InputMaybe<SortEnumType>;
body?: InputMaybe<LocalizationKeySortInput>;
createdTime?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
name?: InputMaybe<LocalizationKeySortInput>;
order?: InputMaybe<SortEnumType>;
revision?: InputMaybe<SortEnumType>;
url?: InputMaybe<SortEnumType>;
};
export type DeleteJobError = KeyNotFoundError;
@@ -105,23 +102,23 @@ export type Image = {
};
export type ImageFilterInput = {
and: InputMaybe<Array<ImageFilterInput>>;
chapter: InputMaybe<ChapterFilterInput>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
newPath: InputMaybe<StringOperationFilterInput>;
or: InputMaybe<Array<ImageFilterInput>>;
originalPath: InputMaybe<StringOperationFilterInput>;
and?: InputMaybe<Array<ImageFilterInput>>;
chapter?: InputMaybe<ChapterFilterInput>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
newPath?: InputMaybe<StringOperationFilterInput>;
or?: InputMaybe<Array<ImageFilterInput>>;
originalPath?: InputMaybe<StringOperationFilterInput>;
};
export type ImageSortInput = {
chapter: InputMaybe<ChapterSortInput>;
createdTime: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
newPath: InputMaybe<SortEnumType>;
originalPath: InputMaybe<SortEnumType>;
chapter?: InputMaybe<ChapterSortInput>;
createdTime?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
newPath?: InputMaybe<SortEnumType>;
originalPath?: InputMaybe<SortEnumType>;
};
export type ImportNovelInput = {
@@ -133,8 +130,8 @@ export type ImportNovelPayload = {
};
export type InstantFilterInput = {
and: InputMaybe<Array<InstantFilterInput>>;
or: InputMaybe<Array<InstantFilterInput>>;
and?: InputMaybe<Array<InstantFilterInput>>;
or?: InputMaybe<Array<InstantFilterInput>>;
};
export type JobKey = {
@@ -155,53 +152,54 @@ export type KeyValuePairOfStringAndString = {
value: Scalars['String']['output'];
};
export enum Language {
Ch = 'CH',
En = 'EN',
Ja = 'JA',
Kr = 'KR'
}
export const Language = {
Ch: 'CH',
En: 'EN',
Ja: 'JA',
Kr: 'KR'
} as const;
export type Language = typeof Language[keyof typeof Language];
export type LanguageOperationFilterInput = {
eq: InputMaybe<Language>;
in: InputMaybe<Array<Language>>;
neq: InputMaybe<Language>;
nin: InputMaybe<Array<Language>>;
eq?: InputMaybe<Language>;
in?: InputMaybe<Array<Language>>;
neq?: InputMaybe<Language>;
nin?: InputMaybe<Array<Language>>;
};
export type ListFilterInputTypeOfChapterFilterInput = {
all: InputMaybe<ChapterFilterInput>;
any: InputMaybe<Scalars['Boolean']['input']>;
none: InputMaybe<ChapterFilterInput>;
some: InputMaybe<ChapterFilterInput>;
all?: InputMaybe<ChapterFilterInput>;
any?: InputMaybe<Scalars['Boolean']['input']>;
none?: InputMaybe<ChapterFilterInput>;
some?: InputMaybe<ChapterFilterInput>;
};
export type ListFilterInputTypeOfImageFilterInput = {
all: InputMaybe<ImageFilterInput>;
any: InputMaybe<Scalars['Boolean']['input']>;
none: InputMaybe<ImageFilterInput>;
some: InputMaybe<ImageFilterInput>;
all?: InputMaybe<ImageFilterInput>;
any?: InputMaybe<Scalars['Boolean']['input']>;
none?: InputMaybe<ImageFilterInput>;
some?: InputMaybe<ImageFilterInput>;
};
export type ListFilterInputTypeOfLocalizationTextFilterInput = {
all: InputMaybe<LocalizationTextFilterInput>;
any: InputMaybe<Scalars['Boolean']['input']>;
none: InputMaybe<LocalizationTextFilterInput>;
some: InputMaybe<LocalizationTextFilterInput>;
all?: InputMaybe<LocalizationTextFilterInput>;
any?: InputMaybe<Scalars['Boolean']['input']>;
none?: InputMaybe<LocalizationTextFilterInput>;
some?: InputMaybe<LocalizationTextFilterInput>;
};
export type ListFilterInputTypeOfNovelFilterInput = {
all: InputMaybe<NovelFilterInput>;
any: InputMaybe<Scalars['Boolean']['input']>;
none: InputMaybe<NovelFilterInput>;
some: InputMaybe<NovelFilterInput>;
all?: InputMaybe<NovelFilterInput>;
any?: InputMaybe<Scalars['Boolean']['input']>;
none?: InputMaybe<NovelFilterInput>;
some?: InputMaybe<NovelFilterInput>;
};
export type ListFilterInputTypeOfNovelTagFilterInput = {
all: InputMaybe<NovelTagFilterInput>;
any: InputMaybe<Scalars['Boolean']['input']>;
none: InputMaybe<NovelTagFilterInput>;
some: InputMaybe<NovelTagFilterInput>;
all?: InputMaybe<NovelTagFilterInput>;
any?: InputMaybe<Scalars['Boolean']['input']>;
none?: InputMaybe<NovelTagFilterInput>;
some?: InputMaybe<NovelTagFilterInput>;
};
export type LocalizationKey = {
@@ -212,18 +210,18 @@ export type LocalizationKey = {
};
export type LocalizationKeyFilterInput = {
and: InputMaybe<Array<LocalizationKeyFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
or: InputMaybe<Array<LocalizationKeyFilterInput>>;
texts: InputMaybe<ListFilterInputTypeOfLocalizationTextFilterInput>;
and?: InputMaybe<Array<LocalizationKeyFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
or?: InputMaybe<Array<LocalizationKeyFilterInput>>;
texts?: InputMaybe<ListFilterInputTypeOfLocalizationTextFilterInput>;
};
export type LocalizationKeySortInput = {
createdTime: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
createdTime?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
};
export type LocalizationText = {
@@ -236,14 +234,14 @@ export type LocalizationText = {
};
export type LocalizationTextFilterInput = {
and: InputMaybe<Array<LocalizationTextFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UuidOperationFilterInput>;
language: InputMaybe<LanguageOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
or: InputMaybe<Array<LocalizationTextFilterInput>>;
text: InputMaybe<StringOperationFilterInput>;
translationEngine: InputMaybe<TranslationEngineFilterInput>;
and?: InputMaybe<Array<LocalizationTextFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UuidOperationFilterInput>;
language?: InputMaybe<LanguageOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
or?: InputMaybe<Array<LocalizationTextFilterInput>>;
text?: InputMaybe<StringOperationFilterInput>;
translationEngine?: InputMaybe<TranslationEngineFilterInput>;
};
export type Mutation = {
@@ -310,54 +308,55 @@ export type Novel = {
};
export type NovelFilterInput = {
and: InputMaybe<Array<NovelFilterInput>>;
author: InputMaybe<PersonFilterInput>;
chapters: InputMaybe<ListFilterInputTypeOfChapterFilterInput>;
coverImage: InputMaybe<ImageFilterInput>;
createdTime: InputMaybe<InstantFilterInput>;
description: InputMaybe<LocalizationKeyFilterInput>;
externalId: InputMaybe<StringOperationFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
name: InputMaybe<LocalizationKeyFilterInput>;
or: InputMaybe<Array<NovelFilterInput>>;
rawLanguage: InputMaybe<LanguageOperationFilterInput>;
rawStatus: InputMaybe<NovelStatusOperationFilterInput>;
source: InputMaybe<SourceFilterInput>;
statusOverride: InputMaybe<NullableOfNovelStatusOperationFilterInput>;
tags: InputMaybe<ListFilterInputTypeOfNovelTagFilterInput>;
url: InputMaybe<StringOperationFilterInput>;
and?: InputMaybe<Array<NovelFilterInput>>;
author?: InputMaybe<PersonFilterInput>;
chapters?: InputMaybe<ListFilterInputTypeOfChapterFilterInput>;
coverImage?: InputMaybe<ImageFilterInput>;
createdTime?: InputMaybe<InstantFilterInput>;
description?: InputMaybe<LocalizationKeyFilterInput>;
externalId?: InputMaybe<StringOperationFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
name?: InputMaybe<LocalizationKeyFilterInput>;
or?: InputMaybe<Array<NovelFilterInput>>;
rawLanguage?: InputMaybe<LanguageOperationFilterInput>;
rawStatus?: InputMaybe<NovelStatusOperationFilterInput>;
source?: InputMaybe<SourceFilterInput>;
statusOverride?: InputMaybe<NullableOfNovelStatusOperationFilterInput>;
tags?: InputMaybe<ListFilterInputTypeOfNovelTagFilterInput>;
url?: InputMaybe<StringOperationFilterInput>;
};
export type NovelSortInput = {
author: InputMaybe<PersonSortInput>;
coverImage: InputMaybe<ImageSortInput>;
createdTime: InputMaybe<SortEnumType>;
description: InputMaybe<LocalizationKeySortInput>;
externalId: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
name: InputMaybe<LocalizationKeySortInput>;
rawLanguage: InputMaybe<SortEnumType>;
rawStatus: InputMaybe<SortEnumType>;
source: InputMaybe<SourceSortInput>;
statusOverride: InputMaybe<SortEnumType>;
url: InputMaybe<SortEnumType>;
author?: InputMaybe<PersonSortInput>;
coverImage?: InputMaybe<ImageSortInput>;
createdTime?: InputMaybe<SortEnumType>;
description?: InputMaybe<LocalizationKeySortInput>;
externalId?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
name?: InputMaybe<LocalizationKeySortInput>;
rawLanguage?: InputMaybe<SortEnumType>;
rawStatus?: InputMaybe<SortEnumType>;
source?: InputMaybe<SourceSortInput>;
statusOverride?: InputMaybe<SortEnumType>;
url?: InputMaybe<SortEnumType>;
};
export enum NovelStatus {
Abandoned = 'ABANDONED',
Completed = 'COMPLETED',
Hiatus = 'HIATUS',
InProgress = 'IN_PROGRESS',
Unknown = 'UNKNOWN'
}
export const NovelStatus = {
Abandoned: 'ABANDONED',
Completed: 'COMPLETED',
Hiatus: 'HIATUS',
InProgress: 'IN_PROGRESS',
Unknown: 'UNKNOWN'
} as const;
export type NovelStatus = typeof NovelStatus[keyof typeof NovelStatus];
export type NovelStatusOperationFilterInput = {
eq: InputMaybe<NovelStatus>;
in: InputMaybe<Array<NovelStatus>>;
neq: InputMaybe<NovelStatus>;
nin: InputMaybe<Array<NovelStatus>>;
eq?: InputMaybe<NovelStatus>;
in?: InputMaybe<Array<NovelStatus>>;
neq?: InputMaybe<NovelStatus>;
nin?: InputMaybe<Array<NovelStatus>>;
};
export type NovelTag = {
@@ -372,16 +371,16 @@ export type NovelTag = {
};
export type NovelTagFilterInput = {
and: InputMaybe<Array<NovelTagFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
displayName: InputMaybe<LocalizationKeyFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
key: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
novels: InputMaybe<ListFilterInputTypeOfNovelFilterInput>;
or: InputMaybe<Array<NovelTagFilterInput>>;
source: InputMaybe<SourceFilterInput>;
tagType: InputMaybe<TagTypeOperationFilterInput>;
and?: InputMaybe<Array<NovelTagFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
displayName?: InputMaybe<LocalizationKeyFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
key?: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
novels?: InputMaybe<ListFilterInputTypeOfNovelFilterInput>;
or?: InputMaybe<Array<NovelTagFilterInput>>;
source?: InputMaybe<SourceFilterInput>;
tagType?: InputMaybe<TagTypeOperationFilterInput>;
};
export type NovelUpdateRequestedEvent = {
@@ -407,10 +406,10 @@ export type NovelsEdge = {
};
export type NullableOfNovelStatusOperationFilterInput = {
eq: InputMaybe<NovelStatus>;
in: InputMaybe<Array<InputMaybe<NovelStatus>>>;
neq: InputMaybe<NovelStatus>;
nin: InputMaybe<Array<InputMaybe<NovelStatus>>>;
eq?: InputMaybe<NovelStatus>;
in?: InputMaybe<Array<InputMaybe<NovelStatus>>>;
neq?: InputMaybe<NovelStatus>;
nin?: InputMaybe<Array<InputMaybe<NovelStatus>>>;
};
/** Information about pagination in a connection. */
@@ -434,21 +433,21 @@ export type Person = {
};
export type PersonFilterInput = {
and: InputMaybe<Array<PersonFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
externalUrl: InputMaybe<StringOperationFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
name: InputMaybe<LocalizationKeyFilterInput>;
or: InputMaybe<Array<PersonFilterInput>>;
and?: InputMaybe<Array<PersonFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
externalUrl?: InputMaybe<StringOperationFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
name?: InputMaybe<LocalizationKeyFilterInput>;
or?: InputMaybe<Array<PersonFilterInput>>;
};
export type PersonSortInput = {
createdTime: InputMaybe<SortEnumType>;
externalUrl: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
name: InputMaybe<LocalizationKeySortInput>;
createdTime?: InputMaybe<SortEnumType>;
externalUrl?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
name?: InputMaybe<LocalizationKeySortInput>;
};
export type Query = {
@@ -461,33 +460,33 @@ export type Query = {
export type QueryNovelsArgs = {
after: InputMaybe<Scalars['String']['input']>;
before: InputMaybe<Scalars['String']['input']>;
first: InputMaybe<Scalars['Int']['input']>;
last: InputMaybe<Scalars['Int']['input']>;
order: InputMaybe<Array<NovelSortInput>>;
where: InputMaybe<NovelFilterInput>;
after?: InputMaybe<Scalars['String']['input']>;
before?: InputMaybe<Scalars['String']['input']>;
first?: InputMaybe<Scalars['Int']['input']>;
last?: InputMaybe<Scalars['Int']['input']>;
order?: InputMaybe<Array<NovelSortInput>>;
where?: InputMaybe<NovelFilterInput>;
};
export type QueryTranslationEnginesArgs = {
order: InputMaybe<Array<TranslationEngineDescriptorSortInput>>;
where: InputMaybe<TranslationEngineDescriptorFilterInput>;
order?: InputMaybe<Array<TranslationEngineDescriptorSortInput>>;
where?: InputMaybe<TranslationEngineDescriptorFilterInput>;
};
export type QueryTranslationRequestsArgs = {
after: InputMaybe<Scalars['String']['input']>;
before: InputMaybe<Scalars['String']['input']>;
first: InputMaybe<Scalars['Int']['input']>;
last: InputMaybe<Scalars['Int']['input']>;
order: InputMaybe<Array<TranslationRequestSortInput>>;
where: InputMaybe<TranslationRequestFilterInput>;
after?: InputMaybe<Scalars['String']['input']>;
before?: InputMaybe<Scalars['String']['input']>;
first?: InputMaybe<Scalars['Int']['input']>;
last?: InputMaybe<Scalars['Int']['input']>;
order?: InputMaybe<Array<TranslationRequestSortInput>>;
where?: InputMaybe<TranslationRequestFilterInput>;
};
export type RegisterUserInput = {
email: Scalars['String']['input'];
inviterOAuthProviderId: InputMaybe<Scalars['String']['input']>;
inviterOAuthProviderId?: InputMaybe<Scalars['String']['input']>;
oAuthProviderId: Scalars['String']['input'];
username: Scalars['String']['input'];
};
@@ -530,11 +529,12 @@ export type SchedulerJob = {
jobTypeName: Scalars['String']['output'];
};
export enum SortEnumType {
Asc = 'ASC',
Desc = 'DESC'
}
export const SortEnumType = {
Asc: 'ASC',
Desc: 'DESC'
} as const;
export type SortEnumType = typeof SortEnumType[keyof typeof SortEnumType];
export type Source = {
createdTime: Scalars['Instant']['output'];
id: Scalars['UnsignedInt']['output'];
@@ -545,52 +545,53 @@ export type Source = {
};
export type SourceFilterInput = {
and: InputMaybe<Array<SourceFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
key: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
name: InputMaybe<StringOperationFilterInput>;
or: InputMaybe<Array<SourceFilterInput>>;
url: InputMaybe<StringOperationFilterInput>;
and?: InputMaybe<Array<SourceFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
key?: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
name?: InputMaybe<StringOperationFilterInput>;
or?: InputMaybe<Array<SourceFilterInput>>;
url?: InputMaybe<StringOperationFilterInput>;
};
export type SourceSortInput = {
createdTime: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
key: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
name: InputMaybe<SortEnumType>;
url: InputMaybe<SortEnumType>;
createdTime?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
key?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
name?: InputMaybe<SortEnumType>;
url?: InputMaybe<SortEnumType>;
};
export type StringOperationFilterInput = {
and: InputMaybe<Array<StringOperationFilterInput>>;
contains: InputMaybe<Scalars['String']['input']>;
endsWith: InputMaybe<Scalars['String']['input']>;
eq: InputMaybe<Scalars['String']['input']>;
in: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;
ncontains: InputMaybe<Scalars['String']['input']>;
nendsWith: InputMaybe<Scalars['String']['input']>;
neq: InputMaybe<Scalars['String']['input']>;
nin: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;
nstartsWith: InputMaybe<Scalars['String']['input']>;
or: InputMaybe<Array<StringOperationFilterInput>>;
startsWith: InputMaybe<Scalars['String']['input']>;
and?: InputMaybe<Array<StringOperationFilterInput>>;
contains?: InputMaybe<Scalars['String']['input']>;
endsWith?: InputMaybe<Scalars['String']['input']>;
eq?: InputMaybe<Scalars['String']['input']>;
in?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;
ncontains?: InputMaybe<Scalars['String']['input']>;
nendsWith?: InputMaybe<Scalars['String']['input']>;
neq?: InputMaybe<Scalars['String']['input']>;
nin?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;
nstartsWith?: InputMaybe<Scalars['String']['input']>;
or?: InputMaybe<Array<StringOperationFilterInput>>;
startsWith?: InputMaybe<Scalars['String']['input']>;
};
export enum TagType {
External = 'EXTERNAL',
Genre = 'GENRE',
System = 'SYSTEM',
UserDefined = 'USER_DEFINED'
}
export const TagType = {
External: 'EXTERNAL',
Genre: 'GENRE',
System: 'SYSTEM',
UserDefined: 'USER_DEFINED'
} as const;
export type TagType = typeof TagType[keyof typeof TagType];
export type TagTypeOperationFilterInput = {
eq: InputMaybe<TagType>;
in: InputMaybe<Array<TagType>>;
neq: InputMaybe<TagType>;
nin: InputMaybe<Array<TagType>>;
eq?: InputMaybe<TagType>;
in?: InputMaybe<Array<TagType>>;
neq?: InputMaybe<TagType>;
nin?: InputMaybe<Array<TagType>>;
};
export type TranslateTextInput = {
@@ -617,24 +618,24 @@ export type TranslationEngineDescriptor = {
};
export type TranslationEngineDescriptorFilterInput = {
and: InputMaybe<Array<TranslationEngineDescriptorFilterInput>>;
displayName: InputMaybe<StringOperationFilterInput>;
key: InputMaybe<StringOperationFilterInput>;
or: InputMaybe<Array<TranslationEngineDescriptorFilterInput>>;
and?: InputMaybe<Array<TranslationEngineDescriptorFilterInput>>;
displayName?: InputMaybe<StringOperationFilterInput>;
key?: InputMaybe<StringOperationFilterInput>;
or?: InputMaybe<Array<TranslationEngineDescriptorFilterInput>>;
};
export type TranslationEngineDescriptorSortInput = {
displayName: InputMaybe<SortEnumType>;
key: InputMaybe<SortEnumType>;
displayName?: InputMaybe<SortEnumType>;
key?: InputMaybe<SortEnumType>;
};
export type TranslationEngineFilterInput = {
and: InputMaybe<Array<TranslationEngineFilterInput>>;
createdTime: InputMaybe<InstantFilterInput>;
id: InputMaybe<UnsignedIntOperationFilterInputType>;
key: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
or: InputMaybe<Array<TranslationEngineFilterInput>>;
and?: InputMaybe<Array<TranslationEngineFilterInput>>;
createdTime?: InputMaybe<InstantFilterInput>;
id?: InputMaybe<UnsignedIntOperationFilterInputType>;
key?: InputMaybe<StringOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
or?: InputMaybe<Array<TranslationEngineFilterInput>>;
};
export type TranslationRequest = {
@@ -651,44 +652,45 @@ export type TranslationRequest = {
};
export type TranslationRequestFilterInput = {
and: InputMaybe<Array<TranslationRequestFilterInput>>;
billedCharacterCount: InputMaybe<UnsignedIntOperationFilterInputType>;
createdTime: InputMaybe<InstantFilterInput>;
from: InputMaybe<LanguageOperationFilterInput>;
id: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime: InputMaybe<InstantFilterInput>;
or: InputMaybe<Array<TranslationRequestFilterInput>>;
originalText: InputMaybe<StringOperationFilterInput>;
status: InputMaybe<TranslationRequestStatusOperationFilterInput>;
to: InputMaybe<LanguageOperationFilterInput>;
translatedText: InputMaybe<StringOperationFilterInput>;
translationEngineKey: InputMaybe<StringOperationFilterInput>;
and?: InputMaybe<Array<TranslationRequestFilterInput>>;
billedCharacterCount?: InputMaybe<UnsignedIntOperationFilterInputType>;
createdTime?: InputMaybe<InstantFilterInput>;
from?: InputMaybe<LanguageOperationFilterInput>;
id?: InputMaybe<UuidOperationFilterInput>;
lastUpdatedTime?: InputMaybe<InstantFilterInput>;
or?: InputMaybe<Array<TranslationRequestFilterInput>>;
originalText?: InputMaybe<StringOperationFilterInput>;
status?: InputMaybe<TranslationRequestStatusOperationFilterInput>;
to?: InputMaybe<LanguageOperationFilterInput>;
translatedText?: InputMaybe<StringOperationFilterInput>;
translationEngineKey?: InputMaybe<StringOperationFilterInput>;
};
export type TranslationRequestSortInput = {
billedCharacterCount: InputMaybe<SortEnumType>;
createdTime: InputMaybe<SortEnumType>;
from: InputMaybe<SortEnumType>;
id: InputMaybe<SortEnumType>;
lastUpdatedTime: InputMaybe<SortEnumType>;
originalText: InputMaybe<SortEnumType>;
status: InputMaybe<SortEnumType>;
to: InputMaybe<SortEnumType>;
translatedText: InputMaybe<SortEnumType>;
translationEngineKey: InputMaybe<SortEnumType>;
billedCharacterCount?: InputMaybe<SortEnumType>;
createdTime?: InputMaybe<SortEnumType>;
from?: InputMaybe<SortEnumType>;
id?: InputMaybe<SortEnumType>;
lastUpdatedTime?: InputMaybe<SortEnumType>;
originalText?: InputMaybe<SortEnumType>;
status?: InputMaybe<SortEnumType>;
to?: InputMaybe<SortEnumType>;
translatedText?: InputMaybe<SortEnumType>;
translationEngineKey?: InputMaybe<SortEnumType>;
};
export enum TranslationRequestStatus {
Failed = 'FAILED',
Pending = 'PENDING',
Success = 'SUCCESS'
}
export const TranslationRequestStatus = {
Failed: 'FAILED',
Pending: 'PENDING',
Success: 'SUCCESS'
} as const;
export type TranslationRequestStatus = typeof TranslationRequestStatus[keyof typeof TranslationRequestStatus];
export type TranslationRequestStatusOperationFilterInput = {
eq: InputMaybe<TranslationRequestStatus>;
in: InputMaybe<Array<TranslationRequestStatus>>;
neq: InputMaybe<TranslationRequestStatus>;
nin: InputMaybe<Array<TranslationRequestStatus>>;
eq?: InputMaybe<TranslationRequestStatus>;
in?: InputMaybe<Array<TranslationRequestStatus>>;
neq?: InputMaybe<TranslationRequestStatus>;
nin?: InputMaybe<Array<TranslationRequestStatus>>;
};
/** A connection to a list of items. */
@@ -720,18 +722,18 @@ export type TranslationResult = {
};
export type UnsignedIntOperationFilterInputType = {
eq: InputMaybe<Scalars['UnsignedInt']['input']>;
gt: InputMaybe<Scalars['UnsignedInt']['input']>;
gte: InputMaybe<Scalars['UnsignedInt']['input']>;
in: InputMaybe<Array<InputMaybe<Scalars['UnsignedInt']['input']>>>;
lt: InputMaybe<Scalars['UnsignedInt']['input']>;
lte: InputMaybe<Scalars['UnsignedInt']['input']>;
neq: InputMaybe<Scalars['UnsignedInt']['input']>;
ngt: InputMaybe<Scalars['UnsignedInt']['input']>;
ngte: InputMaybe<Scalars['UnsignedInt']['input']>;
nin: InputMaybe<Array<InputMaybe<Scalars['UnsignedInt']['input']>>>;
nlt: InputMaybe<Scalars['UnsignedInt']['input']>;
nlte: InputMaybe<Scalars['UnsignedInt']['input']>;
eq?: InputMaybe<Scalars['UnsignedInt']['input']>;
gt?: InputMaybe<Scalars['UnsignedInt']['input']>;
gte?: InputMaybe<Scalars['UnsignedInt']['input']>;
in?: InputMaybe<Array<InputMaybe<Scalars['UnsignedInt']['input']>>>;
lt?: InputMaybe<Scalars['UnsignedInt']['input']>;
lte?: InputMaybe<Scalars['UnsignedInt']['input']>;
neq?: InputMaybe<Scalars['UnsignedInt']['input']>;
ngt?: InputMaybe<Scalars['UnsignedInt']['input']>;
ngte?: InputMaybe<Scalars['UnsignedInt']['input']>;
nin?: InputMaybe<Array<InputMaybe<Scalars['UnsignedInt']['input']>>>;
nlt?: InputMaybe<Scalars['UnsignedInt']['input']>;
nlte?: InputMaybe<Scalars['UnsignedInt']['input']>;
};
export type User = {
@@ -746,93 +748,27 @@ export type User = {
};
export type UuidOperationFilterInput = {
eq: InputMaybe<Scalars['UUID']['input']>;
gt: InputMaybe<Scalars['UUID']['input']>;
gte: InputMaybe<Scalars['UUID']['input']>;
in: InputMaybe<Array<InputMaybe<Scalars['UUID']['input']>>>;
lt: InputMaybe<Scalars['UUID']['input']>;
lte: InputMaybe<Scalars['UUID']['input']>;
neq: InputMaybe<Scalars['UUID']['input']>;
ngt: InputMaybe<Scalars['UUID']['input']>;
ngte: InputMaybe<Scalars['UUID']['input']>;
nin: InputMaybe<Array<InputMaybe<Scalars['UUID']['input']>>>;
nlt: InputMaybe<Scalars['UUID']['input']>;
nlte: InputMaybe<Scalars['UUID']['input']>;
eq?: InputMaybe<Scalars['UUID']['input']>;
gt?: InputMaybe<Scalars['UUID']['input']>;
gte?: InputMaybe<Scalars['UUID']['input']>;
in?: InputMaybe<Array<InputMaybe<Scalars['UUID']['input']>>>;
lt?: InputMaybe<Scalars['UUID']['input']>;
lte?: InputMaybe<Scalars['UUID']['input']>;
neq?: InputMaybe<Scalars['UUID']['input']>;
ngt?: InputMaybe<Scalars['UUID']['input']>;
ngte?: InputMaybe<Scalars['UUID']['input']>;
nin?: InputMaybe<Array<InputMaybe<Scalars['UUID']['input']>>>;
nlt?: InputMaybe<Scalars['UUID']['input']>;
nlte?: InputMaybe<Scalars['UUID']['input']>;
};
export type NovelsQueryVariables = Exact<{
first: InputMaybe<Scalars['Int']['input']>;
after: InputMaybe<Scalars['String']['input']>;
first?: InputMaybe<Scalars['Int']['input']>;
after?: InputMaybe<Scalars['String']['input']>;
}>;
export type NovelsQuery = { novels: { edges: Array<{ cursor: string, node: { id: any, url: string, name: { texts: Array<{ language: Language, text: string }> }, description: { texts: Array<{ language: Language, text: string }> }, coverImage: { originalPath: string, newPath: string | null } | null } }> | null, pageInfo: { hasNextPage: boolean, endCursor: string | null } } | null };
export const NovelsDocument = gql`
query Novels($first: Int, $after: String) {
novels(first: $first, after: $after) {
edges {
cursor
node {
id
url
name {
texts {
language
text
}
}
description {
texts {
language
text
}
}
coverImage {
originalPath
newPath
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
`;
/**
* __useNovelsQuery__
*
* To run a query within a React component, call `useNovelsQuery` and pass it any options that fit your needs.
* When your component renders, `useNovelsQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useNovelsQuery({
* variables: {
* first: // value for 'first'
* after: // value for 'after'
* },
* });
*/
export function useNovelsQuery(baseOptions?: ApolloReactHooks.QueryHookOptions<NovelsQuery, NovelsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return ApolloReactHooks.useQuery<NovelsQuery, NovelsQueryVariables>(NovelsDocument, options);
}
export function useNovelsLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions<NovelsQuery, NovelsQueryVariables>) {
const options = {...defaultOptions, ...baseOptions}
return ApolloReactHooks.useLazyQuery<NovelsQuery, NovelsQueryVariables>(NovelsDocument, options);
}
export function useNovelsSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<NovelsQuery, NovelsQueryVariables>) {
const options = baseOptions === ApolloReactHooks.skipToken ? baseOptions : {...defaultOptions, ...baseOptions}
return ApolloReactHooks.useSuspenseQuery<NovelsQuery, NovelsQueryVariables>(NovelsDocument, options);
}
export type NovelsQueryHookResult = ReturnType<typeof useNovelsQuery>;
export type NovelsLazyQueryHookResult = ReturnType<typeof useNovelsLazyQuery>;
export type NovelsSuspenseQueryHookResult = ReturnType<typeof useNovelsSuspenseQuery>;
export type NovelsQueryResult = Apollo.QueryResult<NovelsQuery, NovelsQueryVariables>;
export const NovelsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Novels"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"first"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"after"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"novels"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"first"},"value":{"kind":"Variable","name":{"kind":"Name","value":"first"}}},{"kind":"Argument","name":{"kind":"Name","value":"after"},"value":{"kind":"Variable","name":{"kind":"Name","value":"after"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cursor"}},{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"name"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"texts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}},{"kind":"Field","name":{"kind":"Name","value":"text"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"description"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"texts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"language"}},{"kind":"Field","name":{"kind":"Name","value":"text"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"coverImage"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"originalPath"}},{"kind":"Field","name":{"kind":"Name","value":"newPath"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode<NovelsQuery, NovelsQueryVariables>;

View File

@@ -1,11 +1,13 @@
import type { Novel } from '../__generated__/graphql'
import type { NovelsQuery } from '../__generated__/graphql'
import { Card, CardContent, CardHeader, CardTitle } from './ui/card'
type NovelNode = NonNullable<NonNullable<NovelsQuery['novels']>['edges']>[number]['node']
type NovelCardProps = {
novel: Novel
novel: NovelNode
}
function pickText(novelText?: Novel['name'] | Novel['description']) {
function pickText(novelText?: NovelNode['name'] | NovelNode['description']) {
const texts = novelText?.texts ?? []
const english = texts.find((t) => t.language === 'EN')
return (english ?? texts[0])?.text ?? 'No description available.'

View File

@@ -1,6 +1,7 @@
import { useMemo } from 'react'
import { useNovelsQuery } from '../__generated__/graphql'
import { useQuery } from '@apollo/client/react'
import { NovelsDocument } from '../__generated__/graphql'
import { NovelCard } from '../components/NovelCard'
import { Button } from '../components/ui/button'
import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'
@@ -8,7 +9,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '../components/ui/card'
const PAGE_SIZE = 12
export function NovelsPage() {
const { data, loading, error, fetchMore } = useNovelsQuery({
const { data, loading, error, fetchMore } = useQuery(NovelsDocument, {
variables: { first: PAGE_SIZE, after: null },
notifyOnNetworkStatusChange: true,
})