Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add component date field manipulation example #259

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions component-date-field-manipulation-app/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
36 changes: 36 additions & 0 deletions component-date-field-manipulation-app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
6 changes: 6 additions & 0 deletions component-date-field-manipulation-app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## Component Date Field Manipulation App

In this example, we are using the App SDK Form API to change another field's value based on the date selected in a field in the component level.

Keep in mind this is a **workaround** that introduces redundancy in your model, meaning that if you need to update these fields via the API, you would need to keep them in sync.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.form-group {
margin-bottom: 1.4rem;
}

.form-group label {
font-weight: 700;
display: block;
margin-bottom: 0.5em;
}
52 changes: 52 additions & 0 deletions component-date-field-manipulation-app/components/DateField.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { useFieldExtension, Wrapper } from "@graphcms/app-sdk-react";
import { useEffect, useState } from "react";

const DateField = () => {
const { value, onChange, form } = useFieldExtension();

useEffect(() => {
console.log("value:", value);
let unsubscribe: any;

form.subscribeToFieldState(
"release[date]",
(state) => {
console.log("release[date] value:", state.value);
onChange(state.value);
},
{
value: true,
}
).then((fieldUnsubscribe) => (unsubscribe = fieldUnsubscribe));

return () => {
unsubscribe?.();
};
}, [value]);

return (
<>
<div className="form-group">
<label>Release Date</label>
<input
type="date"
name="date"
id="date"
defaultValue={value}
value={value || ""}
disabled
/>
</div>
</>
);
};

const DateFieldUix = () => {
return (
<Wrapper>
<DateField />
</Wrapper>
);
};

export default DateFieldUix;
7 changes: 7 additions & 0 deletions component-date-field-manipulation-app/next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
}

module.exports = nextConfig
25 changes: 25 additions & 0 deletions component-date-field-manipulation-app/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "component-date-field-manipulation-app",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@graphcms/app-sdk-react": "^0.0.5",
"next": "12.2.5",
"react": "18.2.0",
"react-dom": "18.2.0"
},
"devDependencies": {
"@types/node": "18.7.6",
"@types/react": "18.0.17",
"@types/react-dom": "18.0.6",
"eslint": "8.22.0",
"eslint-config-next": "12.2.5",
"typescript": "4.7.4"
}
}
8 changes: 8 additions & 0 deletions component-date-field-manipulation-app/pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { AppProps } from "next/app";
import "../components/DateField.css";

function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
}

export default MyApp;
13 changes: 13 additions & 0 deletions component-date-field-manipulation-app/pages/api/hello.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from 'next'

type Data = {
name: string
}

export default function handler(
req: NextApiRequest,
res: NextApiResponse<Data>
) {
res.status(200).json({ name: 'John Doe' })
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { NextPage } from "next";
import DateFieldUix from "../components/DateField";

const Home: NextPage = () => {
return <DateFieldUix />;
};

export default Home;
25 changes: 25 additions & 0 deletions component-date-field-manipulation-app/pages/setup.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { useApp, Wrapper } from "@graphcms/app-sdk-react";

const Install = () => {
const { updateInstallation } = useApp();
return (
<>
<h3>Gamescom App</h3>
<button
onClick={() => {
updateInstallation({ status: "COMPLETED" });
}}
>
Save Settings
</button>
</>
);
};

export default function SetupPage() {
return (
<Wrapper>
<Install />
</Wrapper>
);
}
129 changes: 129 additions & 0 deletions component-date-field-manipulation-app/styles/Home.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
.container {
padding: 0 2rem;
}

.main {
min-height: 100vh;
padding: 4rem 0;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}

.footer {
display: flex;
flex: 1;
padding: 2rem 0;
border-top: 1px solid #eaeaea;
justify-content: center;
align-items: center;
}

.footer a {
display: flex;
justify-content: center;
align-items: center;
flex-grow: 1;
}

.title a {
color: #0070f3;
text-decoration: none;
}

.title a:hover,
.title a:focus,
.title a:active {
text-decoration: underline;
}

.title {
margin: 0;
line-height: 1.15;
font-size: 4rem;
}

.title,
.description {
text-align: center;
}

.description {
margin: 4rem 0;
line-height: 1.5;
font-size: 1.5rem;
}

.code {
background: #fafafa;
border-radius: 5px;
padding: 0.75rem;
font-size: 1.1rem;
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
Bitstream Vera Sans Mono, Courier New, monospace;
}

.grid {
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
max-width: 800px;
}

.card {
margin: 1rem;
padding: 1.5rem;
text-align: left;
color: inherit;
text-decoration: none;
border: 1px solid #eaeaea;
border-radius: 10px;
transition: color 0.15s ease, border-color 0.15s ease;
max-width: 300px;
}

.card:hover,
.card:focus,
.card:active {
color: #0070f3;
border-color: #0070f3;
}

.card h2 {
margin: 0 0 1rem 0;
font-size: 1.5rem;
}

.card p {
margin: 0;
font-size: 1.25rem;
line-height: 1.5;
}

.logo {
height: 1em;
margin-left: 0.5rem;
}

@media (max-width: 600px) {
.grid {
width: 100%;
flex-direction: column;
}
}

@media (prefers-color-scheme: dark) {
.card,
.footer {
border-color: #222;
}
.code {
background: #111;
}
.logo img {
filter: invert(1);
}
}
26 changes: 26 additions & 0 deletions component-date-field-manipulation-app/styles/globals.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
html,
body {
padding: 0;
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}

a {
color: inherit;
text-decoration: none;
}

* {
box-sizing: border-box;
}

@media (prefers-color-scheme: dark) {
html {
color-scheme: dark;
}
body {
color: white;
background: black;
}
}
20 changes: 20 additions & 0 deletions component-date-field-manipulation-app/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
Loading