From c1140b4e2f7237d80cd621fbddf9644ac88e5679 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 10 Jan 2025 00:18:26 +0800 Subject: [PATCH] :recycle: Splitting up services (skip ci) --- bun.lockb | Bin 300532 -> 302708 bytes package.json | 1 + packages/sn/.gitignore | 175 ++++++++++++++++++ packages/sn/bun.lockb | Bin 0 -> 58900 bytes packages/sn/package.json | 32 ++++ .../sn/src}/attachment.ts | 0 {src/services => packages/sn/src}/auth.ts | 17 +- {src/services => packages/sn/src}/checkIn.ts | 0 packages/sn/src/index.ts | 7 + .../sn/src}/matrix/product.ts | 0 {src/services => packages/sn/src}/network.ts | 15 +- {src/services => packages/sn/src}/post.ts | 0 packages/sn/src/user.ts | 83 +++++++++ packages/sn/tsconfig.json | 27 +++ src/components/CapAppBar.tsx | 4 +- src/components/attachments/AttachmentItem.tsx | 4 +- src/components/auth/SnLoginCheckpoint.tsx | 8 +- src/components/auth/SnLoginRouter.tsx | 4 +- src/components/auth/SnLoginStart.tsx | 4 +- src/components/layouts/ConsoleLayout.tsx | 2 +- src/pages/_app.tsx | 2 +- src/pages/attachments/index.tsx | 4 +- src/pages/auth/authorize.tsx | 4 +- src/pages/auth/login.tsx | 4 +- src/pages/console/matrix/index.tsx | 16 +- src/pages/console/matrix/products/new.tsx | 2 +- src/pages/flow/accounts/confirm.tsx | 2 +- src/pages/flow/accounts/deletion.tsx | 2 +- src/pages/flow/accounts/password-reset.tsx | 2 +- src/pages/posts/[...id].tsx | 6 +- src/pages/posts/feed.ts | 4 +- src/pages/posts/index.tsx | 6 +- src/pages/posts/sitemap.xml.ts | 4 +- src/pages/users/[name].tsx | 7 +- src/pages/users/me.tsx | 11 +- src/services/user.tsx | 82 -------- 36 files changed, 393 insertions(+), 148 deletions(-) create mode 100644 packages/sn/.gitignore create mode 100755 packages/sn/bun.lockb create mode 100644 packages/sn/package.json rename {src/services => packages/sn/src}/attachment.ts (100%) rename {src/services => packages/sn/src}/auth.ts (65%) rename {src/services => packages/sn/src}/checkIn.ts (100%) create mode 100644 packages/sn/src/index.ts rename {src/services => packages/sn/src}/matrix/product.ts (100%) rename {src/services => packages/sn/src}/network.ts (79%) rename {src/services => packages/sn/src}/post.ts (100%) create mode 100644 packages/sn/src/user.ts create mode 100644 packages/sn/tsconfig.json diff --git a/bun.lockb b/bun.lockb index 092cf2e70164f87cb232086898577a6e936d91a0..260f1471d95d271f5f8fd728499688b8b4cd6e41 100755 GIT binary patch delta 60708 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

