├── functions ├── README.md ├── new_invitation │ ├── package.json │ ├── src │ │ └── index.ts │ ├── README.md │ ├── pnpm-lock.yaml │ └── .gitignore ├── add_user_to_team │ ├── package.json │ ├── README.md │ ├── pnpm-lock.yaml │ ├── src │ │ └── index.ts │ └── .gitignore ├── setup_workspace │ ├── package.json │ ├── README.md │ ├── pnpm-lock.yaml │ ├── .gitignore │ └── src │ │ └── index.ts ├── change_username_to_email │ ├── package.json │ ├── README.md │ ├── src │ │ └── index.ts │ ├── pnpm-lock.yaml │ └── .gitignore ├── setup_user_workspace │ ├── package.json │ ├── README.md │ ├── pnpm-lock.yaml │ ├── .gitignore │ └── src │ │ └── index.ts ├── push_notifications │ ├── package.json │ ├── README.md │ ├── .gitignore │ ├── pnpm-lock.yaml │ └── src │ │ └── index.ts └── upload_user_profile │ ├── package.json │ ├── README.md │ ├── .gitignore │ └── src │ └── index.ts ├── .prettierrc ├── .gitattributes ├── src ├── utility │ ├── index.ts │ └── appwriteClient.ts ├── components │ ├── layout │ │ ├── index.ts │ │ ├── title │ │ │ └── index.tsx │ │ ├── layout │ │ │ └── index.tsx │ │ └── header │ │ │ └── index.tsx │ ├── offLayoutArea │ │ └── index.tsx │ ├── index.ts │ ├── ChakraNextImage.tsx │ ├── Bold.tsx │ ├── ExtraBold.tsx │ ├── ChatMessage.tsx │ ├── QuickLink.tsx │ ├── ColorInput.tsx │ ├── FormItem.tsx │ ├── InvitationError.tsx │ ├── ProjectsCard.tsx │ ├── InviteMember.tsx │ ├── RemoveUser.tsx │ ├── SideBarProject.tsx │ ├── SideBar.tsx │ ├── WorkspacesList.tsx │ ├── NewMember.tsx │ ├── NotificationList.tsx │ ├── ProjectsList.tsx │ └── NavBar.tsx └── authProvider.ts ├── .npmrc ├── types ├── index.ts └── Project.ts ├── public ├── favicon.ico ├── images │ ├── logo.png │ ├── empty.png │ ├── notask.png │ ├── accept_invite.png │ ├── noinvitations.png │ ├── nonotifications.png │ ├── flags │ │ ├── de.svg │ │ └── en.svg │ └── growth.svg ├── refine-collapsed.svg └── locales │ ├── en │ └── common.json │ └── de │ └── common.json ├── next-i18next.config.js ├── styles └── styles.sass ├── .eslintrc.json ├── animations ├── index.ts ├── unfade.ts ├── rise.ts └── rise_reverse.ts ├── .gitignore ├── next-env.d.ts ├── pages ├── project │ └── [id] │ │ ├── roles.tsx │ │ ├── chat.tsx │ │ └── index.tsx ├── login.tsx ├── _document.tsx ├── notifications.tsx ├── accept_invite.tsx ├── accept_invitation.tsx ├── invitations.tsx ├── _app.tsx ├── dashboard.tsx └── features.tsx ├── next.config.js ├── theme └── chakra.ts ├── .github └── FUNDING.yml ├── LICENSE ├── tsconfig.json ├── package.json ├── README.MD └── appwrite.json /functions/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4 3 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=TypeScript -------------------------------------------------------------------------------- /src/utility/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./appwriteClient"; 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | legacy-peer-deps=true 2 | strict-peer-dependencies=false 3 | -------------------------------------------------------------------------------- /types/index.ts: -------------------------------------------------------------------------------- 1 | import { default as Project } from "./Project"; 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/logo.png -------------------------------------------------------------------------------- /public/images/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/empty.png -------------------------------------------------------------------------------- /public/images/notask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/notask.png -------------------------------------------------------------------------------- /public/images/accept_invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/accept_invite.png -------------------------------------------------------------------------------- /public/images/noinvitations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/noinvitations.png -------------------------------------------------------------------------------- /public/images/nonotifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kyeboard/takoyaki/HEAD/public/images/nonotifications.png -------------------------------------------------------------------------------- /next-i18next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | i18n: { 3 | defaultLocale: "en", 4 | locales: ["en", "de"], 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /src/components/layout/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./header"; 2 | export * from "./sider"; 3 | export * from "./layout"; 4 | export * from "./title"; 5 | -------------------------------------------------------------------------------- /styles/styles.sass: -------------------------------------------------------------------------------- 1 | *::-webkit-scrollbar 2 | display: none 3 | 4 | * 5 | box-sizing: border-box 6 | transition: all ease-in-out 100ms 7 | -------------------------------------------------------------------------------- /types/Project.ts: -------------------------------------------------------------------------------- 1 | export default interface Project { 2 | title: string; 3 | description: string; 4 | color: string; 5 | completed: number; 6 | } 7 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "prettier"], 3 | "plugins": ["prettier"], 4 | "rules": { 5 | "prettier/prettier": "warn" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /animations/index.ts: -------------------------------------------------------------------------------- 1 | export { default as rise } from "./rise"; 2 | export { default as rise_reverse } from "./rise_reverse"; 3 | export { default as unfade } from "./unfade"; 4 | -------------------------------------------------------------------------------- /src/components/offLayoutArea/index.tsx: -------------------------------------------------------------------------------- 1 | import { RefineKbar } from "@pankod/refine-kbar"; 2 | 3 | export const OffLayoutArea: React.FC = () => { 4 | return ; 5 | }; 6 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ChakraNextImage } from "./ChakraNextImage"; 2 | export { default as Bold } from "./Bold"; 3 | export { default as ExtraBold } from "./ExtraBold"; 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # npm 2 | node_modules 3 | # next.js build files 4 | .next 5 | # environment variables 6 | .env 7 | .env.* 8 | !.env.example 9 | # Build 10 | functions/**/*.js 11 | .vercel 12 | -------------------------------------------------------------------------------- /animations/unfade.ts: -------------------------------------------------------------------------------- 1 | import { keyframes } from "@pankod/refine-chakra-ui"; 2 | 3 | export default keyframes` 4 | 0% { 5 | opacity: 0; 6 | } 7 | 100% { 8 | opacity: 1; 9 | } 10 | `; 11 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /public/images/flags/de.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/ChakraNextImage.tsx: -------------------------------------------------------------------------------- 1 | import { chakra } from "@pankod/refine-chakra-ui"; 2 | import Image from "next/image"; 3 | 4 | export default chakra(Image, { 5 | shouldForwardProp: (prop) => 6 | ["width", "height", "src", "alt"].includes(prop), 7 | }); 8 | -------------------------------------------------------------------------------- /animations/rise.ts: -------------------------------------------------------------------------------- 1 | import { keyframes } from "@pankod/refine-chakra-ui"; 2 | 3 | export default keyframes` 4 | 0% { 5 | opacity: 0; 6 | transform: translateY(55px); 7 | } 8 | 100% { 9 | opacity: 1; 10 | transform: translateY(0px); 11 | } 12 | `; 13 | -------------------------------------------------------------------------------- /pages/project/[id]/roles.tsx: -------------------------------------------------------------------------------- 1 | import SideBarProject from "@components/SideBarProject"; 2 | import { Flex } from "@pankod/refine-chakra-ui"; 3 | 4 | const Roles = () => { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | }; 11 | 12 | export default Roles; 13 | -------------------------------------------------------------------------------- /animations/rise_reverse.ts: -------------------------------------------------------------------------------- 1 | import { keyframes } from "@pankod/refine-chakra-ui"; 2 | 3 | export default keyframes` 4 | 0% { 5 | opacity: 0; 6 | transform: translateY(-55px); 7 | height: 0vh; 8 | } 9 | 100% { 10 | opacity: 1; 11 | transform: translateY(0px); 12 | height: 100vh; 13 | } 14 | `; 15 | -------------------------------------------------------------------------------- /functions/new_invitation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-appwrite": "^8.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /functions/add_user_to_team/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-appwrite": "^8.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /functions/setup_workspace/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-appwrite": "^8.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/layout/title/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useRouterContext, TitleProps } from "@pankod/refine-core"; 3 | import { Link as ChakraLink } from "@pankod/refine-chakra-ui"; 4 | 5 | export const Title: React.FC = ({ collapsed }) => { 6 | const { Link } = useRouterContext(); 7 | 8 | return ; 9 | }; 10 | -------------------------------------------------------------------------------- /functions/change_username_to_email/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-appwrite": "^8.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /functions/setup_user_workspace/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-appwrite": "^8.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pages/login.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from "next/router"; 2 | import { useEffect } from "react"; 3 | import { account } from "src/utility"; 4 | 5 | const Login = () => { 6 | useEffect(() => { 7 | account.createOAuth2Session( 8 | "google", 9 | `${location.origin}/dashboard`, 10 | location.origin 11 | ); 12 | }, []); 13 | }; 14 | 15 | export default Login; 16 | -------------------------------------------------------------------------------- /src/components/Bold.tsx: -------------------------------------------------------------------------------- 1 | import { Nunito } from "@next/font/google"; 2 | import { chakra, Text, TextProps } from "@pankod/refine-chakra-ui"; 3 | 4 | const font = Nunito({ subsets: ["latin"], weight: "700" }); 5 | 6 | const Bold: React.FC = ({ children, ...props }) => { 7 | return ( 8 | 9 | {children} 10 | 11 | ); 12 | }; 13 | 14 | export default Bold; 15 | -------------------------------------------------------------------------------- /src/components/ExtraBold.tsx: -------------------------------------------------------------------------------- 1 | import { Nunito } from "@next/font/google"; 2 | import { Text, TextProps } from "@pankod/refine-chakra-ui"; 3 | 4 | const font = Nunito({ subsets: ["latin"], weight: "800" }); 5 | 6 | const ExtraBold: React.FC = ({ children, ...props }) => { 7 | return ( 8 | 9 | {children} 10 | 11 | ); 12 | }; 13 | 14 | export default ExtraBold; 15 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const { i18n } = require("./next-i18next.config"); 2 | 3 | module.exports = { 4 | i18n, 5 | experimental: { 6 | newNextLinkBehavior: true, 7 | }, 8 | images: { 9 | remotePatterns: [ 10 | { 11 | protocol: "https", 12 | hostname: "avatars.githubusercontent.com", 13 | port: "", 14 | pathname: "/**", 15 | }, 16 | ], 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /functions/push_notifications/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "moment": "^2.29.4", 14 | "node-appwrite": "^8.0.0" 15 | }, 16 | "devDependencies": { 17 | "@types/moment": "^2.13.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Html, Head, Main, NextScript } from "next/document"; 2 | import { refineTheme, ColorModeScript } from "@pankod/refine-chakra-ui"; 3 | 4 | export default function Document() { 5 | return ( 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /functions/upload_user_profile/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appwrite-function", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "googleapis": "^110.0.0", 14 | "needle": "^3.2.0", 15 | "node-appwrite": "^8.0.0" 16 | }, 17 | "devDependencies": { 18 | "@types/needle": "^3.2.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/utility/appwriteClient.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Account, 3 | Appwrite, 4 | Databases, 5 | Storage, 6 | Teams, 7 | } from "@pankod/refine-appwrite"; 8 | 9 | const APPWRITE_URL = "https://appwrite.kyeboard.me/v1"; 10 | const APPWRITE_PROJECT = "63df174eb4161f4803ca"; 11 | 12 | const appwriteClient = new Appwrite(); 13 | 14 | appwriteClient.setEndpoint(APPWRITE_URL).setProject(APPWRITE_PROJECT); 15 | const account = new Account(appwriteClient); 16 | const storage = new Storage(appwriteClient); 17 | const database = new Databases(appwriteClient); 18 | const teams = new Teams(appwriteClient); 19 | 20 | export { appwriteClient, account, storage, teams, database }; 21 | -------------------------------------------------------------------------------- /theme/chakra.ts: -------------------------------------------------------------------------------- 1 | import { extendTheme } from "@pankod/refine-chakra-ui"; 2 | 3 | const theme = extendTheme({ 4 | styles: { 5 | global: { 6 | body: { 7 | bg: "#E7E7F2", 8 | color: "#2E3440", 9 | }, 10 | }, 11 | }, 12 | initialColorMode: "light", 13 | useSystemColorMode: false, 14 | breakpoints: { 15 | // Nav Bar breakpoints 16 | nav_sm: "", 17 | 18 | // SideBar breakpoints 19 | sidebar_md: "1000px", 20 | 21 | sm: "800px", 22 | }, 23 | components: { 24 | Button: { 25 | defaultProps: { 26 | _hover: { bg: "#2E3440" }, 27 | }, 28 | }, 29 | }, 30 | }); 31 | 32 | export default theme; 33 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [kyeboard] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /public/images/flags/en.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/authProvider.ts: -------------------------------------------------------------------------------- 1 | import { AuthProvider } from "@pankod/refine-core"; 2 | 3 | import { account } from "./utility"; 4 | 5 | export const authProvider: AuthProvider = { 6 | login: async ({ email, password }) => { 7 | try { 8 | await account.createEmailSession(email, password); 9 | return Promise.resolve(); 10 | } catch (e) { 11 | return Promise.reject(); 12 | } 13 | }, 14 | logout: async () => { 15 | await account.deleteSession("current"); 16 | 17 | return "/"; 18 | }, 19 | checkError: () => Promise.resolve(), 20 | checkAuth: async () => { 21 | const session = await account.get(); 22 | 23 | if (session) { 24 | return Promise.resolve(); 25 | } 26 | 27 | return Promise.reject(); 28 | }, 29 | getPermissions: () => Promise.resolve(), 30 | getUserIdentity: async () => { 31 | const user = await account.get(); 32 | 33 | if (user) { 34 | return user; 35 | } 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 kyeboard 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/layout/layout/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { LayoutProps } from "@pankod/refine-core"; 3 | import { Box, useColorModeValue } from "@pankod/refine-chakra-ui"; 4 | 5 | import { Sider as DefaultSider } from "../sider"; 6 | import { Header as DefaultHeader } from "../header"; 7 | 8 | export const Layout: React.FC = ({ 9 | Sider, 10 | Header, 11 | Footer, 12 | OffLayoutArea, 13 | children, 14 | }) => { 15 | const SiderToRender = Sider ?? DefaultSider; 16 | const HeaderToRender = Header ?? DefaultHeader; 17 | 18 | const bg = useColorModeValue("gray.100", "gray.900"); 19 | 20 | return ( 21 | 22 | 23 | 30 | 31 | {children} 32 | {Footer &&