Skip to content

Commit 4b79e3a

Browse files
committed
2025.03.06 first draft for ranking widget
1 parent 56387d4 commit 4b79e3a

File tree

6 files changed

+91
-13
lines changed

6 files changed

+91
-13
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
query RankByLogin($login: String!) {
2+
rankByLogin(login: $login) {
3+
githubId
4+
contributedStars
5+
contributedStarsM
6+
followersCount
7+
followersCountM
8+
ownedStars
9+
ownedStarsM
10+
user {
11+
login
12+
avatarUrl
13+
ownedStars
14+
contributedStars
15+
followersCount
16+
location
17+
}
18+
}
19+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { graphqlRequest } from '@/lib/graphql-request';
2+
import { RankByLoginDocument } from '@/types/generated/graphql';
3+
import { redirect } from 'next/navigation';
4+
import { ImageResponse } from 'next/og';
5+
import { NextRequest } from 'next/server';
6+
7+
type Props = {
8+
params: Promise<{
9+
login: string;
10+
widgetType: string;
11+
}>;
12+
};
13+
14+
export async function GET(req: NextRequest, { params }: Props) {
15+
const { login, widgetType } = await params;
16+
17+
const { rankByLogin } = await graphqlRequest(RankByLoginDocument, { login });
18+
19+
console.log(rankByLogin);
20+
21+
if (!rankByLogin) {
22+
return redirect('/404');
23+
}
24+
25+
const { user, ownedStars } = rankByLogin;
26+
27+
return new ImageResponse(
28+
(
29+
<div
30+
style={{
31+
height: '100%',
32+
width: '100%',
33+
display: 'flex',
34+
flexDirection: 'column',
35+
alignItems: 'center',
36+
justifyContent: 'center',
37+
backgroundColor: '#fff',
38+
fontSize: 32,
39+
fontWeight: 600,
40+
}}
41+
>
42+
<img src={user?.avatarUrl} width={100} height={100} />
43+
<div style={{ marginTop: 40 }}>{`${user?.login}: #${ownedStars} with ${user?.ownedStars} stars`}</div>
44+
</div>
45+
),
46+
{
47+
width: 600,
48+
height: 300,
49+
},
50+
);
51+
}

app/by/[type]/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { graphqlRequest } from '@/lib/graphql-request';
2-
import { RankOrder, StarsRankingDocument } from '@/types/generated/graphql';
2+
import { GlobalRanksDocument, RankOrder } from '@/types/generated/graphql';
33
import Image from 'next/image';
44
import {
55
Pagination,
@@ -54,7 +54,7 @@ export default async function GlobalRanking({
5454
const [queryOrder, rankPropName] = getConfigByType(type);
5555
const page = Number((await searchParams)?.page) || 1;
5656
const offset = (page - 1) * ITEMS_PER_PAGE;
57-
const data = await graphqlRequest(StarsRankingDocument, { order: queryOrder, offset });
57+
const data = await graphqlRequest(GlobalRanksDocument, { order: queryOrder, offset });
5858

5959
return (
6060
<>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
query StarsRanking($order: RankOrder, $offset: Int) {
1+
query GlobalRanks($order: RankOrder, $offset: Int) {
22
globalRanks(order: $order, offset: $offset) {
33
githubId
44
contributedStars

types/generated/graphql.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,8 @@ export type Scalars = {
1818

1919
export type Query = {
2020
__typename?: 'Query';
21-
globalRank: RankGlobal;
2221
globalRanks: Array<RankGlobal>;
23-
};
24-
25-
26-
export type QueryGlobalRankArgs = {
27-
id: Scalars['ID']['input'];
22+
rankByLogin?: Maybe<RankGlobal>;
2823
};
2924

3025

@@ -34,6 +29,11 @@ export type QueryGlobalRanksArgs = {
3429
order?: RankOrder;
3530
};
3631

32+
33+
export type QueryRankByLoginArgs = {
34+
login: Scalars['String']['input'];
35+
};
36+
3737
export type RankGlobal = {
3838
__typename?: 'RankGlobal';
3939
_id: Scalars['String']['output'];
@@ -80,13 +80,21 @@ export enum UserFetchingStatus {
8080
Completed = 'COMPLETED'
8181
}
8282

83-
export type StarsRankingQueryVariables = Exact<{
83+
export type RankByLoginQueryVariables = Exact<{
84+
login: Scalars['String']['input'];
85+
}>;
86+
87+
88+
export type RankByLoginQuery = { __typename?: 'Query', rankByLogin?: { __typename?: 'RankGlobal', githubId: string, contributedStars: number, contributedStarsM?: number | null, followersCount: number, followersCountM?: number | null, ownedStars: number, ownedStarsM?: number | null, user?: { __typename?: 'User', login: string, avatarUrl?: string | null, ownedStars?: number | null, contributedStars?: number | null, followersCount?: number | null, location?: string | null } | null } | null };
89+
90+
export type GlobalRanksQueryVariables = Exact<{
8491
order?: InputMaybe<RankOrder>;
8592
offset?: InputMaybe<Scalars['Int']['input']>;
8693
}>;
8794

8895

89-
export type StarsRankingQuery = { __typename?: 'Query', globalRanks: Array<{ __typename?: 'RankGlobal', githubId: string, contributedStars: number, contributedStarsM?: number | null, followersCount: number, followersCountM?: number | null, ownedStars: number, ownedStarsM?: number | null, user?: { __typename?: 'User', login: string, avatarUrl?: string | null, ownedStars?: number | null, contributedStars?: number | null, followersCount?: number | null, location?: string | null } | null }> };
96+
export type GlobalRanksQuery = { __typename?: 'Query', globalRanks: Array<{ __typename?: 'RankGlobal', githubId: string, contributedStars: number, contributedStarsM?: number | null, followersCount: number, followersCountM?: number | null, ownedStars: number, ownedStarsM?: number | null, user?: { __typename?: 'User', login: string, avatarUrl?: string | null, ownedStars?: number | null, contributedStars?: number | null, followersCount?: number | null, location?: string | null } | null }> };
9097

9198

92-
export const StarsRankingDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"StarsRanking"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"order"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"RankOrder"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"globalRanks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"order"},"value":{"kind":"Variable","name":{"kind":"Name","value":"order"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"githubId"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"followersCountM"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"location"}}]}}]}}]}}]} as unknown as DocumentNode<StarsRankingQuery, StarsRankingQueryVariables>;
99+
export const RankByLoginDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"RankByLogin"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"login"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"rankByLogin"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"login"},"value":{"kind":"Variable","name":{"kind":"Name","value":"login"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"githubId"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"followersCountM"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"location"}}]}}]}}]}}]} as unknown as DocumentNode<RankByLoginQuery, RankByLoginQueryVariables>;
100+
export const GlobalRanksDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GlobalRanks"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"order"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"RankOrder"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"globalRanks"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"order"},"value":{"kind":"Variable","name":{"kind":"Name","value":"order"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"githubId"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"followersCountM"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStarsM"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"ownedStars"}},{"kind":"Field","name":{"kind":"Name","value":"contributedStars"}},{"kind":"Field","name":{"kind":"Name","value":"followersCount"}},{"kind":"Field","name":{"kind":"Name","value":"location"}}]}}]}}]}}]} as unknown as DocumentNode<GlobalRanksQuery, GlobalRanksQueryVariables>;

types/generated/schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date
44
scalar DateTime
55

66
type Query {
7-
globalRank(id: ID!): RankGlobal!
87
globalRanks(limit: Int! = 100, offset: Int! = 0, order: RankOrder! = STARS_OWNED): [RankGlobal!]!
8+
rankByLogin(login: String!): RankGlobal
99
}
1010

1111
type RankGlobal {

0 commit comments

Comments
 (0)