;Ijp!@Qz5LcIV+)PMT8Qje?^3)*EA(S#3 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 Bd+GoH diff --git a/package.json b/package.json index 82eb00c..f96ad72 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "solar-js-sdk": "./packages/sn", "@emotion/cache": "^11.14.0", "@emotion/react": "^11.14.0", "@emotion/server": "^11.11.0", diff --git a/packages/sn/.gitignore b/packages/sn/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/sn/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/sn/bun.lockb b/packages/sn/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..ef154a0b65b01d581060bd5a1177d574fcd5449c GIT binary patch literal 58900 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 literal 0 HcmV?d00001 diff --git a/packages/sn/package.json b/packages/sn/package.json new file mode 100644 index 0000000..8ac21df --- /dev/null +++ b/packages/sn/package.json @@ -0,0 +1,32 @@ +{ + "name": "solar-js-sdk", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "tsup": { + "entry": [ + "src/index.ts" + ], + "splitting": true, + "sourcemap": true, + "clean": true, + "dts": true, + "format": "esm" + }, + "scripts": { + "build": "tsup" + }, + "devDependencies": { + "@types/bun": "latest", + "tsup": "^8.3.5" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "axios": "^1.7.9", + "axios-case-converter": "^1.1.1", + "universal-cookie": "^7.2.2", + "zustand": "^5.0.3" + } +} diff --git a/src/services/attachment.ts b/packages/sn/src/attachment.ts similarity index 100% rename from src/services/attachment.ts rename to packages/sn/src/attachment.ts diff --git a/src/services/auth.ts b/packages/sn/src/auth.ts similarity index 65% rename from src/services/auth.ts rename to packages/sn/src/auth.ts index 414b3d3..d2a73f1 100644 --- a/src/services/auth.ts +++ b/packages/sn/src/auth.ts @@ -1,4 +1,4 @@ -import { hasCookie } from 'cookies-next/client' +import Cookies from 'universal-cookie' export interface SnAuthResult { isFinished: boolean @@ -35,8 +35,21 @@ export interface SnAuthFactor { accountId?: number | null } +export function setTokenCookies(atk: string, rtk: string) { + const cookies = new Cookies() + cookies.set('nex_user_atk', atk, { path: '/', maxAge: 2592000 }) + cookies.set('nex_user_rtk', rtk, { path: '/', maxAge: 2592000 }) +} + +export function removeTokenCookies() { + const cookies = new Cookies() + cookies.remove('nex_user_atk') + cookies.remove('nex_user_rtk') +} + export function checkAuthenticatedClient(): boolean { - return !!hasCookie('nex_user_atk') + const cookies = new Cookies() + return !!cookies.get('nex_user_atk') } export function redirectToLogin() { diff --git a/src/services/checkIn.ts b/packages/sn/src/checkIn.ts similarity index 100% rename from src/services/checkIn.ts rename to packages/sn/src/checkIn.ts diff --git a/packages/sn/src/index.ts b/packages/sn/src/index.ts new file mode 100644 index 0000000..9d24474 --- /dev/null +++ b/packages/sn/src/index.ts @@ -0,0 +1,7 @@ +export * from './matrix/product' +export * from './attachment' +export * from './auth' +export * from './checkIn' +export * from './network' +export * from './post' +export * from './user' diff --git a/src/services/matrix/product.ts b/packages/sn/src/matrix/product.ts similarity index 100% rename from src/services/matrix/product.ts rename to packages/sn/src/matrix/product.ts diff --git a/src/services/network.ts b/packages/sn/src/network.ts similarity index 79% rename from src/services/network.ts rename to packages/sn/src/network.ts index 1fa2267..d08a952 100644 --- a/src/services/network.ts +++ b/packages/sn/src/network.ts @@ -1,6 +1,7 @@ -import axios, { AxiosInstance } from 'axios' +import axios, { type AxiosInstance } from 'axios' import applyCaseMiddleware from 'axios-case-converter' -import { hasCookie, getCookie, setCookie } from 'cookies-next/client' +import Cookies from 'universal-cookie' +import { setTokenCookies } from './auth' const baseURL = 'https://api.sn.solsynth.dev' @@ -26,23 +27,23 @@ export const sni: AxiosInstance = (() => { })() async function refreshToken(): Promise { - if (!hasCookie('nex_user_atk') || !hasCookie('nex_user_rtk')) return + const cookies = new Cookies() + if (!cookies.get('nex_user_atk') || !cookies.get('nex_user_rtk')) return - const ogTk: string = getCookie('nex_user_atk')! + const ogTk: string = cookies.get('nex_user_atk')! if (!isTokenExpired(ogTk)) return ogTk const resp = await axios.post( '/cgi/id/auth/token', { - refresh_token: getCookie('nex_user_rtk')!, + refresh_token: cookies.get('nex_user_rtk')!, grant_type: 'refresh_token', }, { baseURL }, ) const atk: string = resp.data['access_token'] const rtk: string = resp.data['refresh_token'] - setCookie('nex_user_atk', atk, { path: '/', maxAge: 2592000 }) - setCookie('nex_user_rtk', rtk, { path: '/', maxAge: 2592000 }) + setTokenCookies(atk, rtk) console.log('[Authenticator] Refreshed token...') diff --git a/src/services/post.ts b/packages/sn/src/post.ts similarity index 100% rename from src/services/post.ts rename to packages/sn/src/post.ts diff --git a/packages/sn/src/user.ts b/packages/sn/src/user.ts new file mode 100644 index 0000000..a2ca8e4 --- /dev/null +++ b/packages/sn/src/user.ts @@ -0,0 +1,83 @@ +import { create } from 'zustand' +import { sni } from './network' +import Cookies from 'universal-cookie' + +export interface SnAccount { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date | null + confirmedAt?: Date | null + contacts?: SnAccountContact[] | null + avatar: string + banner: string + description: string + name: string + nick: string + permNodes: Record + profile?: SnAccountProfile | null + badges: SnAccountBadge[] + suspendedAt?: Date | null + affiliatedId?: number | null + affiliatedTo?: number | null + automatedBy?: number | null + automatedId?: number | null +} + +export interface SnAccountContact { + accountId: number + content: string + createdAt: Date + deletedAt?: Date | null + id: number + isPrimary: boolean + isPublic: boolean + type: number + updatedAt: Date + verifiedAt?: Date | null +} + +export interface SnAccountProfile { + id: number + accountId: number + birthday?: Date | null + createdAt: Date + deletedAt?: Date | null + experience: number + firstName: string + lastName: string + lastSeenAt?: Date | null + updatedAt: Date +} + +export interface SnAccountBadge { + id: number + createdAt: Date + updatedAt: Date + deletedAt?: Date | null + type: string + accountId: number + metadata: Record +} + +export interface UserStore { + account: SnAccount | undefined + fetchUser: () => Promise +} + +export const useUserStore = create((set) => ({ + account: undefined, + fetchUser: async (): Promise => { + const cookies = new Cookies() + if (!cookies.get('nex_user_atk')) return + try { + const resp = await sni.get('/cgi/id/users/me') + set({ account: resp.data }) + console.log('[Authenticator] Logged in as @' + resp.data.name) + return resp.data + } catch (err) { + console.error('[Authenticator] Unable to get user profile: ', err) + return + } + }, +})) diff --git a/packages/sn/tsconfig.json b/packages/sn/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/sn/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/src/components/CapAppBar.tsx b/src/components/CapAppBar.tsx index b5e9d14..4a331bf 100644 --- a/src/components/CapAppBar.tsx +++ b/src/components/CapAppBar.tsx @@ -1,6 +1,6 @@ -import { useUserStore } from '@/services/user' +import { useUserStore } from 'solar-js-sdk' import { AppBar, AppBarProps, Avatar, IconButton, Toolbar, Typography, useScrollTrigger, useTheme } from '@mui/material' -import { getAttachmentUrl } from '@/services/network' +import { getAttachmentUrl } from 'solar-js-sdk' import MenuIcon from '@mui/icons-material/Menu' import AccountCircle from '@mui/icons-material/AccountCircle' import Link from 'next/link' diff --git a/src/components/attachments/AttachmentItem.tsx b/src/components/attachments/AttachmentItem.tsx index 8dbc60a..c0d86a4 100644 --- a/src/components/attachments/AttachmentItem.tsx +++ b/src/components/attachments/AttachmentItem.tsx @@ -1,5 +1,5 @@ -import { SnAttachment } from '@/services/attachment' -import { getAttachmentUrl } from '@/services/network' +import { SnAttachment } from 'solar-js-sdk' +import { getAttachmentUrl } from 'solar-js-sdk' import { QuestionMark } from '@mui/icons-material' import { Link, Paper, Typography } from '@mui/material' import { ComponentProps } from 'react' diff --git a/src/components/auth/SnLoginCheckpoint.tsx b/src/components/auth/SnLoginCheckpoint.tsx index b60c0eb..f5bead7 100644 --- a/src/components/auth/SnLoginCheckpoint.tsx +++ b/src/components/auth/SnLoginCheckpoint.tsx @@ -1,14 +1,13 @@ 'use client' -import { SnAuthFactor, SnAuthResult, SnAuthTicket } from '@/services/auth' -import { sni } from '@/services/network' +import { setTokenCookies, SnAuthFactor, SnAuthResult, SnAuthTicket } from 'solar-js-sdk' +import { sni } from 'solar-js-sdk' import { ArrowForward } from '@mui/icons-material' import { Collapse, Alert, Box, TextField, Button } from '@mui/material' import { useState } from 'react' import { useForm } from 'react-hook-form' import ErrorIcon from '@mui/icons-material/Error' -import { setCookie } from 'cookies-next/client' export interface SnLoginCheckpointForm { password: string @@ -44,8 +43,7 @@ export function SnLoginCheckpoint({ }) const atk: string = tokenResp.data['accessToken'] const rtk: string = tokenResp.data['refreshToken'] - setCookie('nex_user_atk', atk, { path: '/', maxAge: 2592000 }) - setCookie('nex_user_rtk', rtk, { path: '/', maxAge: 2592000 }) + setTokenCookies(atk, rtk) console.log('[Authenticator] User has been logged in. Result atk: ', atk) } diff --git a/src/components/auth/SnLoginRouter.tsx b/src/components/auth/SnLoginRouter.tsx index 68f4ec3..fe566ad 100644 --- a/src/components/auth/SnLoginRouter.tsx +++ b/src/components/auth/SnLoginRouter.tsx @@ -1,7 +1,7 @@ 'use client' -import { SnAuthFactor, SnAuthTicket } from '@/services/auth' -import { sni } from '@/services/network' +import { SnAuthFactor, SnAuthTicket } from 'solar-js-sdk' +import { sni } from 'solar-js-sdk' import { Collapse, Alert, Box, Button, Typography, ButtonGroup } from '@mui/material' import { useState } from 'react' diff --git a/src/components/auth/SnLoginStart.tsx b/src/components/auth/SnLoginStart.tsx index e54aeb6..402d5ee 100644 --- a/src/components/auth/SnLoginStart.tsx +++ b/src/components/auth/SnLoginStart.tsx @@ -1,10 +1,10 @@ 'use client' import { useState } from 'react' -import { sni } from '@/services/network' +import { sni } from 'solar-js-sdk' import { ArrowForward } from '@mui/icons-material' import { Alert, Box, Button, Collapse, Link, TextField, Typography } from '@mui/material' -import { SnAuthFactor, SnAuthResult, SnAuthTicket } from '@/services/auth' +import { SnAuthFactor, SnAuthResult, SnAuthTicket } from 'solar-js-sdk' import { useForm } from 'react-hook-form' import NextLink from 'next/link' diff --git a/src/components/layouts/ConsoleLayout.tsx b/src/components/layouts/ConsoleLayout.tsx index 80ffa46..594d3bd 100644 --- a/src/components/layouts/ConsoleLayout.tsx +++ b/src/components/layouts/ConsoleLayout.tsx @@ -1,4 +1,4 @@ -import { checkAuthenticatedClient, redirectToLogin } from '@/services/auth' +import { checkAuthenticatedClient, redirectToLogin } from 'solar-js-sdk' import { JSX, useEffect } from 'react' import { DashboardLayout, Navigation } from '@toolpad/core' import { Box, Stack, Typography } from '@mui/material' diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 1099456..5cb3168 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -5,7 +5,7 @@ import { Roboto } from 'next/font/google' import { CapAppBar } from '@/components/CapAppBar' import { PagesProgressBar as ProgressBar } from 'next-nprogress-bar' import { AppProvider } from '@toolpad/core/nextjs' -import { useUserStore } from '@/services/user' +import { useUserStore } from 'solar-js-sdk' import { useEffect } from 'react' import Head from 'next/head' diff --git a/src/pages/attachments/index.tsx b/src/pages/attachments/index.tsx index 177d0a0..f9e62f5 100644 --- a/src/pages/attachments/index.tsx +++ b/src/pages/attachments/index.tsx @@ -1,6 +1,6 @@ import { AttachmentItem } from '@/components/attachments/AttachmentItem' -import { SnAttachment } from '@/services/attachment' -import { sni } from '@/services/network' +import { SnAttachment } from 'solar-js-sdk' +import { sni } from 'solar-js-sdk' import { Box, ImageList, ImageListItem, Pagination, useMediaQuery, useTheme } from '@mui/material' import { GetServerSideProps, InferGetServerSidePropsType } from 'next' import { useRouter } from 'next/router' diff --git a/src/pages/auth/authorize.tsx b/src/pages/auth/authorize.tsx index 817f06d..b2c1639 100644 --- a/src/pages/auth/authorize.tsx +++ b/src/pages/auth/authorize.tsx @@ -1,8 +1,8 @@ -import { sni } from '@/services/network' +import { sni } from 'solar-js-sdk' import { Container, Box, Typography, Alert, Collapse, Button, CircularProgress, Card, CardContent } from '@mui/material' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' -import { checkAuthenticatedClient, redirectToLogin, SnAuthTicket } from '@/services/auth' +import { checkAuthenticatedClient, redirectToLogin, SnAuthTicket } from 'solar-js-sdk' import ErrorIcon from '@mui/icons-material/Error' import CloseIcon from '@mui/icons-material/Close' diff --git a/src/pages/auth/login.tsx b/src/pages/auth/login.tsx index 65d30fc..b74ca61 100644 --- a/src/pages/auth/login.tsx +++ b/src/pages/auth/login.tsx @@ -1,8 +1,8 @@ import { SnLoginCheckpoint } from '@/components/auth/SnLoginCheckpoint' import { SnLoginRouter } from '@/components/auth/SnLoginRouter' import { SnLoginStart } from '@/components/auth/SnLoginStart' -import { SnAuthFactor, SnAuthTicket } from '@/services/auth' -import { useUserStore } from '@/services/user' +import { SnAuthFactor, SnAuthTicket } from 'solar-js-sdk' +import { useUserStore } from 'solar-js-sdk' import { Box, Container, Typography } from '@mui/material' import { useRouter } from 'next/router' import { useState } from 'react' diff --git a/src/pages/console/matrix/index.tsx b/src/pages/console/matrix/index.tsx index 6b9a861..bc13e0e 100644 --- a/src/pages/console/matrix/index.tsx +++ b/src/pages/console/matrix/index.tsx @@ -1,17 +1,7 @@ import { ConsoleLayout, getConsoleStaticProps } from '@/components/layouts/ConsoleLayout' -import { MaProduct } from '@/services/matrix/product' -import { sni } from '@/services/network' -import { - Typography, - Container, - Box, - Button, - Grid2 as Grid, - Card, - CardActionArea, - CardContent, - CardActions, -} from '@mui/material' +import { MaProduct } from 'solar-js-sdk' +import { sni } from 'solar-js-sdk' +import { Typography, Container, Box, Button, Grid2 as Grid, Card, CardContent, CardActions } from '@mui/material' import NextLink from 'next/link' import { useEffect, useState } from 'react' diff --git a/src/pages/console/matrix/products/new.tsx b/src/pages/console/matrix/products/new.tsx index 5376c62..834f87d 100644 --- a/src/pages/console/matrix/products/new.tsx +++ b/src/pages/console/matrix/products/new.tsx @@ -3,8 +3,8 @@ import { Typography, Container, Box, Button, TextField, Collapse, Alert } from ' import { useForm } from 'react-hook-form' import { useState } from 'react' import { useRouter } from 'next/router' +import { sni } from 'solar-js-sdk' import NextLink from 'next/link' -import { sni } from '@/services/network' import ErrorIcon from '@mui/icons-material/Error' diff --git a/src/pages/flow/accounts/confirm.tsx b/src/pages/flow/accounts/confirm.tsx index ea05301..780fc9a 100644 --- a/src/pages/flow/accounts/confirm.tsx +++ b/src/pages/flow/accounts/confirm.tsx @@ -1,4 +1,4 @@ -import { sni } from '@/services/network' +import { sni } from 'solar-js-sdk' import { Container, Box, Typography, CircularProgress, Alert, Collapse } from '@mui/material' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' diff --git a/src/pages/flow/accounts/deletion.tsx b/src/pages/flow/accounts/deletion.tsx index 47edc16..6089809 100644 --- a/src/pages/flow/accounts/deletion.tsx +++ b/src/pages/flow/accounts/deletion.tsx @@ -1,4 +1,4 @@ -import { sni } from '@/services/network' +import { sni } from 'solar-js-sdk' import { Container, Box, Typography, Alert, Collapse, Button } from '@mui/material' import { useRouter } from 'next/router' import { useState } from 'react' diff --git a/src/pages/flow/accounts/password-reset.tsx b/src/pages/flow/accounts/password-reset.tsx index 3473863..822c21e 100644 --- a/src/pages/flow/accounts/password-reset.tsx +++ b/src/pages/flow/accounts/password-reset.tsx @@ -1,4 +1,4 @@ -import { sni } from '@/services/network' +import { sni } from 'solar-js-sdk' import { Container, Box, Typography, Alert, Collapse, Button, TextField } from '@mui/material' import { useRouter } from 'next/router' import { useState } from 'react' diff --git a/src/pages/posts/[...id].tsx b/src/pages/posts/[...id].tsx index 1d473e2..8038ff3 100644 --- a/src/pages/posts/[...id].tsx +++ b/src/pages/posts/[...id].tsx @@ -1,6 +1,6 @@ -import { getAttachmentUrl, sni } from '@/services/network' -import { SnPost } from '@/services/post' -import { listAttachment, SnAttachment } from '@/services/attachment' +import { getAttachmentUrl, sni } from 'solar-js-sdk' +import { SnPost } from 'solar-js-sdk' +import { listAttachment, SnAttachment } from 'solar-js-sdk' import { Grid2 as Grid, Alert, diff --git a/src/pages/posts/feed.ts b/src/pages/posts/feed.ts index 7ba8b71..a48cd59 100644 --- a/src/pages/posts/feed.ts +++ b/src/pages/posts/feed.ts @@ -1,5 +1,5 @@ -import { sni } from '@/services/network' -import { SnPost } from '@/services/post' +import { sni } from 'solar-js-sdk' +import { SnPost } from 'solar-js-sdk' import { GetServerSideProps } from 'next' import { Feed } from 'feed' diff --git a/src/pages/posts/index.tsx b/src/pages/posts/index.tsx index 99d49d9..c8206e7 100644 --- a/src/pages/posts/index.tsx +++ b/src/pages/posts/index.tsx @@ -1,7 +1,7 @@ import { AttachmentItem } from '@/components/attachments/AttachmentItem' -import { SnAttachment, listAttachment } from '@/services/attachment' -import { getAttachmentUrl, sni } from '@/services/network' -import { SnPost } from '@/services/post' +import { SnAttachment, listAttachment } from 'solar-js-sdk' +import { getAttachmentUrl, sni } from 'solar-js-sdk' +import { SnPost } from 'solar-js-sdk' import { Avatar, Box, Container, Divider, Grid2 as Grid, Link, Pagination, Paper, Typography } from '@mui/material' import { GetServerSideProps, InferGetServerSidePropsType } from 'next' import NextLink from 'next/link' diff --git a/src/pages/posts/sitemap.xml.ts b/src/pages/posts/sitemap.xml.ts index 63a2677..4205d44 100644 --- a/src/pages/posts/sitemap.xml.ts +++ b/src/pages/posts/sitemap.xml.ts @@ -1,5 +1,5 @@ -import { sni } from '@/services/network' -import { SnPost } from '@/services/post' +import { sni } from 'solar-js-sdk' +import { SnPost } from 'solar-js-sdk' import { GetServerSideProps } from 'next' import { EnumChangefreq, SitemapItem, SitemapStream, streamToPromise } from 'sitemap' import { Readable } from 'stream' diff --git a/src/pages/users/[name].tsx b/src/pages/users/[name].tsx index 015ee89..a0e44ea 100644 --- a/src/pages/users/[name].tsx +++ b/src/pages/users/[name].tsx @@ -1,9 +1,10 @@ -import { SnCheckInRecord } from '@/services/checkIn' -import { getAttachmentUrl, sni } from '@/services/network' -import { SnAccount, SnAccountBadgeMapping } from '@/services/user' +import { SnCheckInRecord } from 'solar-js-sdk' +import { getAttachmentUrl, sni } from 'solar-js-sdk' +import { SnAccount } from 'solar-js-sdk' import { Avatar, Box, Card, CardContent, Container, Grid2 as Grid, Typography } from '@mui/material' import { LineChart } from '@mui/x-charts' import type { InferGetServerSidePropsType, GetServerSideProps } from 'next' +import { SnAccountBadgeMapping } from '@/services/user' import Image from 'next/image' export const getServerSideProps = (async (context) => { diff --git a/src/pages/users/me.tsx b/src/pages/users/me.tsx index 93e2ef5..42d887d 100644 --- a/src/pages/users/me.tsx +++ b/src/pages/users/me.tsx @@ -1,14 +1,14 @@ -import { checkAuthenticatedClient, redirectToLogin } from '@/services/auth' -import { useUserStore } from '@/services/user' +import { checkAuthenticatedClient, redirectToLogin } from 'solar-js-sdk' +import { useUserStore } from 'solar-js-sdk' import { Avatar, Box, Button, Container, Typography } from '@mui/material' -import { getAttachmentUrl } from '@/services/network' +import { getAttachmentUrl } from 'solar-js-sdk' import { useEffect } from 'react' +import { removeTokenCookies } from 'solar-js-sdk' import Image from 'next/image' import LogoutIcon from '@mui/icons-material/Logout' import LaunchIcon from '@mui/icons-material/Launch' import Link from 'next/link' -import { deleteCookie } from 'cookies-next/client' export default function UserItself() { useEffect(() => { @@ -18,8 +18,7 @@ export default function UserItself() { const userStore = useUserStore() function logout() { - deleteCookie('nex_user_atk') - deleteCookie('nex_user_rtk') + removeTokenCookies() window.location.reload() } diff --git a/src/services/user.tsx b/src/services/user.tsx index bb6aa40..8b1bed3 100644 --- a/src/services/user.tsx +++ b/src/services/user.tsx @@ -1,69 +1,8 @@ -import { create } from 'zustand' -import { sni } from './network' -import { hasCookie } from 'cookies-next/client' import { JSX } from 'react' import ConstructionIcon from '@mui/icons-material/Construction' import FlagIcon from '@mui/icons-material/Flag' -export interface SnAccount { - id: number - createdAt: Date - updatedAt: Date - deletedAt?: Date | null - confirmedAt?: Date | null - contacts?: SnAccountContact[] | null - avatar: string - banner: string - description: string - name: string - nick: string - permNodes: Record - profile?: SnAccountProfile | null - badges: SnAccountBadge[] - suspendedAt?: Date | null - affiliatedId?: number | null - affiliatedTo?: number | null - automatedBy?: number | null - automatedId?: number | null -} - -export interface SnAccountContact { - accountId: number - content: string - createdAt: Date - deletedAt?: Date | null - id: number - isPrimary: boolean - isPublic: boolean - type: number - updatedAt: Date - verifiedAt?: Date | null -} - -export interface SnAccountProfile { - id: number - accountId: number - birthday?: Date | null - createdAt: Date - deletedAt?: Date | null - experience: number - firstName: string - lastName: string - lastSeenAt?: Date | null - updatedAt: Date -} - -export interface SnAccountBadge { - id: number - createdAt: Date - updatedAt: Date - deletedAt?: Date | null - type: string - accountId: number - metadata: Record -} - export const SnAccountBadgeMapping: Record = { 'company.staff': { icon: , @@ -74,24 +13,3 @@ export const SnAccountBadgeMapping: Record Promise -} - -export const useUserStore = create((set) => ({ - account: undefined, - fetchUser: async (): Promise => { - if (!hasCookie('nex_user_atk')) return - try { - const resp = await sni.get('/cgi/id/users/me') - set({ account: resp.data }) - console.log('[Authenticator] Logged in as @' + resp.data.name) - return resp.data - } catch (err) { - console.error('[Authenticator] Unable to get user profile: ', err) - return - } - }, -}))