Skip to content

Instantly share code, notes, and snippets.

@alexesDev
Last active June 6, 2018 20:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexesDev/41a5e3ed1392715dadaff24c3317c0d4 to your computer and use it in GitHub Desktop.
Save alexesDev/41a5e3ed1392715dadaff24c3317c0d4 to your computer and use it in GitHub Desktop.

Шрифты

Внимательно смотреть на шрифт, обычно:

Шапка

На макетах нарисована кнопка назад в шапке, это не удачная идея, просто оставляем логотип как везде, кроме поиска и тп.

Авторизация

На части страниц проверять "авторизовал ли пользователь", если нет, то показывается страница входа/регистрации: /checkout нет авторизации, рендер signin /checkout?stab=signup, нет авторизации, рендер signup таба /checkout?stab=restore Т.е. любое действие по авторизации происходит поверх запрашиваемой страницы, пока авторизация не завершится.

Логика работы счетчика продукта

При нажатии на "купить" появляется счетчик с counterInit, при нажатии на +/- происходит сдвиг на counterStep, у части продуктов есть counterLimit ограничение. Счетчик должен висеть на каждом продукте пока он есть в корзине. Т.е. это будет smart компонент, который привязан к store. При клиеке купить в store падают все нужные значения для вычисления.

API

  • сделано на graphql https://myfresh.ru/graphql
  • для авторизации нужен заголовок Authorization: Bearer ${jwtToken}
  • токен авторизации отдаёт signin или signup мутация
  • для дебага запросов используйте любой graphiql клиент, к примеру https://chrome.google.com/webstore/detail/chromeiql/fkkiamalmpiidkljmicmjfbieiclmeij?hl=en
  • все записи возаращают уникальный id, его можно использовать в key. Реальный id из базы лежит в rid.

Страницы

Компоненты

// @flow
import format from 'utils/format';
type Data = {
priceType: string,
averageWeight: number,
priceQuantity: number,
volume: number,
weight: number,
averageWeightFrom: number,
averageWeightTo: number,
};
type Result = {
info?: string,
weight?: string,
base?: string,
};
export default (data: Data): Result => {
if (data.priceType === 'average-weight') {
return {
info: `Средний вес: ${format(data.averageWeight, 'kg')}`,
weight: `за ${format(data.priceQuantity, 'kg')}`,
base: format(data.averageWeight, 'kg'),
};
}
if (data.priceType === 'weight') {
return {
weight: `за ${format(data.priceQuantity, 'kg')}`,
base: format(data.priceQuantity, 'kg'),
};
}
if (data.priceType === 'piece') {
return {
weightLabel: format(1, 'pcs'),
base: format(1, 'pcs'),
};
}
if (data.priceType === 'piece-with-volume') {
return {
info: `Объем: ${format(data.volume, 'l')}`,
base: format(data.volume, 'l'),
};
}
if (data.priceType === 'piece-with-weight') {
return {
info: `Вес НЕТТО: ${format(data.weight, 'kg')}`,
base: format(data.weight, 'kg'),
};
}
if (data.priceType === 'piece-with-average-weight') {
return {
info: `Средний вес: ${format([data.averageWeightFrom, data.averageWeightTo], 'kg')}`,
base: format([data.averageWeightFrom, data.averageWeightTo], 'kg'),
};
}
return {};
};
const NBPS = '\xa0';
export const convert = (value: number, unit: string): [number, string] => {
if (unit === 'kg' && value < 1 && value.toFixed(1) !== '0.5') {
return [Math.floor(value * 1000), 'g'];
}
if (unit === 'l' && value < 1 && value.toFixed(2) !== '0.75' && value.toFixed(1) !== '0.5') {
return [Math.floor(value * 1000), 'ml'];
}
return [value, unit];
};
export const units = {
g: 'г',
ml: 'мл',
kg: 'кг',
l: 'л',
pcs: 'шт',
};
const format = (initValue: number | [number, number], initUnit: string): string => {
if (Array.isArray(initValue)) {
const values = initValue.filter(i => i);
if (values.length === 0) {
return '';
}
if (values.length === 1) {
return format(values[0], initUnit);
}
const [value1, unit1] = convert(values[0], initUnit);
if (unit1 === 'g') {
return `${value1}-${Math.floor(values[1] * 1000)} ${units[unit1]}`;
}
return `${value1}-${values[1]} ${units[initUnit]}`;
}
const [value, unit] = convert(initValue, initUnit);
return `${value}${NBPS}${units[unit] || unit}`;
};
export default format;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment